2011-11-04 77 views
13

我是一個初學者到Linux內核,我努力學習如何Linux的時間表過程。的Linux CFS(完全公平調度器)延遲

我讀過一些書上的Linux內核,並通過從IBM http://www.ibm.com/developerworks/linux/library/l-cfs/,所有的環節了,但我還是留下了一些疑問。

  1. 調度程序如何安排sysctl_sched_latency時間內的所有任務?
  2. 當一個進程被喚醒究竟在place_entity功能呢?
  3. 當一個進程被喚醒,爲什麼是vruntimesched_latency減去調整?不能導致運行隊列中的進程在vruntime值有很大差異嗎?

回答

10

首先任務

    理論上
  • 的虛擬運行時間是當任務將開始執行 其下一個時間片理論上完美的多線程CPU上。
  • 在實踐中它的實際運行時間歸到正在運行的任務

1總數如何進行調度安排所有的 sysctl_sched_latency時間內的任務?

它維護一個時間排序的紅色和黑色的樹,其中所有可運行的任務是 按其虛擬運行時間排序。左邊的節點已經運行了最短的時間。 CFS挑選最左邊的任務,並運行它,直到任務計劃或調度蜱 那麼CPU時間花在它被添加到其虛擬運行時中運行。 當它不再是最左邊的節點時,則運行具有最短虛擬的新任務,並且舊的任務被預充電。

2.當一個進程被喚醒究竟在place_entity功能呢?

短版:

當一個進程被喚醒的place_entity功能要麼保留 任務的虛擬運行,因爲它是或增加它。

龍版本:

當一個進程被喚醒的place_entity功能做以下的事情

  1. 初始化臨時虛擬運行時最小的任務的CFS運行隊列的虛擬運行。

  2. 由於睡眠時間少於一個延遲時間不計算,所以 將初始化閾值變量初始化爲sysctl_sched_latency。 如果啓用GENTLE_FAIR_SLEEPERS功能,那麼 則是該變量值的一半。 用此閾值減少先前初始化的臨時虛擬運行時間。

  3. 確保臨時虛擬運行時間至少等於任務的虛擬運行時,通過計算虛擬運行時間設置爲最大的本身和任務的虛擬運行。

  4. 設置任務的虛擬運行到臨時運行。

3.當一個進程被喚醒,爲什麼是vruntime由sched_latency減去調整?

虛擬運行時間遞減,因爲睡眠不足單等待時間不計。 例如,如果它的 只睡眠一個調度程序延遲,那麼該任務不應在紅黑樹中更改其位置。

能4.不是導致在運行隊列中vruntime值差異較大的過程?

相信在步驟3對問題2所述的邏輯,防止或至少最小化。

參考

sched.c Linux Kernel Source

sched_fair.c Linux Kernel Source

Notes on the CFS Scheduler Design

+0

回答問題1並沒有真正回答關於內'sysctl_sched_latency' CFS調度。 – kavadias