CPU의 사용률을 극대화를 하기 위해서 사용.

Read/Write file -> CPU burst( running )
wait for I/O -> I/O burst( waiting,ready )
대다수 I/O burst가 더 많다.
ready상태 프로세스 중 누구한테 CPU를 할당할지가 핵심!
FIFO Queue
Priority Queue( 가장 우선순위 높은 것부터 처리)
Preemptive -> 쫓아낼 수 있음( 강제성 )
스케줄러가 쫓아낼 수 있음
Non-preemptive -> 쫓아낼 수 없음(자발적으로 나옴)
자발적으로 나올 때까지 terminate or switch가 불가능하다.
running -> waiting
running -> ready
waiting -> ready
process terminate
1,4 -> 비선점형(자발적)
2,3 -> 선점형(강제성)이 효율이 더 좋음.
Context switch를 해주는 모듈
( process한테 cpu를 할당. )
process의 context switch
user mode로 switch
user program을 적절한 위치로 resume
스케줄러는 프로세스 선택을 하고, 실제 switch는 dispatcher가 한다.

dispatch latency = 기존 Process는 P0
는 save하고, P1을 복구하는데 걸리는 시간
( stop one process and start another running )
vm stat 1 3 // -> 1s동안 3번 보여주기
cat /proc/1/status // -> 해당 프로세스의 context switch를 확인할 수 있다.
CPU 사용률
Throughput(처리량) : 단위 시간당 완료되는 프로세스 수
Turnaroung time : process의 실행 ~ 종료까지 걸리는 시간 (1)
Waiting time : ready queue에서 대기 시간을 최소화 시키자 (2)
Response time : 응답시간을 최소화시키자(UI)
ready Queue 프로세스 중 누구한테 할당???


작업 순서 및 CPU burst time에 따라서 waiting time이 달라지고,
비선점형이다.( 최적화가 필요 )
shortest-"next-CPU-burst-first" scheduling
next CPU burst가 가장 작은 것부터 처리

이렇게 하면, 처리시간이 긴 프로세스는 작업 못 끝내는 것 아닌가?