在完全公平調度下,時間片是否取決於程序優先級?
我正在嘗試了解完全公平調度程序(CFS)。根據Linux Kernel Development , 3rd edition 中的 Robert Love 的說法(他的斜體字,我的粗體字):
CFS 不是為每個程序分配一個時間片,而是根據可執行程序的總數計算一個程序應該執行多長時間。CFS 不使用 nice 值來計算時間片,而是使用 nice 值來加權程序將接收的處理器比例:較高值(較低優先級)的程序接收相對於預設 nice 值的分數權重,而較低值(更高優先級)程序獲得更大的權重。
然後每個程序執行一個“時間片”,該時間片與其權重除以所有可執行執行緒的總權重成正比。為了計算實際的時間片,CFS 為完美多任務處理中“無限小”的調度持續時間設定了一個目標。這個目標稱為目標延遲……讓我們假設目標延遲為 20 毫秒,並且我們有兩個具有相同優先級的可執行任務。**無論這些任務的優先級如何,每個任務都會執行 10 毫秒,然後再搶占另一個任務。**如果我們有四個具有相同優先級的任務,每個任務將執行 5 毫秒。如果有 20 個任務,每個任務將執行 1 毫秒….
現在,讓我們再次考慮兩個可執行程序的情況,除了具有不同的 nice 值——例如,一個具有預設的 nice 值(零)和一個具有預設的 nice 值 5。這些 nice 值具有不同的權重,因此我們的兩個程序接收處理器時間的不同比例。在這種情況下,nice-5 程序的權重約為 1/3。如果我們的目標延遲再次為 20 毫秒,我們的兩個程序將分別接收 15 毫秒和 5 毫秒的處理器時間。
第一個粗體句子表示無論優先級如何,任務都具有相同的時間片,而第二個表示時間片取決於 nice 值。哪個是正確的,或者我錯過了什麼?
這兩句話只是解釋了 CFS 如何工作的 2 個實例 - 前者是當 2 個任務具有相同的 nice 值時,而後者是當 2 個任務具有不同的 nice 值時。一般來說,為每個任務計算的時間片歸結為這個公式:
timeslice = (weight/total_weight)*target_latency
weight
是目前任務的權重,取決於分配給任務的好值。
total_weight
是執行隊列中所有任務的權重之和。
target_latency
是 CFS 將嘗試一次調度執行隊列中的所有任務的時間間隔。回到原來的公式,當 2 個任務具有相同的 nice 值時,它們也將具有相同的
weight
值。通過將weight
其視為常數,我們的新公式是:timeslice = (target_latency/total_weight)
如您所見,執行隊列中每個任務的時間片不再依賴於其
weight
值,因此每個任務將收到相同的時間片。這是本書提到的第一個案例。第二種情況提到好的值不同,因此
weight
值會有所不同。每個任務將相應地接收其時間片。