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

2021-09-26 18:21:59 字數 2949 閱讀 5695

在正式介紹程序排程的細節前需要對一些概念作出介紹:

程序排程的職責:負責決定在什麼時間,將那個程序投入使用,以及程序執行的時間。從而達到系統資源最大限度發揮,多程序併發執行的效果。

1).就緒和執行狀態:task_running:此時程式已經被掛入執行佇列,處於準備執行的狀態,一旦獲得處理器的使用許可權,即可進入執行的狀態,在進入執行執行狀態之後,狀態標誌位不會發生變化,但linux中會把乙個專門指向當前執行任務的指標current指向它以表示是乙個正在執行的程序;

2).可中斷等待狀態:task_interruptibl:程序申請未獲得他所申請的資源而處於等待的狀態,一旦資源的申請完成或者有喚醒的訊號,會立即結束等待進入就緒狀態;

3).不可中斷等待狀態:task_uninterruptibl:程序處於等待資源的狀態,一旦資源有效就立即進入就緒狀態,但是此狀態不能被其他的訊號或者中斷喚醒,只有申請的資源有效時才能被喚醒。  核心程序的常見方式,在核心中很多的程序是不能被打斷的。

4).停止狀態:tack_stopped:程序收到sigstop訊號後就由執行狀態進入這個停止狀態,當收到sigcont訊號時恢復執行狀態;(暫停狀態、掛起狀態);

5).終止狀態(僵死狀態):task_sead:程序由於某種原因而終止執行,程序除task_struct和少數資源以外的所有資源均被**,並且系統將不再對其予以理睬。

程序間的狀態圖如下:

①程序狀態轉換的時刻,如程序中止、程序睡眠等;

②可執行佇列中新增加乙個程序時;

③當前程序的時間片用完時;

④程序從系統呼叫返回使用者態時;

⑤核心處理完中斷後,程序返回使用者態時。

說到程序排程就不得不說說多工系統,在單任務系統中處理器僅能單一的執行乙個程序,所以也就不需要進行程序間的排程。而多工系統能同時併發執行多個程序的作業系統。在單個處理器的機器中,由於多工系統的排程會產生多個程序同時併發執行的幻覺。

對於多工系統可以劃分為兩類:搶占式多工系統非搶占式多工系統

搶占式多工系統:在這種系統中由系統的程序排程系統負責決定程序的開始、停止,而乙個程序在自己的時間片(每乙個程序在被搶占之前,排程系統為其預先分配乙個供其執行的處理器時間段,這個預設的處理器時間段就是時間片)使用完畢之後被強制掛起使得另乙個程序被排程執行的過程叫做搶占。這也是linux採用的任務處理方式。

非搶占多工系統:程序一直執行,直到程序自己結束自己的任務,下乙個程序才得以執行。程序自動掛起自己的操作稱為讓步。顯然這種系統存在很大的弊端。

下面開始我們真正的主題:linux程序排程的排程策略。

排程策略的任務:決定排程程式在何時讓什麼程序執行;優化程序使用處理器的時間。

從程序的排程策略角度來看,程序可以分為:io消耗型、處理器消耗型。

io消耗型:程序在執行的時間內,大部分的時間用於提交io請求、等待io請求,而其真正執行的時間只是很少的一部分。在等待的更多的io請求時最後總會阻塞。  最典型的就是圖形化介面程序,大部分的時間用於等待鍵盤、滑鼠的輸入等使用者互動操作,而真正用於處理互動運算元據的時間少之又少。

處理器消耗型:大部分的時間用於執行**,除非被搶占,否則會一直的執行下去。對於此類的程序排程策略往往是降低對其的排程頻率,延長其處理時間。  最典型的就是大量數字計算的程式,例如matlab。

在程序的排程演算法中最基本,也是使用最多的就是基於優先順序的排程。而其中最具代表的就是多級反饋佇列演算法:根據程序的緊急程度、程序的價值、以及其對處理器時間的需求來設定程序的優先順序,優先順序高的先執行,同等優先順序的程序輪方式排程執行。

linux中使用兩種不同的優先順序範圍來影響程序的排程,分別是:nice優先順序和實時優先順序。這兩種優先順序是完全互不相交的範疇。

nice優先順序:範圍是-20~19,預設值是0,越大優先順序越小。在linux系統中為了實現更大的公平性,nice值代表著分配給程序的時間片的比例(這點十分關鍵,在後面有分析原因)。而在其他的系統nice值直接與為程序分配的時間片大小成反比,直接代表分配給程序的時間片絕對值。  ps -el 檢視系統中的程序列表,ni表示的就是程序對應的nice值。

實時優先順序:範圍0~90,越高的實時優先順序數值對應越高的程序優先順序。任何的實時程序的優先順序都高於普通程序。

時間片:乙個數值,用於表明程序在被搶占之前所能持續執行的時間。排程策略負責規定乙個預設的時間片。過長的時間片會給使用者帶來明顯的卡頓感覺,影響使用者的互動體驗;而太短的時間片會導致處理器花費在在程序間切換的時間比重增大,處理器的利用率降低。此時io消耗型和處理器消耗型程序的矛盾也體現了出來,io消耗型偏向於更小的時間片以達到更快的處理,更少的等待時間,相反處理器消耗型偏向於更長的時間片以爭取更多的執行時間,更高的處理器利用率(處理消耗型程序的程序間切換耗費的資源很多)。

時間片的設定:linux系統與其他的很多系統不同,在其他大部分的系統將預設的時間片設定為10ms,但在linux系統中的cfs排程器(程序間排程器)並不為每個程序設定具體的時間片,而是將處理器的使用比例劃分給程序,這樣每個程序的占有的處理時間也與處理器的能力密切相關。同時這個比例還會受到nice值的影響,nice越高的程序優先順序越高,能獲得更高的處理器使用比例。

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

程序排程 1

最近特別有感觸,各層面的設計似乎都可以從作業系統中找出相似的設計,作業系統幾乎是設計集大成者,所以重新又開始看作業系統相關的書籍。最近可能都是一些記錄性的文章,作業系統原理因為是教學課程,所以不會另做筆記。從重讀linux核心開始,記錄學習過程。本文均摘自 linux核心與實現 因為硬體資源總是有限...

程序排程與作業排程

作業排程按一定的演算法從磁碟上的 輸入井 中選擇資源能得到滿足的作業裝入記憶體,使作業有機會去占用處理器執行。但是,乙個作業能否占用處理器,什麼時間能夠占用處理器,必須由程序排程來決定。所以,作業排程選中了乙個作業且把它裝入記憶體時,就應為該作業建立乙個程序,若有多個作業被裝入記憶體,則記憶體中同時...

程序排程的概念

從本博開始,我們就要慢慢深入到程序管理乃至整個核心的核心概念 程序排程裡邊了。這裡,先把相關概念理一理。剛接觸linux,我們就講了,它是乙個分時系統,卻由具備實時系統的特性。所以與任何分時系統一樣,通過乙個程序到另乙個程序的快速切換,達到表面上看來多個程序同時執行的神奇效果。我們已經在前面的博文中...