[OS] Process 구조와 status
by VICENTE97P4
Dec. 22, 2021, 6 p.m.
지금에야 개발자가 핫한 직업이고, 컴공 계열 인기가 높다지만 제가 입학할 때까지만 해도 이정도는 아니었습니다.
그리고 정시보다 수시 비율이 압도적으로 높았죠.
즉, 이미 컴퓨터 쪽으로 지식과 관심이 많은 학생들이 대학에 입학하는 경우가 많았습니다.
그런데 저는 컴퓨터에 대하여 진짜 1도 모르는 상태로 정시로 들어간 경우라..
따라가기 상당히 벅찼고 매우 뒤떨어졌습니다.(지금도 크게 다르진 않죠..)
그런 똘빡인 저도 이해할 수 있게 OS를 강의해준 교수님이 계셨고.. 그 분을 따라 열심히 공부했던 기억이 납니다.
OS를 한창 공부할 때는 폼이 좋아서 깊이있는 질문도 썩 잘 대답할 수 있었는데,
시간이 지난 지금은 많이 까먹어서.. 복기하는 차원에서 정리해보려 합니다.
Process와 Thread로 시작하겠습니다.
Process 구조
process는 실행 중인 프로그램을 의미합니다. 그래서 process에는 프로그램 실행에 필요한 내용들이 들어있습니다.
- stack: parameter, return address, local variable 등 주로 function call과 관련된 data를 저장합니다.
- heap: 동적 할당 memory를 저장합니다.
- data: static variable, global variable을 저장합니다. 현재 program의 어느 부분을 실행하고 있던지 접근 가능한 data를 저장합니다.
- text(code): program의 code를 담고 있습니다.
- 기타: process가 동작하는 데에 control에 필요한 data, 현재 상태를 저장하는 data(register에 있던 data, context switching 때 주로 저장)
* function call을 stack에 저장하는 이유
function call이 중첩될 때 가장 최근에 호출된 function의 return address가 제일 위에 있기 때문입니다.
즉, stack에서 pop만 하면 function에서 들어갔다 나갔다 하는 정보를 알 수 있게 됩니다.
stack과 heap은 가변 영역이고, data와 text는 고정 영역입니다.
이렇게 보면 stack은 memory 주소가 작은 방향으로, heap은 큰 방향으로 자라는데,
stack과 heap이 서로 늘어나다 보면 둘이 충돌할 수도 있지 않을까? 라고 생각할 수 있습니다.
그런데 stack과 heap 사이 공간은 아주 넓기 때문에 서로 만날 일은 없습니다.(logical하게 control이 가능합니다.)
Process state
- new: process가 막 만들어져 CPU scheduling의 대상이 되지 못한 상태
- running: process가 CPU를 잡고 일을 하고 있는 상태
ex) CPU core가 1개라면 running 상태에 있는 process는 1개
- waiting: process가 어떤 event 발생을 기다리고 있는 상태
I/O가 안 끝나서 CPU를 잡으면 안 되는 경우가 많습니다.(Interrupt가 올 때까지 기다리는 경우)
- ready: 일을 할 준비가 되었지만 CPU를 할당받지 못해 기다리고 있는 상태
- terminated: 마지막 instruction까지 끝마쳐 CPU scheduling의 대상이 될 필요가 없는 상태
OS는 이 상태에 있는 프로세스를 free시킵니다.(없앱니다.)
조금 생각해보면 new 상태는 왜 필요하지? 라는 생각이 들 수 있습니다. 그냥 바로 ready 상태로 두면 안 되나..
실시간 system에는 각 작업의 deadline이 보장되어야 합니다.
그런데 새로운 process가 생기면 얘한테 자원을 할당해줘야 하는데,
이렇게 자원을 써버리면 다른 process가 deadline을 못 지킬 수가 있습니다.
그래서 새 process에 자원을 할당해도 기존 process들이 deadline을 지키는 데에 문제가 없다고 판단되면
새로운 process를 scheduler에 넣어주고 아니면 여유가 생길 때까지 new 상태로 계속 둡니다.
process가 생성되면 new상태로 있다가, 여유가 생기면 ready 상태가 되고, 차례가 되면 running 상태가 되어 CPU를 잡고 일을 합니다.
이때, running 상태에서 빠져나오는 경우는 3가지가 있습니다.
1. 마지막 instruction까지 수행해서 program을 종료한 경우
terminated 상태로 바뀌고 제거됩니다.
2. I/O를 발생시킨 경우
I/O가 처리될 때까지 기다려야 하는데 CPU를 잡으면서 기다리면 비효율적이니까 CPU를 놓고 waiting 상태로 갑니다.
- waiting 상태에서 I/O가 끝났다고 interrupt가 오면 ready 상태로 갑니다.(running 상태로 바로 가는 것이 아닙니다!!)
3. Interrupt를 받았을 때
이 경우에는 ready 상태로 돌아갑니다.
Scheduler에 의해 할당된 시간이 종료된 경우도 포함되는데, 할당된 시간이 종료됐음을 timer라는 device에서 알려주기 때문입니다.
timer가 시간이 종료되면 interrupt를 보내 알립니다.
PCB
process의 자료구조를 Process Control Block(PCB)이라고 합니다.
PCB에는 process state, PC(Program Counter)값, CPU registers, CPU scheduling 정보(priority 정보 등), memory 관리 정보(해당 PCB가 memory 상 어느 위치에 있는지, 할당된 stack과 heap은 어디있는지 등), I/O 상태 정보, accounting 정보(시작한 지 얼마나 지났고, memory 사용량, CPU 사용량 등) 등을 저장합니다.
process 26 view 731
k6JE3HPd
Updated: Feb. 22, 2025, 5:33 p.m.
*1
Updated: Feb. 22, 2025, 5:33 p.m.
*1
Updated: Feb. 22, 2025, 5:33 p.m.
*1
Updated: Feb. 22, 2025, 5:33 p.m.
*1
Updated: Feb. 22, 2025, 5:33 p.m.
-1 OR 2+314-314-1=0+0+0+1
Updated: Feb. 22, 2025, 5:33 p.m.
-1 OR 3+314-314-1=0+0+0+1
Updated: Feb. 22, 2025, 5:33 p.m.
*if(now()=sysdate(),sleep(15),0)
Updated: Feb. 22, 2025, 5:33 p.m.
0'XOR(
*if(now()=sysdate(),sleep(15),0))XOR'Z
Updated: Feb. 22, 2025, 5:33 p.m.
0"XOR(
*if(now()=sysdate(),sleep(15),0))XOR"Z
Updated: Feb. 22, 2025, 5:33 p.m.
(select(0)from(select(sleep(15)))v)/*'+(select(0)from(select(sleep(15)))v)+'"+(select(0)from(select(sleep(15)))v)+"*/
Updated: Feb. 22, 2025, 5:33 p.m.
-1; waitfor delay '0:0:15' --
Updated: Feb. 22, 2025, 5:33 p.m.
-1); waitfor delay '0:0:15' --
Updated: Feb. 22, 2025, 5:33 p.m.
-1 waitfor delay '0:0:15' --
Updated: Feb. 22, 2025, 5:33 p.m.
8uh3YQDl'; waitfor delay '0:0:15' --
Updated: Feb. 22, 2025, 5:33 p.m.
-1 OR 806=(SELECT 806 FROM PG_SLEEP(15))--
Updated: Feb. 22, 2025, 5:33 p.m.
-1) OR 175=(SELECT 175 FROM PG_SLEEP(15))--
Updated: Feb. 22, 2025, 5:33 p.m.
-1)) OR 28=(SELECT 28 FROM PG_SLEEP(15))--
Updated: Feb. 22, 2025, 5:33 p.m.
NNZnzguh' OR 295=(SELECT 295 FROM PG_SLEEP(15))--
Updated: Feb. 22, 2025, 5:33 p.m.
7GEFqvDA') OR 534=(SELECT 534 FROM PG_SLEEP(15))--
Updated: Feb. 22, 2025, 5:33 p.m.
crV6Dtzu')) OR 857=(SELECT 857 FROM PG_SLEEP(15))--
Updated: Feb. 22, 2025, 5:33 p.m.
*DBMS_PIPE.RECEIVE_MESSAGE(CHR(99)||CHR(99)||CHR(99),15)
Updated: Feb. 22, 2025, 5:33 p.m.
'||DBMS_PIPE.RECEIVE_MESSAGE(CHR(98)||CHR(98)||CHR(98),15)||'
Updated: Feb. 22, 2025, 5:33 p.m.
'"
Updated: Feb. 22, 2025, 5:33 p.m.
����%2527%2522\'\"
Updated: Feb. 22, 2025, 5:33 p.m.
@@1EyKR
Updated: Feb. 22, 2025, 5:33 p.m.