筆記 《Linux核心設計與實現》第四章程序排程

2021-07-25 18:51:10 字數 2193 閱讀 6592

目前正在通讀《linux核心設計與實現》一書,本文是對第四章《程序排程》的總結。

程序排程的原因不難理解,有限數目的cpu、數目眾多的應用,就必須有個類似交警的角色來進行平衡和排程。

程序排程的基本思路是啥?對程序進行分級、分優先順序。

程序分為兩級:實時程序 vs 普通程序,

相應地,優先順序也分為兩大類:實時優先順序和普通優先順序。

相應地,排程策略也分為三大類:sched_fifo、sched_rr和sched_normal。其中前兩個屬於實時排程策略。

下面分別講一下:

1.程序排程的一些概念:

1.1 強佔(preemption),在搶占式的多工模式下,由排程程式來決定什麼時候停止乙個程序的執行,以便其他程序能夠得到執行機會。這個強制的掛起動作就叫做搶占。

1.2 時間片(timeslice),實際上是分配給每個可執行程序的處理器時間段。任何長時間片都會導致系統互動表現欠佳。很多作業系統中都特別重視這一點,預設的時間片很短,如10ms。linux的cfs排程器沒有直接分配時間片到程序,而是將處理器的使用比劃分給了程序,而且這個使用比還受到nice值的影響。

1.3 讓步(yielding),程序主動掛起自己的操作稱為讓步。

1.4 cfs:完全公平排程演算法,是linux2.6.23之後針對普通程序採用的排程演算法,在linux中稱為sched_normal。cfs不是完美的公平,只是幾乎完美的多工。它確保給每個程序公平的處理器使用比。

1.5 目標延遲:cfs為完美多工中的無限小排程週期的近似值設立了乙個目標。

2.排程策略

2.1.實時優先順序:

實時優先順序範圍從0到max_rt_prio減一。預設情況下,max_rt_prio為100。所以,預設的實時優先順序範圍是從0到99。

實時排程策略又分為:

sched_fifo :處於可執行狀態的sched_fifo級的程序會比任何sched_normal級的程序都先得到排程。它不基於時間片,可以一直執行下去。除非自己受阻或者顯式地釋放處理器為止;

只有更高優先順序的sched_fifo或者sched_rr程序才能搶占sched_fifo程序。同優先順序的sched_fifo級的程序之間會輪流排程。

sched_rr :帶有時間片的sched_fifo。在耗盡事先分配給它的時間後就不能再繼續執行了。

實時排程器管理實時排程策略

cfs排程器管理普通的排程策略

2.2.nice值

nice值適用於sched_normal級程序

範圍是-20到+19,預設值為0;nice值越大優先順序越低,優先順序低則意味著獲得更少的處理器時間。

nice值是所有unix系統中的標準化的概念--但不同的unix系統由於排程演算法不同,因此nice值的運用方式有所差異。如mac os x,程序的nice值代表分配給程序的時間片的絕對值;而linux系統中,nice值則代表時間片的比例;

nice值->伺服器使用比-執行時間

2.3虛擬實時

vruntime,記錄乙個程式到底執行了多長時間以及它還應該再執行多久。以ns為單位,其值被所有可執行程序總數加權,和定時器節拍不再相關(每次系統時鐘節拍發生時,不再跟隨減少乙個節拍週期)。

update_curr(),由系統定時器週期性呼叫,更新vruntime的值

2.4.nice值到實時優先順序的對映

共享了實時優先順序的取值空間,其值從max_rt_prio到(max_rt_prio+40),也就是說,在預設情況下,nice值從-20到19直接對應的是從100到139的實時優先順序範圍。

3.排程時機

排程器的入口是schedule();

調起schedule()並不一定產生搶占。

3.2搶占時機

在多數作業系統中,是否要將乙個程序立刻投入執行(也就是搶占當前程序),是完全由程序優先順序和是否有時間片決定的。

在linux的cfs排程器中,搶占時機取決於新的可執行程式消耗了多少處理器使用比,如果消耗的使用比比當前程序小,則發生搶占。

6.程序排程用到的資料佇列

6.1.等待佇列  程序休眠  兩種狀態:task_interruptible和task_uninterruptible

6.2.可執行紅黑樹  rbtree,自平衡二叉搜尋樹。程序優先順序最高的,其vruntime(虛擬執行時間)最小,排在樹的最左葉子節點。

6.3.過期佇列

《Linux核心設計與實現》第3章讀書筆記

第三章 程序管理 一 程序 1.程序就是處於執行期的程式,但並不侷限於可執行 實際上,程序是正在執行的程式 的實時結果。2.執行執行緒是在程序中活動的物件 3.在現代作業系統中,程序提供兩種虛擬機制 虛擬處理器和虛擬記憶體。4.程序是呼叫fork 系統的結果,最後程式通過exit 系統呼叫退出執行。...

《Linux核心設計與實現》第5章讀書筆記

第五章 系統呼叫 一 系統呼叫概述 系統呼叫在linux中稱為syscall,返回的值是long型變數 如果出錯,c庫會將錯誤 寫入errno全域性變數 通過呼叫perror 函式可以把該變數翻譯成使用者可以理解的錯誤 為了保證32和64位系統相容,系統呼叫在使用者空間和核心空間有不同的返回值型別 ...

linux 核心設計與實現相關

有待繼續補充。第一章 linux核心簡介 需要注意 核心開發其實並不難。第二章 從核心出發 核心開發需要注意 1 沒有c庫,c庫太大了 2 沒有記憶體保護機制 3 不要輕易使用浮點數 4 可移植的重要性 5 同步和併發 疑問 編譯和安裝核心?必須在linux下麼?其他機器安裝了gcc編譯器呢?能否編...