CPU scheduling은 멀티프로그래밍으로 CPU 활용을 극대화 하기 위해서 필요하다.
CPU burst와 I/O burst로 이루어진 cycle을 scheduling한다.
🍸 MS-DOS같은 단일 프로세스 OS에서는 CPU scheduling이 필요없다.
- CPU burst가 있고 그 뒤에 I/O burst가 발생한다.
- 이때, CUP는 해당 데이터가 메모리에 들어올 때까지 I/O를 기다린다.
🍫 프로세스가 I/O를 발생시킨다.
- 이 기다리는 시간동안, 데이터나 다른 routine을 실행시켜 CPU가 최대한 시간당 많은 작업을 할 수 있게끔 한다.
- 대부분의 프로세스는 CPU를 짧은 시간안에 사용한다.
CPU Scheduler (Short Term Scheduler)
- 메모리안의 프로세스 중 하나를 선택해 CPU를 사용하게 한다.
- 각 프로세스는 CPU를 non-preemptive(비선점)하거나 preemptive(선점)한다.
- non-preemptive 하면 작업을 모두 수행하고 자발적으로 CPU를 내준다.
🍕 I/O, 공유자원을 요청할때 running state에서 waiting state가 되는 경우와 프로세스가 종료될 때 이렇다.
- preemtive 하면 작업을 수행하는 도중이라도, 강제로 CPU를 내주게 된다. (비자발적)
🍲 quantum이 끝나고 running state에서 ready state가 되는 경우나 I/O작업 후 데이터를 받고 waiting에서 ready가 되는 경우가 그렇다.
🌻 non-preemptive한 경우는 문제가 되지 않으나, preemtive한 경우에 문제가 발생할 수 있다. 🌼
- CPU를 사용하던 프로세스가 미처 다 데이터를 수정하기 전에 프로세스가 강제로 CPU를 내주게 되고 다른 프로세스가 이 데이터를 read하면, 데이터에 일관성을 해칠 수 있다.
- 만약 kernel mode에서 중요한 data structure를 수정할때 위와 같은 상황이 발생하면 일관성이 깨지기 때문에 대부분의 kernel은 non-preemptive하다.
- 실시간으로 큰 overhead가 발생하고(deadline) 성능이 저하된다면, preemtive가 유리하다. 사용자의 프로세스가 그렇다.
- 중요한 OS 작업을 하는 도중에 interrupts가 발생하면 중간 결과 유실 가능성이 있는 등의 문제가 생길 수 있다.
따라서, interrupt가 들어오기 전에 다른 interrupt를 못받도록 disable하고 모두 처리가 끝난 후에 빠져나와 다시 받을 수 있게 inable한다.
Dispatcher
CPU scheduler의 한 부분으로 module이다.
context를(PCB에 저장된 내용)을 바꾸고 user mode로 바꾼다.
사용자 프로그램을 재시작할 때 return address로 이동시킨다.
- dispatcher가 작업을 하는데 걸리는 시간은 짧을수록 좋다.
왜나하면, dispatcher는 사용자의 일을 하는 것이 아니기 때문이다.
- 좋은 시스템은 사용자의 프로그램을 빠르게 실행한다. (kernel overhead가 적게 일어난다.)
- 내줘야하는 프로세스의 PCB를 메모리에 저장하고선택된 프로세스의 PCB를 CPU register에서 불러온다.
좋은 CPU Scheduling
- CPU 이용률과 throughput(단위 시간당 처리하는 프로세스 갯수)가 많을 수록 좋다.
- 첫 번째 response, output이 나타날 때 까지 걸리는 시간을 짧아야 좋다.
- turnaround time(프로세스가 시작해서 끝날 때 까지의 시간)과 waiting time(프로세스가 ready queue에서 기다리는 시간)은 짧으면 좋다.