scheduling Alogrithm의 목표는 다음과 같다.
NO starvation
starvation: queue에서 더큰 우선순위를 가지는 process들이 계속 실행되다가 어떤 process의 차례가 오지않는 현상
Fairness: 각 process에게 CPU를 공평하게 공유하는 것
Balance: 시스템의 모든 파트가 바쁘게 움직일 수 있도록 하는것
어느 하나에만 작업량이 몰려 있다면, 처리 속도도 느리고 비효율 적이다.
✍️FCFS(Fisrt Come First Served)
job이 도착한 순서대로 scheduled
일반적으로 non-preemptive
preemtive: 중간에 자리를 뺏김
job이 동등하게 취급됨: no starvation
문제: 금방끝나는 job이 앞에 오래걸리는 job들 때문에 오래 기다리게 되어 Turnaround가 높아진다.
CPU만 할일이 많아지고 scheduler는 할일이 없다.
response time이 짧은것이 앞에 있는게 평균 turnaround 시간이 훨씬 짧다.
✍️Non-preemptive scheduling
✍️Preemptive scheduling
✍️ problem
예를들어 P1이먼저 들어와서 실행되고 있었고, P2,P3가 들어왔다.
그러면, P1이 다 끝날때까지 기다렸다가 p2와 p3중 실행시간이 더짧은 p2를 먼저 실행시킨다.
낮은 prioriy job들은 높은 priority job들이 계속 할당된다면 실행되지 못할지도 모른다.
✍️ 원형 FIFO queue처럼 다뤄진다.
✍️ 모든 job들은 time slice가 주어진다.(or scheduing quantum)
✍️ time slice 시간동안 process가 실행되고 맨뒤로 이동, 다음 process 실행
예를들어, quantum이 4라고 하자.
각 process들이 4만큼만 실행하고 있다.
그리고, 남은 시간은 맨뒤로 줄서서 4만큼씩 다시 실행한다.
✍️ preemptive
✍️ No starvation
✍️ resopnse time 향상 (time sharing에 좋다.)
✍️ waiting time은 quantum에 따라 다르다.
✍️ 각 job들은 priority가 있다.
✍️ CPU는 높은 priority를 가진 job을 할당받는다.
✍️starvation problem
process가 age를 먹으면 priority를 높인다.
✍️priority inversion problem
여러 작업에서 동시에 사용할 수없는 resource가 있다고 가정하자.
가장 낮은 10 priority를 가진 thread(data gethering task)가 실행하면서 lock을 걸어놓고 메모리 접근을 막고 write하고 있었다. 그런데 높은 priority를 가진 30 priority의 thread(Bus task)가 들어와서 우선순위에 따라 bus task가 실행되었다. bus task에서 resource에 접근하려고 봤더니 lock이 걸려있어서 interrupt가 발생하였고, data gathering task가 lock을 release할때까지 기다려야 되는 상황이 되었다. 그래서 bus task는 block 되었다.
다시 data gathering task를 진행하다 보니까 중간 priority 20을 가지는 process가 들어와서 실행되었다.(priority 30은 block 상태, 10,20만 ready queue에 있어서 우선순위에 따라 20이 실행됨)
원래는 가장 높은 priority의 task가 먼저 실행이 끝나야 하는데 중간 priority task가 가로채버린 것이다.
lock이란? 어떤 thread가 공유자원을 사용하고 있을때 다른 thread가 공유자원에 접근하지 못하게 막는것.
✍️Priority Inversion solution
높은 priority가 resource를 잡으려했는데 row priority가 잡고있다면 순간적으로 row priority의 priority를 boosting 시켜준다. 그래서 중간에 다른 thread가 와도 밀어내질 못한다.
결과적으로, high priority와 lowr priority가 high priority로 같아진다.
resource를 해제하면 다시 원래 상태로 돌아감.
- 낮은 priority가 resource를 잡는다고 boosting 시켜주지는 않기 때문에 프로그램 성능이 낮아지지는 않는다.
낮은 priority thread의 priority는 resource가 할당되면 즉시 증가한다.
어차피 빠르게 잡고 놔주면 되므로
priority ceiling 값은 미리 결정 되어야만 한다.
구현하기는 쉽지만, 리소스를 잡을때마다 priority boosting을 시켜주면 프로그램 성능이 낮아질 수 밖에 없다.