OS第三次讀書會
2017/05/04
TA 鄭人瑋
Ch5 排程(Scheduling)
2
3
Short-Term
Scheduler
Ready Queue CPU
挑選Process載入CPU
排程的用處:
• CPU utilization ↓:盡可能讓CPU隨時保持忙碌
• Throughput↑:增加單位時間內完成的process
• Turnaround time↓:減少執行一個process的總時間
• Waiting time↓:減少process擱置在Ready Queue的時間
• Response time↓:減少process題出要求至回應的所需時間
排程基本上分成兩大類…
• non-preemptive scheduling
a) process取得CPU主控權後一定會做好做滿才離開
b) 對所有的process公平,Response time可以預期,但average
waiting time比較高
c) e.g. FCFS、non-preemptive SJF、RR、non-preemptive priority
scheduling
• preemptive scheduling
a) CPU控制權允許較高優先權的process先做(可能會被中斷)
b) 即時/交談系統適用,但可能會造成starvation、context switch 變多
c) e.g. preemptive SJF、priority scheduling
4
First Come First Serve (FCFS)
• 先來的先做,最直覺的做法,但很有可能會發生Convey effect
• Convey effect (護衛效應):長的CPU burst process都擠在前面
先做,導致average waiting time變長。
5
Priority Scheduling
• 分配每個process一個編號,編號越前面者越優先做
• Aging:為了避免starvation產生,process待在ready queue越
久,priority就越前面,確保每個process都能使用CPU。
6
Shortest Job First (SJF)
• 預估process burst的時間,選擇當前讓burst time最小的先做
• preemptive SJF又稱為shortest-remaining-time-first
• 屬於Optimal scheduling,會有starvation發生→使用priority
aging解決
7
Round Robin (RR)
• 當前每個process都分配一個可執行的時間(q)輪流做
• q越大,演算法越接就FCFS
• q越小,需要考慮context switch 所帶來的巨大花費
8
範例練習(2010考題)
Process ID Next CPU Burst Length Priority Arrival Time
P1 10 1 0
P2 7 2 2
P3 5 4 3
P4 8 3 6
9
FCFS(1/4)
10
Process
ID
Next
CPU
Burst
Length
Priority
Arrival
Time
P1 10 1 0
P2 7 2 2
P3 5 4 3
P4 8 3 6
P1
0 10
(0+10)
FCFS(2/4)
11
Process
ID
Next
CPU
Burst
Length
Priority
Arrival
Time
P1 10 1 0
P2 7 2 2
P3 5 4 3
P4 8 3 6
P1
0 10
P2
17
(0+10) (10+7)
FCFS(3/4)
12
Process
ID
Next
CPU
Burst
Length
Priority
Arrival
Time
P1 10 1 0
P2 7 2 2
P3 5 4 3
P4 8 3 6
P1
0 10
P2
17
(0+10) (10+7)
P3
22
(17+5)
FCFS(4/4)
13
Process
ID
Next
CPU
Burst
Length
Priority
Arrival
Time
P1 10 1 0
P2 7 2 2
P3 5 4 3
P4 8 3 6
P1
0 10
P2
17
(0+10) (10+7)
P3
22
(17+5)
P4
30
(22+8)
Average Waiting Time
= [0+(10-2)+(17-3)+(22-6)]/4
=38/4=9.5
Preemptive SJF(1/8)
14
Process
ID
Next
CPU
Burst
Length
Priority
Arrival
Time
P1 10 1 0
P2 7 2 2
P3 5 4 3
P4 8 3 6
P1
0 2
(0+2)
P2到達
考慮當前arrival time所有process burst time
當前Process:P1
Preemptive SJF(2/8)
15
Process
ID
Next
CPU
Burst
Length
Priority
Arrival
Time
P1 8 1 0
P2 7 2 2
P3 5 4 3
P4 8 3 6
P1
0 2
(0+2)
P2到達
當前Process:P1、P2
P1 burst time:10-2=8
P1:8>P2:7→輪到P2做
P2
3
(2+1)
P3到達
Preemptive SJF(3/8)
16
Process
ID
Next
CPU
Burst
Length
Priority
Arrival
Time
P1 8 1 0
P2 6 2 2
P3 5 4 3
P4 8 3 6
P1
0 2
(0+2)
P2到達
當前Process:P1、P2、P3
P2 burst time:7-1=6
P1:8>P2:6>P3:5→輪到P3做
P2
3
(2+1)
P3到達
P3
P4到達
6
(3+3)
Preemptive SJF(4/8)
17
Process
ID
Next
CPU
Burst
Length
Priority
Arrival
Time
P1 8 1 0
P2 6 2 2
P3 2 4 3
P4 8 3 6
P1
0 2
(0+2)
P2到達
當前Process:P1、P2、P3、P4
P3 burst time:5-3=2
P1:8= P4:8>P2:6>P3:2→輪到P3做
P2
3
(2+1)
P3到達
P3
P4到達
6
(3+3)
P3
8
(6+2)
P3結束
Preemptive SJF(5/8)
18
Process
ID
Next
CPU
Burst
Length
Priority
Arrival
Time
P1 8 1 0
P2 6 2 2
P3 0 4 3
P4 8 3 6
P1
0 2
(0+2)
P2到達
當前Process:P1、P2、P4
P3 burst time:2-2=0
P1:8= P4:8>P2:6→輪到P2做
P2
3
(2+1)
P3到達
P3
P4到達
6
(3+3)
P3
8
(6+2)
P3結束
P2
14
(8+6)
P2結束
Preemptive SJF(6/8)
19
Process
ID
Next
CPU
Burst
Length
Priority
Arrival
Time
P1 8 1 0
P2 0 2 2
P3 0 4 3
P4 8 3 6
P1
0 2
(0+2)
P2到達
當前Process:P1、P4
P2 burst time:6-6=0
P1:8= P4:8→兩者取其一來做(本次選P1)
P2
3
(2+1)
P3到達
P3
P4到達
6
(3+3)
P3
8
(6+2)
P3結束
P2
14
(8+6)
P2結束
P1
22
(14+8)
P1結束
Preemptive SJF(7/8)
20
Process
ID
Next
CPU
Burst
Length
Priority
Arrival
Time
P1 0 1 0
P2 0 2 2
P3 0 4 3
P4 8 3 6
P1
0 2
(0+2)
P2到達
當前Process:P4
P1 burst time:8-8=0
P2
3
(2+1)
P3到達
P3
P4到達
6
(3+3)
P3
8
(6+2)
P3結束
P2
14
(8+6)
P2結束
P1
22
(14+8)
P1結束
P4
30
(22+8)
P4結束
Preemptive SJF(8/8)
21
Process
ID
Next
CPU
Burst
Length
Priority
Arrival
Time
P1 0 1 0
P2 0 2 2
P3 0 4 3
P4 0 3 6
P1
0 2
(0+2)
P2到達
P4 burst time:8-8=0
P2
3
(2+1)
P3到達
P3
P4到達
6
(3+3)
P3
8
(6+2)
P3結束
P2
14
(8+6)
P2結束
P1
22
(14+8)
P1結束
P4
30
(22+8)
P4結束
Average Waiting Time
= [(0+12)+(0+5)+0+16]/4
=33/4=8.25
Non-preemptive Priority(1/5)
22
Process
ID
Next
CPU
Burst
Length
Priority
Arrival
Time
P1 10 1 0
P2 7 2 2
P3 5 4 3
P4 8 3 6
考慮當前arrival time所有priority
當前Process:P1
P1因為priority最高所以可以一直做到完
P1
0 2
P2到達
P1
3
P3到達
P1
P4到達
6
P1
10
(0+10)
P1結束
Non-preemptive Priority(2/5)
23
Process
ID
Next
CPU
Burst
Length
Priority
Arrival
Time
P1 0 1 0
P2 7 2 2
P3 5 4 3
P4 8 3 6
P1 burst time:10-10=0
當前Process:P2、P3、P4
P2的priority較前面故讓P2先做
P1
0 2
P2到達
P1
3
P3到達
P1
P4到達
6
P1
10
(0+10)
P1結束
P2
17
(10+7)
P2結束
Non-preemptive Priority(3/5)
24
Process
ID
Next
CPU
Burst
Length
Priority
Arrival
Time
P1 0 1 0
P2 0 2 2
P3 5 4 3
P4 8 3 6
P2 burst time:7-7=0
當前Process:P3、P4
P4的priority較前面故讓P4先做
P1
0 2
P2到達
P1
3
P3到達
P1
P4到達
6
P1
10
(0+10)
P1結束
P2
17
(10+7)
P2結束
P4
P4結束
25
(17+8)
Non-preemptive Priority(4/5)
25
Process
ID
Next
CPU
Burst
Length
Priority
Arrival
Time
P1 0 1 0
P2 0 2 2
P3 5 4 3
P4 0 3 6
P4 burst time:8-8=0
當前Process:P3
P1
0 2
P2到達
P1
3
P3到達
P1
P4到達
6
P1
10
(0+10)
P1結束
P2
17
(10+7)
P2結束
P4
P4結束
25
(17+8)
P3
30
(25+5)
P3結束
Non-preemptive Priority(5/5)
26
Process
ID
Next
CPU
Burst
Length
Priority
Arrival
Time
P1 0 1 0
P2 0 2 2
P3 0 4 3
P4 0 3 6
P3 burst time:5-5=0
P1
0 2
P2到達
P1
3
P3到達
P1
P4到達
6
P1
10
(0+10)
P1結束
P2
17
(10+7)
P2結束
P4
P4結束
25
(17+8)
P3
30
(25+5)
P3結束
Average Waiting Time
= [0+(10-2)+(25-3)+(17-6)]/4
=41/4=10.25
Round Robin with q=4 (1/10)
27
Process
ID
Next
CPU
Burst
Length
Priority
Arrival
Time
P1 10 1 0
P2 7 2 2
P3 5 4 3
P4 8 3 6
P1
0 2
P2到達
當前Process:P1
所以P1先做4
P1
4
(0+4)
P3到達
Round Robin with q=4 (2/10)
28
Process
ID
Next
CPU
Burst
Length
Priority
Arrival
Time
P1 6 1 0
P2 7 2 2
P3 5 4 3
P4 8 3 6
P1 burst time=10-4=6
當前Process:P1、P2、P3
所以輪到P2做q=4
又在t=6時P4也到達,所以就依序P1、P2、P3、P4做
直到做完為止。
P1
0 2
P2到達
P1
4
(0+4)
P3到達
8
(4+4)
P2 P2
6
P4到達
Round Robin with q=4 (3/10)
29
Process
ID
Next
CPU
Burst
Length
Priority
Arrival
Time
P1 6 1 0
P2 3 2 2
P3 5 4 3
P4 8 3 6
P2 burst time=7-4=3
當前Process:P1、P2、P3、P4
P1
0 2
P2到達
P1
4
(0+4)
P3到達
8
(4+4)
P2 P2
6
P4到達
P3
12
(4+8)
Round Robin with q=4 (4/10)
30
Process
ID
Next
CPU
Burst
Length
Priority
Arrival
Time
P1 6 1 0
P2 3 2 2
P3 1 4 3
P4 8 3 6
P3 burst time=5-4=1
當前Process:P1、P2、P3、P4
P1
0 2
P2到達
P1
4
(0+4)
P3到達
8
(4+4)
P2 P2
6
P4到達
P3
12
(4+8)
P4
16
(12+4)
Round Robin with q=4 (5/10)
31
Process
ID
Next
CPU
Burst
Length
Priority
Arrival
Time
P1 6 1 0
P2 3 2 2
P3 1 4 3
P4 4 3 6
P4 burst time=8-4=4
當前Process:P1、P2、P3、P4
P1
0 2
P2到達
P1
4
(0+4)
P3到達
8
(4+4)
P2 P2
6
P4到達
P3
12
(4+8)
P4
16
(12+4)
P1
20
(16+4)
Round Robin with q=4 (6/10)
32
Process
ID
Next
CPU
Burst
Length
Priority
Arrival
Time
P1 2 1 0
P2 3 2 2
P3 1 4 3
P4 4 3 6
P1 burst time=6-4=2
當前Process:P1、P2、P3、P4
P1
0 2
P2到達
P1
4
(0+4)
P3到達
8
(4+4)
P2 P2
6
P4到達
P3
12
(4+8)
P4
16
(12+4)
P1
20
(16+4)
P2
23
(20+3)
P2結束
Round Robin with q=4 (7/10)
33
Process
ID
Next
CPU
Burst
Length
Priority
Arrival
Time
P1 2 1 0
P2 0 2 2
P3 1 4 3
P4 4 3 6
P2 burst time=3-3=0
當前Process:P1、P3、P4
P1
0 2
P2到達
P1
4
(0+4)
P3到達
8
(4+4)
P2 P2
6
P4到達
P3
12
(4+8)
P4
16
(12+4)
P1
20
(16+4)
P2
23
(20+3)
P3
24
(23+1)
P2結束
P3結束
Round Robin with q=4 (8/10)
34
Process
ID
Next
CPU
Burst
Length
Priority
Arrival
Time
P1 2 1 0
P2 0 2 2
P3 0 4 3
P4 4 3 6
P3 burst time=1-1=0
當前Process:P1、P3、P4
P1
0 2
P2到達
P1
4
(0+4)
P3到達
8
(4+4)
P2 P2
6
P4到達
P3
12
(4+8)
P4
16
(12+4)
P1
20
(16+4)
P2
23
(20+3)
P3
24
(23+1)
P4
P2結束
P3結束
P4結束
28
(24+4)
Round Robin with q=4 (9/10)
35
Process
ID
Next
CPU
Burst
Length
Priority
Arrival
Time
P1 2 1 0
P2 0 2 2
P3 0 4 3
P4 0 3 6
P4 burst time=4-4=0
當前Process:P1
P1
0 2
P2到達
P1
4
(0+4)
P3到達
8
(4+4)
P2 P2
6
P4到達
P3
12
(4+8)
P4
16
(12+4)
P1
20
(16+4)
P2
23
(20+3)
P3
24
(23+1)
P4
P2結束
P3結束
P4結束
28
(24+4)
P1
P1結束
30
(28+2)
Round Robin with q=4 (10/10)
36
Process
ID
Next
CPU
Burst
Length
Priority
Arrival
Time
P1 0 1 0
P2 0 2 2
P3 0 4 3
P4 0 3 6
P1 burst time=2-2=0
P1
0 2
P2到達
P1
4
(0+4)
P3到達
8
(4+4)
P2 P2
6
P4到達
P3
12
(4+8)
P4
16
(12+4)
P1
20
(16+4)
P2
23
(20+3)
P3
24
(23+1)
P4
P2結束
P3結束
P4結束
28
(24+4)
P1
P1結束
30
(28+2)
Average Waiting Time
= [(0+12+8)+(2+12)+(5+11)+(6+8)]/4
=64/4=16
Multilevel Queue
• 將Ready Queue 分成foreground queue與background queue
用不同的排程演算法處理。
37
Ready Queue
Ready Queue
Foreground queue
→需要交談較多的process
Background queue
→需要批次處理較多的process
Multilevel Feedback Queue
• Multilevel queue的精進版,利用aging priority的方式,使
process可以在不同的queue中以不同的演算法參與排程,以防
止等待時間過長。
38
如果process待
在ready queue
的時間越長,
priority就會越
高,也就會移到
越下面的queue
去執行
淺談硬體的多工處理
• Multi-processor
• Asymmetric multiprocessing→其中一個CPU主導(做排程)分配其他
CPU工作
• Symmetric multiprocessing (SMP)→每個CPU都可以自行在自己的
ready queue排序。
• 最常見的實作方式,但因為匯流排限制無法繼續擴展
• Multicore processor→將多個CPU封裝成一顆,比multi-
processor更快更省電(Chip-level multiprocessing, CMP)
• https://www.mobile01.com/topicdetail.php?f=296&t=19749
12
39
SMP架構中CPU的溝通問題
• NUMA現象(Non-Uniform Memory Access)→local/remote
data access時間不一致的現象。
40
為解決NUMA的問題
• SMP架構顧慮到存取速度的不同因而使用process affinity,盡量
安排所有東西都在同一個processor上做。
• hard affinity→強制process不能任意移動
• soft affinity→盡量安排在同一個processor上運作,但不保證
• affinity在NUMA架構下會使有些CPU overload,有些CPU idle
→因此需要load balancing來處理
a) Push migration:loading重的processor丟掉工作
b) Pull migration:idle的processor到其他processor的ready
queue去拿工作
41
Latency & Response Time
42
Task
Running
Task
Running
Response Time(Event Latency)
通知CPU(Even Occur) CPU回應(Event Response)
Interrupt Latency Dispatch Latency
1. 分析中斷的型式(Interrupt type)
2. Context Switch
3. 呼叫Interrupt Service Routine(ISR)執行
1. 有process插隊的衝突解決
2. Dispatcher 分配CPU主導權給從排程器出來的process
3. Real-time system執行
Real-Time System
• 保證每個process可以被即時執行,不會有很長得等待時間,且
能夠在deadline前完成任務
• Soft Real-Time(Response Time ≒1~2 ms):盡量達到deadline但有容
許範圍超過,允許少量的延遲。e.g.多媒體播放器
• Hard Real-Time(Response Time≦150μs):所有工作皆不允許延遲,保
證deadline前一定做完。e.g.剎車系統
43
Real-Time Scheduling
1. Rate Monotonic Scheduling (Fixed Priority Scheduling,
FPS):process的period time越短者給予的priority越高,但在
每個period time都很高時,可能會超出deadline。
2. Earliest Deadline First Scheduling(EDF):越接近deadline
的process給予priority越高。
3. Proportional Share Scheduling:類似RR,事先平分。當前
的CPU Time有T,總共有N個process,那每個process輪流做
N/T的時間。
44
範例練習
Process ID CPU time Deadline Arrival Time
P1 10 24 0
P2 3 18 4
P3 10 19 5
45
P1
Rate Monotonic (1/5)
46
0
P2到達
當前Process:P1
所以P1先做4,P2到達
4
Process
ID
CPU
time
Deadline
Arrival
Time
P1 10 24 0
P2 3 18 4
P3 10 19 5
P1
Rate Monotonic (2/5)
47
0
P2到達
P1 CPU time = 10-4=6
當前Process:P1、P2
P2 CPU time只需要3所以P2先做1,t=5時,P3到達
P2 CPU time仍然是最小所以就繼續做直到完成為止
4
Process
ID
CPU
time
Deadline
Arrival
Time
P1 6 24 0
P2 3 18 4
P3 10 19 5
P2 P2
P3到達
End
75
P1
Rate Monotonic (3/5)
48
0
P2到達
P2 CPU time = 3-3=0
當前Process:P1、P3
P1 CPU time只需要6<10,所以讓P1先做完
4
Process
ID
CPU
time
Deadline
Arrival
Time
P1 6 24 0
P2 0 18 4
P3 10 19 5
P2 P2
P3到達
End
75
P1
End
13
P1
Rate Monotonic (4/5)
49
0
P2到達
P1 CPU time = 6-6=0
當前Process:P3
所以讓P3完成
4
Process
ID
CPU
time
Deadline
Arrival
Time
P1 0 24 0
P2 0 18 4
P3 10 19 5
P2 P2
P3到達
End
75
P1
End
13
P3
End
23
P1
Rate Monotonic (5/5)
50
0
P2到達
P3 CPU time = 10-10=0
考慮各Process的執行時間:
P1 = 13 < 24
P2 = 7 < 18
P3 = 23 > 19 (超出時間)
4
Process
ID
CPU
time
Deadline
Arrival
Time
P1 0 24 0
P2 0 18 4
P3 0 19 5
P2 P2
P3到達
End
75
P1
End
13
P3
End
23
P1
Earliest Deadline First (1/5)
51
0
P2到達
當前Process:P1
所以P1先做4,P2到達
4
Process
ID
CPU
time
Deadline
Arrival
Time
P1 10 24 0
P2 3 18 4
P3 10 19 5
P1
Earliest Deadline First (2/5)
52
0
P2到達
P1 CPU time = 10-4=6
當前Process:P1、P2
P2 deadline=18<24所以P2先做1,t=5時,P3到達
P2 deadline=18<19仍然是最早所以就繼續做直到完成為止
4
Process
ID
CPU
time
Deadline
Arrival
Time
P1 6 24 0
P2 3 18 4
P3 10 19 5
P2 P2
P3到達
End
75
P1
Earliest Deadline First (3/5)
53
0
P2到達
P2 CPU time = 3-3=0
當前Process:P1、P3
P3 deadline=19<24,所以P3先做完
4
Process
ID
CPU
time
Deadline
Arrival
Time
P1 6 24 0
P2 0 18 4
P3 10 19 5
P2 P2
P3到達
End
75
P3
17
End
P1
Earliest Deadline First (4/5)
54
0
P2到達
P3 CPU time = 10-10=0
當前Process:P1
所以輪到P1做完
4
Process
ID
CPU
time
Deadline
Arrival
Time
P1 6 24 0
P2 0 18 4
P3 0 19 5
P2 P2
P3到達
End
75
P3
17
End
P1
End
23
P1
Earliest Deadline First (5/5)
55
0
P2到達
P1 CPU time = 6-6=0
考慮各Process的執行時間:
P1 = 23 < 24
P2 = 7 < 18
P3 = 17 < 19
4
Process
ID
CPU
time
Deadline
Arrival
Time
P1 0 24 0
P2 0 18 4
P3 0 19 5
P2 P2
P3到達
End
75
P3
17
End
P1
End
23
評估最合適的演算法..
• Deterministic Modeling→取一個固定的工作量讓每種排程演算
法執行,最後選擇花最少時間者。
• Queuing Model→使用Little Formula的統計結果來評估。
• Simulation→模擬當時的環境情況並隨機產生的數據測試演算法。
• Implementation→實際去採用,但非常耗時耗資源。
56
一些參考文章/網頁
• https://www.cs.uic.edu/~jbell/CourseNotes/OperatingSyste
ms/6_CPU_Scheduling.html
• http://sjchen.im.nuu.edu.tw/OS/97Spring/Ch_4.pdf
• http://beru.univ-brest.fr/~singhoff/ENS/USTH/sched.pdf
• https://www.mobile01.com/topicdetail.php?f=296&t=19749
12
• https://sls.weco.net/node/21325
57
Q & A
58

