CPU가 하나라면 Running 상태의 프로세스는 하나이지만, Ready 상태의 프로세스는 여러개 있을 수 있다.
이러한 프로세스들을 잘 줄을 세우기 위해서 'Ready Queue'(=Ready List)를 사용한다. (큐 사용)
CPU가 비게 되면, 스케줄러가 Ready Queue에서 프로세스를 하나 고르게 된다. First In First Out이 아니라, Priority Queue이기 때문에 높은 우선순위의 프로세스를 뽑아간다.
Asleep 상태에서도 queue가 있는데, 이를 Block List(Block Queue, I/O Queue) 라고 한다.
I/O Device의 종류가 매우 많기 때문에 키보드, 네트워크 등등 다양한 원인으로 alseep 한다.
그 원인에 따라서- R1 원인에 대한 프로세스의 큐, R2에 대한 큐 등등이 있게 된다.
I/O Device에서 시그널이 들어오면, R2에 대한 시그널일 경우 R2에 해당하는 큐의 프로세스들만 깨우게 된다.
(1) CPU로 인터럽트가 오면, 일단 프로세스의 실행을 중지시킨다. 프로세스의 cpu 레지스터 값을 전부 빼 내어서 PCB 영역에 저장한다.
(2) 그 후 커널의 인터럽트 핸들러가 cpu에 들어와서 인터럽트 핸들링을 한다.
(3) 인터럽트 핸들러가 제일 먼저 인터럽트가 어디에서 왔는지 Interrupt 소스를 확인한다. (하드디스크, time, 마우스 등) 그리고 인터럽트의 원인을 파악한다.
(4) 인터럽트 서비스 결정을 내린다. 현재 프로세스가 더 중요한지, 인터럽트 이벤트가 더 중요한지 판단하고 인터럽트를 서비스 할지 말지 결정을 내린다.
(5) 인터럽트 서비스를 결정하면 Interrupt Service Routine을 호출한다. 그렇게 인터럽트 서비스를 하게 된다.
(6) 인터럽트 서비스가 끝나면 바로 이전에 중지한 프로세스를 다시 실행하는 것이 아니라, 스케줄링을 진행한다. 인터럽트는 time quantum에 대한 것일수도 있기 때문에, 스케줄링을 해서 바로 실행할 프로세스를 선택하고, 해당 pcb로부터 cpu 레지스터값을 가져오는 context restoring을 한다. 이 때 이렇게 프로세스가 바뀌는 것을 'context switching(process switching)'이라고 한다.
Context is a Set of Information related to a process.
프로세스가 cpu를 내놓고 나와야 할 때 Context Saving을 해야 한다.
다시 cpu로 레지스터값을 복원해 가져가는 일이다.
한 프로세스의 context를 저장하고 다른 프로세스의 context를 복원하는 일.
CPU에서 Context Saving부터 인터럽트 서비스 루틴, 스케줄링, Context Restoring 등까지 커널이 개입하는 부분의 switch 시간은 최소화되어야 한다.