執行人: YangYeh-PD
專題解說影片 (2024.06.29)
問題紀錄
SCHED_IDLE
屬於 idle_sched_class
, 兩者差別在哪裡?在 yenslife 的排程器研究當中有提到,scheduling class 和 scheduling policies 的差異在於,前者用來區分優先權,後者則是排程的方法。
sleep
在早期 Linux 核心排程器有什麼用途? 為何這項行程與 interactivity 有關聯?CPU 排程器在搶占式多工和非搶占式多工系統中都扮演著重要角色。
為何排程器往往需要在 interactiveness 與 throughput 之間做取捨?如果想要提升作業系統的互動性 (interactive),那就要進行搶佔式多工。而這種搶佔式多工當中的 context switch 會造成 CPU 短時間閒置,因此就會降低 throught。
Fairness 意指具有相同優先級的任務應該獲得相等的 CPU 時間。然而,僅有 fairness 是不夠的。如果一個高優先級的任務持續佔用 CPU,其他任務將無法執行。因此,Liveness 的設計變得至關重要。Liveness 能確保每個任務在一定時間內獲得 CPU 資源。通過 Liveness,即使是需要完成的低優先級任務也能得到執行。
Realtime 分為兩種類型:Soft real-time 以及 Hard real-time。
Linux CPU 會根據不同的平台採用不同的節能方法。在桌機和筆記本電腦上,主要有兩種節能策略
在伺服器中,由於系統需要連續運行,因此在 Throughput 和功耗之間尋求平衡是至關重要的。
所以排程器如何知道哪些任務需要優先執行呢?Linux 核心直接要求 Source Program 在將任務交給排程器進行調度之前指定優先級。Linux 核心使用 Scheduling Classes 的概念來實現任務調度。現在的核心版本中,有五種不同的調度類別。
Scheduling classes | Scheduling Policies |
---|---|
stop_sched_class |
|
dl_sched_class |
SCHED_DEADLINE |
rt_sched_class |
SCHED_FIFO &SCHED_RR |
fair_sched_class |
SCHED_NORMAL &SCHED_BATCH &SCHED_IDLE |
idle_sched_class |
rt_sched_class
當中,有兩種 scheduling policy,分別是 SCHED_FIFO
和 SCHED_RR
,這兩者非常相似。
SCHED_FIFO
中,FIFO 代表 First in First Out。因此任務按照到達的順序執行。然而,如果有更高優先級的任務需要執行,它將被優先執行。SCHED_RR
(round robin)與 FIFO 相似,但區別在於 RR 有 timeslice。它使用輪轉的方法循環調度所有具有相同優先級的任務。每個任務只能運行一個最大固定時間片。這會讓排程更具有 Liveness 的特性。SCHED_NORMAL
和 SCHED_OTHER
是用於普通任務的 scheduling policy,會使用 CFS(Completely Fair Scheduler)排程。SCHED_BATCH
與 SCHED_NORMAL
相似,但它會更少地搶占 CPU 的資源。SCHED_IDLE
用於非常低優先級的任務,幾乎任何任務都可以搶占使用此策略的任務。在 Linux 核心的 v0.01 版本中,所有任務都通過一個 array 表示。這個 array 不僅是所有任務的列表,也是 runqueue。這個 array 的長度為 NR_TASKS
,即 64。空條目表示為 NULL
。
其演算法很簡單
這個過程會不斷進行,直到任務完成時,它就會離開 array,並將該元素設置為 NULL
。
在這個階段,所有任務都存在一個連結串列當中。當 Linux 需要選擇一個任務進行執行時,它會走訪每個任務,並為每個任務給予一個 goodness score。得分最高的任務將會獲得 CPU 資源。當任務的執行時間耗盡時,它就會被搶占,然後 CPU 會運行另一個任務。
探討以下:
在上方開發紀錄提出你的疑惑並參與討論。
為何 Response Time 與 Throughput 需要做取捨?
如果想要提升作業系統的互動性 (interactive),那麼每當使用者輸入指令的時候,CPU 都需要立刻暫行當下執行的任務,並且切換到其他任務回饋給使用者。這是搶占式多工 (preemptive multitasking) 的例子。在 《Demystifying the Linux CPU Scheduler》34 頁有提到Every time the scheduler determines to context switch, the CPU becomes idle and are unoccupied by any task.
因此,會降低 throughput 的原因是 context switch 當中造成 CPU 短時間閒置,任務被打斷是表面原因。
Fairness 意思是相同優先權的任務會享有相同的 CPU 時間。
Liveness 意思是每個任務,無論優先權高低,最終都會得到 CPU 的資源。由於兩者 Scheduling Policy 都是優先權高先執行,享有 CPU 的資源比較多,因此在 Fairness 上,兩者表現一樣。
而由於 RR 每隔一個 timeslice 就會切換一次任務,就能夠讓比較低優先權的任務更有機會執行, Liveness 的特性比較好。而因為 FIFO 在執行完一個任務後才會接續執行下一個任務,因此 Liveness 的特性與 RR 相比,就沒那麼好。
NUMA 雖然會提高 migration 的成本,但因為在 NUMA 可以涵蓋到大量的處理器,每個處理器會比其他處理器更接近某些記憶體,讓記憶體存取速度比其他部分更快速,因此在高效能運算系統也很常見。因此UMA + NUMA 的混和版本是否會犧牲掉這點,也應該考慮。
如果今天系統負載較低,它會關閉任意 secondary CPU,以降低能源消耗。在關閉該 CPU 之前,一定會執行 Stop-Task 類別的任務。如果你關閉的那顆 CPU 上面剛好在執行其他任務,那 stop-task 就需要把上面的任務 migrate 到其他 CPU 完成,因此需要任務遷移。
重現《Demystifying the Linux CPU Scheduler》第 7 章的實驗。
Linhoward0522
的排程器研究中,有相關的操作說明。本實驗旨在展示 FIFO 和 RR 調度策略之間的差異。這兩種策略都屬於 real-time 的 scheduling class。為了詳細介紹這兩種 scheduling policy,我會進行三個實驗。