2016-09-27 460 views
2

我讀過linux內核包含許多調度類,每個調度類都有自己的優先級。要選擇要運行的新進程,進程調度程序會從最高優先級級別迭代到最低優先級級別。如果在類中找到可運行的進程,則選擇最高優先級的進程從該類運行。從Linux內核開發linux進程調度程序如何防止進程餓死

提取由羅伯特·愛:

的主入口點到進程時間表功能 時間表(),在內核中定義/ sched.c中。這就是功能的 內核的其餘部分用來調用進程調度程序,決定運行哪個進程然後運行該進程。 schedule()對於調度程序類是 通用的。也就是說,它找到具有可運行進程的最高優先級的調度程序類,並詢問它接下來要運行的內容。 考慮到這一點,schedule()應該並不令人意外。函數的唯一重要部分 - 其他的 無意於此重現 - 它調用pick_next_task() ,也在kernel/sched中定義.c。pick_next_task()函數通過每個調度程序類別 ,從最高優先級開始,並且 選擇最高優先級級別中的最高優先級進程。

讓我們來想象下面的場景。有一些進程在較低優先級中等待,並且進程正在不斷地被添加到較高優先級的類中。低優先級的進程不會餓死嗎?

回答

1

它確實會餓死。 處理這種情況有很多種方法。

  1. 老化,系統中的過程越長,優先級越高。
  2. 調度算法爲每個進程提供一個使用CPU的時間量。時間量子變化,通常,互動過程的時間量較少,因爲它們花費更多的時間進行I/O,而耗時/計算過程的時間量較大。 進程運行其時間段後,它將被置於過期隊列中,直到系統中沒有活動進程。 然後,到期的隊列成爲活動隊列,反之亦然。 這2種預防飢餓的方法。
1

Linux內核實現了基於虛擬時鐘的完全公平調度算法。

每個調度實體具有與其其快照看起來像

struct sched_entity { 
    ... 
    u64 exec_start; 
    u64 sum_exec_runtime; 
    u64 vruntime; 
    u64 prev_sum_exec_runtime; 
    ... 
}

上述四個屬性用於跟蹤一個進程的運行時以及使用與一些其它方法沿着這些屬性相關聯的sched_entity結構(update_curr()其中這些被更新),虛擬時鐘被實現。 將進程分配給CPU時,將exec_start更新爲當前時間,並將消耗的CPU時間記錄在sum_exec_runtime中。當從CPU sum_exec_runtime中取出進程時,值將保存在prev_sum_exec_runtime中。 sum_exec_runtime累計計算。 (意味着它單調增長)。

vruntime存儲過程執行過程中虛擬時鐘流逝的時間量。

如何計算vruntime

忽略所有的複雜的計算,它是如何計算的核心概念是: -

vruntime += delta_exec_weighted; 
delta_exec_weighted = delta_exec * (NICE_0_LOAD/load.weight); 

這裏delta_exec被處理分配給CPU和從CPU取出之間的時間差而load.weight是重取決於優先級(Nice Value)的過程。通常情況下,一個進程的好值1的增加意味着它減少了10%的CPU時間,從而減輕了重量。 過程與NICE值0,重量= 1024 過程重新Niced與值1,重量= 1024/1.25 = 820(約)從上方

  • 所以vruntime增加繪製

    點當進程得到CPU

  • vruntime與較低優先級進程相比,對於較高優先級進程緩慢增加。

的運行隊列被保持在紅黑樹和每個運行隊列具有與其相關聯的變量min_vruntime保持所述最小vruntime中在運行隊列的所有過程。 (min_vruntime只能增加,不會隨着進程的安排而減少)。

在紅黑樹的節點,關鍵是process->vruntime - min_vruntime

當調用調度程序,內核基本上拿起其中有最小的鍵(最左邊的節點),併爲其分配CPU的任務。

具有較小鍵的元素將放置在更靠左的位置,因此可以更快地安排。

  1. 當進程運行時,其vruntime會穩步增加,所以它最終會在紅黑樹中向右移動。 因爲vruntime對於更重要的過程增加得更慢,所以它們也將向右移動得更慢,所以對於不太重要的過程,它們的調度機會更大 - 正如所需。
  2. 如果一個進程休眠,其vruntime將保持不變。因爲在此期間每個隊列min_vruntime將增加,所以睡眠過程在喚醒後會更靠左,因爲(上面提到的)鍵變小了。

因此沒有餓死,就好像被剝奪CPU的低優先級的進程的機會,都會有其vruntime最小的,因此重點將是最小的,因此移動到樹的左側迅速,因此調度。