More Related Content

PPTX
Os讀書會20170609
PPTX
Os讀書會20170518
PPTX
[OKKY 세미나] 정진욱 - 테스트하기 쉬운 코드로 개발하기
PPTX
Os讀書會20170616
PDF
様々な全域木問題
PDF
Chapitre 2 complexité
PDF
Coqチュートリアル
PPTX
競技プログラミングのためのC++入門
Os讀書會20170609
Os讀書會20170518
[OKKY 세미나] 정진욱 - 테스트하기 쉬운 코드로 개발하기
Os讀書會20170616
様々な全域木問題
Chapitre 2 complexité
Coqチュートリアル
競技プログラミングのためのC++入門

What's hot (20)

PDF
指数時間アルゴリズム入門
PDF
プログラミングコンテストでの乱択アルゴリズム
PDF
Rustで始める競技プログラミング
PDF
プログラミングコンテストでのデータ構造 2 ~動的木編~
PDF
自動定理証明の紹介
PDF
AtCoder Beginner Contest 026 解説
PDF
系統程式 -- 第 10 章
PDF
[OKKYCON] 정진욱 - 테스트하기 쉬운 코드로 개발하기
PDF
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
PDF
AtCoder Beginner Contest 007 解説
PDF
イマドキC++erのモテカワリソース管理術
PDF
エンジニア目線で見る TLA+ と PlusCal - TAKAMI Torao
PDF
系統程式 -- 第 6 章
PDF
プログラミングコンテストでのデータ構造
PDF
系統程式 -- 第 1 章
PPTX
PDF
Union find(素集合データ構造)
PDF
Essential Linux Commands for DBAs
PDF
SECDマシン 実装と動きとその他もろもろについて
指数時間アルゴリズム入門
プログラミングコンテストでの乱択アルゴリズム
Rustで始める競技プログラミング
プログラミングコンテストでのデータ構造 2 ~動的木編~
自動定理証明の紹介
AtCoder Beginner Contest 026 解説
系統程式 -- 第 10 章
[OKKYCON] 정진욱 - 테스트하기 쉬운 코드로 개발하기
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
AtCoder Beginner Contest 007 解説
イマドキC++erのモテカワリソース管理術
エンジニア目線で見る TLA+ と PlusCal - TAKAMI Torao
系統程式 -- 第 6 章
プログラミングコンテストでのデータ構造
系統程式 -- 第 1 章
Union find(素集合データ構造)
Essential Linux Commands for DBAs
SECDマシン 実装と動きとその他もろもろについて
Ad

Os讀書會20170504