프로세스(Process)
: 돌고 있는 프로그램 Running
: CPU를 받아서 돌고 있는 상태Ready
: time slice가 끝났거나 프로세스 간의 우선 순위에서 밀려서 CPU를 받을 때까지 기다리고 있는 상태Blocked
: time slice가 다 되기 전에 CPU가 필요 없기 때문에 내어놓은 상태. => 블락 상태의 프로세스가 많다는 것은 CPU 스케쥴링을 효율적으로 해서 시스템이 전체적으로 바쁘게 돌아가고 있다는 의미I/O
가 요청되었을 때 그 I/O가 끝날 때까지lock
(mutex)를 기다리는 상황message
를 기다리는 상황shared resource
(메모리의 page, printer 등..)를 차지하기 위해 기다리는 상황Run Queue
)에 서있어서는 안됨.(I/O request queue에는 있을 수 있음)Point! 🧩
블락 상태가 있기 때문에 CPU/IO overlap이 가능한 것
Scheduling Queue
Run Queue: Ready, Run 상태를 통틀어서 Run 상태라고도 부르고, Ready 상태의 프로세스들이 기다리는 곳이 Run Queue이다. 그런데 실제 구현을 살펴보면 이 Run Queue에는 프로세스가 아닌 PCB가 줄 서있다. 즉 Run Queue는 PCB의 링크드 리스트이다.(Sleep Queue도 동일)
Sleep Queue: Blocked 상태의 프로세스들이 기다리는 곳
Disk I/O Queue: Disk I/O를 하기 위해 기다리는 곳
유저 모드에서 돌고 있는 프로세스에서 standard I/O library function
을 call하면 이 function은 내부적으로 system call
(read() 등)을 하고, 커널 속으로 trap하게 된다. 그리고 해당 프로세스는 I/O가 끝날 때까지 CPU를 내놓고 blocked
상태가 되며, I/O가 끝나면 ready
상태가 되어 scheduling queue
에서 차례를 기다린다. 그러다 scheduled되면 커널모드에서 유저모드로 돌아간다.(이때 blocked 상태의 프로세스를 다시 ready로 깨워주는 것은 interrupt handler이다.)
다음 경우는 유저 모드에서 프로세스가 돌고 있는데 I/O가 끝났다는 interrupt
가 들어온 경우이다. interrupt가 들어오면 CPU는 I/O가 끝났을 때 해야할 작업들을 한 후(데이터 전달, 디바이스 컨트롤러에게 새로운 I/O 시작 명령 등) interrupt handler
로 가서 다른 급한 작업이 있는지 확인 후 원래의 프로세스를 마저 진행한다.