Scheduling (排程)相關
阿新 • • 發佈:2019-01-24
所有的程序部分執行與使用者態,部分運行於系統態。底層的硬體如何支援這些狀態各不相同但是通常有一個安全機制從使用者態轉入系統態並轉回來。使用者態比系統態的許可權低了很多。每一次程序執行一個系統呼叫,它都從使用者態切換到系統態並繼續執行。這時讓核心執行這個程序。 Linux 中,程序不是互相爭奪成為當前執行的程序,它們無法停止正在執行的其它程序然後執行自身。每一個程序在它必須等待一些系統事件的時候會放棄 CPU 。例如,一個程序可能不得不等待從一個檔案中讀取一個字元。這個等待發生在系統態的系統呼叫中。程序使用了庫函式開啟並讀檔案,庫函式又執行系統呼叫從開啟的檔案中讀入位元組。這時,等候的程序會被掛起,另一個更加值得的程序將會被選擇執行。程序經常呼叫系統呼叫,所以經常需要等待。即使程序執行到需要等待也有可能會用去不均衡的 CPU 事件,所以 Linux 使用搶先式的排程。用這種方案,每一個程序允許執行少量一段時間, 200 毫秒,當這個時間過去,選擇另一個程序執行,原來的程序等待一段時間直到它又重新執行。這個時間段叫做時間片。
需要排程程式選擇系統中所有可以執行的程序中最值得的程序。一個可以執行的程序是一個只等待 CPU 的程序。 Linux 使用合理而簡單的基於優先順序的排程演算法在系統當前的程序中進行選擇。當它選擇了準備執行的新程序,它就儲存當前程序的狀態、和處理器相關的暫存器和其他需要儲存的上下文資訊到程序的 task_strUCt 資料結構中。然後恢復要執行的新的程序的狀態(又和處理器相關),把系統的控制交給這個程序。為了公平地在系統中所有可以執行( runnable )的程序之間分配 CPU 時間,排程程式在每一個程序的 task_struct 結構中儲存了資訊:
參見 kernel/sched.c schedule()
policy 程序的排程策略。 Linux 有兩種型別的程序:普通和實時。實時程序比所有其它程序的優先順序高。如果有一個實時的程序準備執行,那麼它總是先被執行。實時程序有兩種策略:環或先進先出( round robin and first in first out )。在環的排程策略下,每一個實時程序依次執行,而在先進先出的策略下,每一個可以執行的程序按照它在排程佇列中的順序執行,這個順序不會改變。
Priority 程序的排程優先順序。也是它允許執行的時候可以使用的時間量( jiffies )。你可以通過系統呼叫或者 renice 命令來改變一個程序的優先順序。
Rt_priority Linux 支援實時程序。這些程序比系統中其他非實時的程序擁有更高的優先順序。這個域允許排程程式賦予每一個實時程序一個相對的優先順序。實時程序的優先順序可以用系統呼叫來修改Coutner 這時程序可以執行的時間量( jiffies )。程序啟動的時候等於優先順序( priority ),每一次時鐘週期遞減。
排程程式從核心的多個地方執行。它可以在網站優化首推精圖數碼把當前程序放到等待佇列之後執行,也可以在系統呼叫之後程序從系統態返回程序態之前執行。需要執行排程程式的另一個原因是系統時鐘剛好把當前程序的計數器 (counter) 置成了 0 。每一次排程程式執行它做以下工作:
參見 kernel/sched.c schedule()
kernel work 排程程式執行 bottom half handler 並處理系統的排程任務佇列。這些輕量級的核心執行緒在第 11 章詳細描述Current pocess 在選擇另一個程序之前必須處理當前程序。
如果當前程序的排程策略是環則它放到執行佇列的最後。