1. 程式人生 > >linux程序排程機制

linux程序排程機制

版本宣告:轉載請註明出處,未經允許,禁止商業用途。
linux是以執行緒為單位進行CPU排程的。所以下面的描述中所說的執行緒和程序從CPU排程角度來說是等效。
Linux程序優先順序:
Priority。程序的優先順序是作業系統自己給定並且動態調整的。使用者可以通過nice值來調整實際優先順序。
CentOS6.2(kernel 2.6.32)程序的預設優先順序是80。
Nice value:-20到+19。Real priority = priority + nice,top中的PRI這一列是Real priority。
Real-time priority:0到99。非實時執行緒優先順序為100到139。所以linux程序 總共140個優先順序。
整體排程原始思路可以近似理解為根據優先順序分配時間量,執行緒輪轉(round robin)使用CPU分配到的時間量。
Linux核心2.6中流行的排程器是O(1)排程器。它維護兩個陣列。一個存放活動程序,另一個存放過期程序,每個陣列有140個連結串列頭。當活動陣列中的程序都執行了之後,活動陣列變成過期陣列,過期陣列變成活動陣列。然後繼續執行。另外,會給等到了輸入的I/O和互動式程序提高優先順序,以及時執行。並且降低佔用CPU時間長的程序的優先順序。但是因為是通過啟發式的方法來確定一個任務是互動式任務,所以在處理互動式任務時效果並不好。
Linux核心2.6.23中引入CFS (Completely Fair Scheduler)演算法。每個程序有一個vruntime,優先順序越高的程序vruntime增加的就越慢,總是呼叫vruntime小的程序。這樣即可以保證高優先順序程序得到更多排程,同時低優先順序程序也不會餓死。
CFS使用紅黑樹作為排程佇列的資料結構。根據任務在CPU上的執行時間長短將其有序地排列在樹中,這個時間是vruntime。左側的節點對應迄今為止CPU上執行時間少的任務,所以左側的任務會更早被排程。根據實際執行時間,按需調整節點在樹中的位置。查詢和插入的時間複雜度為O(logn)。但是其實除了查詢最左側節點外,很少執行其他查詢,而最左側的節點指標始終被快取,所以查詢效率非常高。
CFS演算法並沒有嘗試去識別互動式任務,因為互動式任務使用CPU時間少,即vruntime小,所以一旦有了輸入,就會被優先執行。這樣就保證了響應速度。
多核平臺每個core一個排程佇列。排程器保證各個core的負載是均衡的。
排程器只考慮ready的執行緒。其它執行緒在sleep佇列中。