程序排程的概念

2021-05-22 08:44:53 字數 2551 閱讀 1001

從本博開始,我們就要慢慢深入到程序管理乃至整個核心的核心概念——程序排程裡邊了。這裡,先把相關概念理一理。

剛接觸linux,我們就講了,它是乙個分時系統,卻由具備實時系統的特性。所以與任何分時系統一樣,通過乙個程序到另乙個程序的快速切換,達到表面上看來多個程序同時執行的神奇效果。我們已經在前面的博文中講過了程序切換的本身已,從本博開始,我們將進入程序管理最最最重要的部分——程序的排程,主要關心什麼時候進行程序切換及選擇哪乙個程序來執行。

借鑑了ulk-3的方法,為了敘述起來更簡單,我們仍以 80x86體系結構為例,尤其是,我們假定系統採用統一記憶體訪問模型(uniform memory access),而且系統時鐘設定為1ms。

linux的排程基於分時技術(time-sharing)。我先來大體說說這個技術的內涵:

多個程序以「時間多路復用」方式執行,因為cpu的時間被分成「片(slice)」,給每個可執行程序分配一片。單處理器在任何給定的時刻只能執行乙個程序,如果當前執行程序的時間片或時限(quantum)到期時,該程序還沒有執行完畢,則程序切換就可以發生。 分時依賴於定時中斷,具體來說就是我們在中斷處理專題中講過的那個位於arch/i386/kernel/time.c檔案中著名的timer_interrupt中斷服務函式。因此,對所有的程序是透明的,不需要在程式中插入額外的**來保證cpu分時。

第一次讀這句話肯定會不解,沒關係,可以通過理解具體的實現後,再來讀這樣的概括性的文字,就好理解了。繼續往下走,定時中斷就像心臟起搏器那樣驅動著程序排程,同時排程策略也是根據程序的優先順序對它們進行分類。有時用複雜的演算法求出程序當前的優先順序,但最後的結果是相同的:每個程序都與乙個值相關聯,這個值表示把程序如何適當地分配給cpu。

在linux中,程序的優先順序是動態的。 排程程式跟蹤程序正在做什麼,並周期性地調整它們的優先順序。 在這種方式下,在較長的時間間隔內沒有使用cpu的程序,通過動態地增加它們的優先順序來提公升它們被排程的可能性。相應地,對於已經在cpu上執行了較長時間的程序,通過減少它們的優先順序來處罰它們。

下乙個比較重要的概念是——程序搶占。

linux的程序是搶占式的,什麼意思?如果程序進入task_running狀態(通常是剛剛變為可執行的程序),核心檢查它的動態優先順序(這裡千萬要注意,核心是通過動態優先順序來判斷的,而使用者只能通過系統呼叫來設定程序的靜態優先順序 )是否大於當前正執行程序的優先順序。如果是,current的執行被中斷,並呼叫排程程式選擇另乙個程序執行。另一種情況,當程序在它的時間片到期時也可以被搶占。此時,當前程序thread_info結構中的tif_need_resched標誌被設定,以便定時中斷處理程式終止時排程程式被呼叫。

可能還是沒有說清楚,那讓我們考慮乙個例子吧:如果只有兩個程式—乙個文字編輯程式和乙個核心程序(kswapd)正在執行。 文字編輯程式是乙個互動式程式,因此,它的動態優先順序高於kswapd。 不過,因為編輯程式交替於暫停思考與資料輸入之間,因此,它經常被掛起;此外,兩次擊鍵之間的平均延遲相對較長。 所以,只要使用者一按鍵,中斷就發生,核心喚醒文字編輯程序。 核心也確定編輯程序的動態優先順序確實是高於current的優先順序(當前正執行的程序,即kswapd),因此,編輯程序的tif_need_resched標誌被設定,如此來強迫核心處理完中斷時啟用排程程式。排程程式選擇編輯程序並執行程序切換;結果,編輯程序很快恢復執行,並把使用者敲的字元回顯在螢幕上。當處理完字元時,文字編輯程序自己掛起等待下一次擊鍵,kswapd恢復執行。

注意被搶占的程序並沒有被掛起,因為它還處於task_running狀態,只不過不再使用cpu。此外,記住,linux2.6核心是搶占式的,這意味著程序無論是處於核心態還是使用者態,都可能被搶占。

再講乙個概念——時間片。

時間片就是cpu分給某個程序的時間。在程序的描述符中,有乙個很重要的字段:

task->time_slice

它是程序的時間片還剩餘的時鐘節拍。我們多次提過了,定時器中斷就像乙個心臟起搏器一樣,每次時鐘中斷,就減少它乙個節拍,當它為0的時候就執行排程。

那麼時間片的長短對系統效能就很關鍵了:它既不能太長也不能太短。

如果平均時間片太短,由程序切換引起的系統額外開銷就變得非常高。例如,假定程序切換需要5ms,如果時間片也是5ms,那麼,cpu至少把50%的時間花費在程序切換上。

如果平均時間片太長,程序看起來就不再是併發執行。 例如,讓我們假定把時間片設定為5秒,那麼,每個可執行程序執行大約5秒,但是暫停的時間更長(典型的是5秒乘以可執行程序的個數)。

通常認為長的時間片降低互動式應用程式的響應時間,但這往往是錯誤的。正如前面例子中提到的文字編輯器程序——互動式程序相對有較高的優先順序,因此,不管時間片是多長,它們都會很快地搶占並處理程序。

在一些情況下,乙個太長的時間片會降低系統的響應能力。例如,假定兩個使用者在各自的shell提示符下分別輸入兩條命令,其中一條啟動乙個cpu受限型的程序,而另一條啟動乙個互動式應用。兩個shell都建立乙個新程序,並把使用者命令的執行委託給新程序。此外,又假定這樣的新程序最初有相同的優先順序(linux預先並不知道執行程序是批處理的還是互動式的)。 現在,如果排程程式選擇cpu受限型的程序執行,那麼,另乙個程序開始執行前就可能要等待乙個時間片。因此,如果這樣的時間片較長,那麼,看起來系統就可能對使用者的請求反應遲鈍。

時間片大小的選擇總是一種折衷。linux採取單憑經驗的方法,即選擇盡可能長、同時能保持良好響應時間的乙個時間片。

《程序排程》1 排程原理與基礎概念

在正式介紹程序排程的細節前需要對一些概念作出介紹 程序排程的職責 負責決定在什麼時間,將那個程序投入使用,以及程序執行的時間。從而達到系統資源最大限度發揮,多程序併發執行的效果。1 就緒和執行狀態 task running 此時程式已經被掛入執行佇列,處於準備執行的狀態,一旦獲得處理器的使用許可權,...

程序排程 模擬程序排程的過程

通過這次實驗,理解程序排程的過程,進一步掌握程序狀態的轉變 程序排程的策略,進一步體會多道程式併發執行的特點,並分析具體的排程演算法的特點,掌握對系統效能的評價方法。編寫程式模擬實現程序的輪轉法排程過程,模擬程式只對pcb進行相應的排程模擬操作,不需要實際程式。假設初始狀態為 有n個程序處於就緒狀態...

程序的排程

在我的作業系統還未進入程序之前,應該好好學習一下程序的排程。下面就來討論一下。1 先來先服務 fcfs 顧名思意,就是嚴格按照程序在佇列中的順序依次執行。沒有太多可說的。2 迴圈法 round robin 基本思想是讓每個程序在就緒佇列中的等待時間與享受服務的時間成比例。基本概念是將cpu的處理時間...