linux程序排程機制

2021-09-03 02:32:59 字數 1123 閱讀 7838

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佇列中。

從Linux的程序排程機制中想到的

linux 持續維護相關的資料結構 諸如 runqueue prio array 不斷更新程序的動態優先順序,並相應的調整時間片,從而實現了 o 1 複雜度的程序排程演算法,可以在常量時間內排程新程序上台執行,而不受系統中程序總數的影響。我覺得這至少能佐證三個道理 1 效益可以來自於平時點點滴滴地積...

Android執行緒排程機制

2014 2 24 閱讀789 在android weekly上看到了一篇關於android執行緒排程的文章,感覺挺不錯的,試著將其翻譯了一下,這篇文章是關於android中線程是如何排程的,以及怎麼樣顯示設定執行緒優先順序保證應用程式在 多個執行緒在後台執行時保持響應。執行緒排程是指作業系統負責決...

Spark 任務排程機制

driver執行緒主要是初始化sparkcontext物件,準備執行所需的上下文,然後一方面保持與的rpc連線,通過申請資源,另一方面根據使用者業務邏輯開始排程任務,將任務下發到已有的空閒executor上。executor程序起來後,會向driver反向註冊,註冊成功後保持與driver的心跳,同...