1. 程式人生 > >linux任務排程機制

linux任務排程機制

作業排程策略:

程序排程在近幾個版本中都進行了重要的修改。我們先了解一下程序排程的原理:

(1)程序型別
在linux排程演算法中,將程序分為兩種型別,即:I/O消耗型和CPU消耗型。例如文字處理程式與正在執行的Make的程式。文字處理程式大部份時間都在等待I/O裝置的輸入,而make程式大部份時間都在CPU的處理上。因此為了提高響應速度,I/O消耗程式應該有較高的優先順序,才能提高它的互動性。相反的,Make程式相比之下就不那麼重要了,只要它能處理完就行了。因此,基於這樣的原理,linux有一套互動程式的判斷機制。在task_struct結構中新增了一個成員:sleep_avg此值初始值為100。程序在CPU上執行時,此值減少。當程序在等待時,此值增加。最後,在排程的時候。根據sleep_avg的值重新計算優先順序。
(2)程序優先順序
正如我們在上面所說的:互動性強的需要高優先順序,互動性弱的需要低優先順序。在linux系統中,有兩種優先順序:普通優先順序和實時優先順序。我們在這裡主要分析的是普通優先順序,實時優先順序部份可自行了解。
(3)執行時間片
程序的時間片是指程序在搶佔前可以持續執行的時間。在linux中,時間片長短可根據優先順序來調整。程序不一定要一次執行完所有的時間片。可以在運時的中途被切換出去。
(4)程序搶佔
當一個程序被設為TASK_RUNING狀態時,它會判斷它的優先順序是否高於正在執行的程序,如果是,則設定排程標誌位,呼叫schedule()執行程序的排程。當一個程序的時間片為0時,也會執行程序搶佔。
 排程程式執行時,要在所有可執行狀態的程序中選擇最值得執行的程序投入執行。選擇程序的依據是什麼呢?在每個程序的task_struct結構中有以下四 項:policy、priority、counter、rt_priority。
這四項就是排程程式選擇程序的依據.其中,policy是程序的排程策略,用來區分兩種程序-實時和普通;priority是程序(實時和普通)的優先 級;counter 是程序剩餘的時間片,它的大小完全由priority決定;rt_priority是實時優先順序,這是實時程序所特有的,用於實時程序間的選擇。 

首先,Linux 根據policy從整體上區分實時程序和普通程序,因為實時程序和普通程序度排程是不同的,它們兩者之間,實時程序應該先於普通程序而執行,然後,對於同一型別的不同程序,採用不同的標準來選擇程序: 

policy的取值會有以下可能:

SCHED_OTHER 分時排程策略,(預設的)
SCHED_FIFO實時排程策略,先到先服務
SCHED_RR實時排程策略,時間片輪轉 實時程序將得到優先呼叫,實時程序根據實時優先順序決定排程權值,分時程序則通過nice和counter值決定權值,nice越小,counter越大,被排程的概率越大,也就是曾經使用了cpu最少的程序將會得到優先排程。 
SHCED_RR和SCHED_FIFO的不同:當採用SHCED_RR策略的程序的時間片用完,系統將重新分配時間片,並置於就緒佇列尾。放在佇列尾保證了所有具有相同優先順序的RR任務的排程公平。  
SCHED_FIFO一旦佔用cpu則一直執行。一直執行直到有 更高優先順序任務到達或自己放棄 。 
如果有相同優先順序的實時程序(根據優先順序計算的排程權值是一樣的)已經準備好,FIFO時必須等待該程序主動放棄後才可以執行這個優先順序相同的任務。而RR可以讓每個任務都執行一段時間。
相同點:
RR和FIFO都只用於實時任務。
建立時優先順序大於0(1-99)。
按照可搶佔優先順序排程演算法進行。
就緒態的實時任務立即搶佔非實時任務。


對於普通程序,Linux採用動態優先排程,選擇程序的依據就是程序counter的大小。程序建立時,優先順序priority被賦一個初值,一般為 0~70之間的數字,這個數字同時也是計數器counter的初值,就是說程序建立時兩者是相等的。字面上看,priority是"優先順序"、 counter是"計數器"的意思,然而實際上,它們表達的是同一個意思-程序的"時間片"。Priority代表分配給該程序的時間片,counter 表示該程序剩餘的時間片。在程序執行過程中,counter不斷減少,而priority保持不變,以便在counter變為0的時候(該程序用完了所分 配的時間片)對counter重新賦值。
當一個普通程序的時間片用完以後,並不馬上用priority對counter進行賦值,只有所有處於可執行狀態 的普通程序的時間片(p->counter==0)都用完了以後,才用priority對counter重新賦值,這個普通程序才有了再次被排程的 機會。這說明,普通程序執行過程中,counter的減小給了其它程序得以執行的機會,直至counter減為0時才完全放棄對CPU的使用,這就相對於 優先順序在動態變化,所以稱之為動態優先排程。至於時間片這個概念,和其他不同作業系統一樣的,Linux的時間單位也是"時鐘滴答",只是不同作業系統對 一個時鐘滴答的定義不同而已(Linux為10ms)。程序的時間片就是指多少個時鐘滴答,比如,若priority為20,則分配給該程序的時間片就為 20個時鐘滴答,也就是20*10ms=200ms。Linux中某個程序的排程策略(policy)、優先順序(priority)等可以作為引數由使用者 自己決定,具有相當的靈活性。核心建立新程序時分配給程序的時間片預設為200ms(更準確的,應為210ms),使用者可以通過系統呼叫改變它。 

對於實時程序,Linux採用了兩種排程策略,即FIFO(先來先服務排程)和RR(時間片輪轉排程)。因為實時程序具有一定程度的緊迫性,所以衡量一個 實時程序是否應該執行,Linux採用了一個比較固定的標準。實時程序的counter只是用來表示該程序的剩餘時間片,並不作為衡量它是否值得執行的標 準。實時程序的counter只是用來表示該程序的剩餘時間片,並不作為衡量它是否值得執行的標準,這和普通程序是有區別的。上面已經看到,每個程序有兩 個優先順序(動態優先順序和實時優先順序),實時優先順序就是用來衡量實時程序是否值得執行的。 

Linux根據policy的值將程序總體上分為實時程序和普通程序,提供了三種排程演算法:一種傳統的Unix排程程式和兩個由POSIX.1b(原名為 POSIX.4)作業系統標準所規定的"實時"排程程式。但這種實時只是軟實時,不滿足諸如中斷等待時間等硬實時要求,只是保證了當實時程序需要時一定只 把CPU分配給實時程序。 


非實時程序有兩種優先順序,一種是靜態優先順序,另一種是動態優先順序。實時程序又增加了第三種優先順序,實時優先順序。優先順序是一些簡單的整數,為了決定應該允許哪一個程序使用CPU的資源,用優先順序代表相對權值-優先順序越高,它得到CPU時間的機會也就越大。 

  (1) 靜態優先順序(priority)-不隨時間而改變,只能由使用者進行修改。它指明瞭在被迫和其他程序競爭CPU之前,該程序所應該被允許的時間片的最大值(但很可能的,在該時間片耗盡之前,程序就被迫交出了CPU)。 
  (2)動態優先順序(counter)-只要程序擁有CPU,它就隨著時間不斷減小;當它小於0時,標記程序重新排程。它指明瞭在這個時間片中所剩餘的時間量。 
  (3)實時優先順序(rt_priority)-指明這個程序自動把CPU交給哪一個其他程序;較高權值的程序總是優先於較低權值的程序。如果一個程序不是實時程序,其優先順序就是0,所以實時程序總是優先於非實時程序的(但實際上,實時程序也會主動放棄CPU)。 

當所有任務都採用FIFO排程策略時(SCHED_FIFO): 
1.建立程序時指定採用FIFO,並設定實時優先順序rt_priority(1-99)。 
2.如果沒有等待資源,則將該任務加入到就緒佇列中。 
3.排程程式遍歷就緒佇列,根據實時優先順序計算排程權值,選擇權值最高的任務使用cpu, 該FIFO任務將一直佔有cpu直到有優先順序更高的任務就緒(即使優先順序相同也不行)或者主動放棄(等待資源)。 
4.排程程式發現有優先順序更高的任務到達(高優先順序任務可能被中斷或定時器任務喚醒,再或被當前執行的任務喚醒,等等),則排程程式立即在當前任務堆疊中儲存當前cpu暫存器的所有資料,重新從高優先順序任務的堆疊中載入暫存器資料到cpu,此時高優先順序的任務開始執行。重複第3步。 
5.如果當前任務因等待資源而主動放棄cpu使用權,則該任務將從就緒佇列中刪除,加入等待佇列,此時重複第3步。 


當所有任務都採用RR排程策略(SCHED_RR)時: 
1.建立任務時指定排程引數為RR, 並設定任務的實時優先順序和nice值(nice值將會轉換為該任務的時間片的長度)。 
2.如果沒有等待資源,則將該任務加入到就緒佇列中。 
3.排程程式遍歷就緒佇列,根據實時優先順序計算排程權值,選擇權值最高的任務使用cpu。 
4. 如果就緒佇列中的RR任務時間片為0,則會根據nice值設定該任務的時間片,同時將該任務放入就緒佇列的末尾 。重複步驟3。 
5.當前任務由於等待資源而主動退出cpu,則其加入等待佇列中。重複步驟3。 


系統中既有分時排程,又有時間片輪轉排程和先進先出排程: 
1.RR排程和FIFO排程的程序屬於實時程序,以分時排程的程序是非實時程序。 
2. 當實時程序準備就緒後,如果當前cpu正在執行非實時程序,則實時程序立即搶佔非實時程序 。 
3. RR程序和FIFO程序都採

作業排程演算法:
(1)先來先服務演算法
(2)段作業優先排程演算法
(3)優先順序排程演算法
(4)時間片輪轉排程演算法
(5)最高響應比優先排程演算法
響應比=週轉時間/作業執行時間=(作業執行時間+作業等待時間)/作業執行時間=1+作業等待時間/作業執行時間;
作業週轉時間=作業完成時間-作業到達時間
(6)多級反饋佇列排程演算法
1、程序在進入待排程的佇列等待時,首先進入優先順序最高的Q1等待。
2、首先排程優先順序高的佇列中的程序。若高優先順序中佇列中已沒有排程的程序,則排程次優先順序佇列中的程序。例如:Q1,Q2,Q3三個佇列,只有在Q1中沒有程序等待時才去排程Q2,同理,只有Q1,Q2都為空時才會去排程Q3。
3、對於同一個佇列中的各個程序,按照時間片輪轉法排程。比如Q1佇列的時間片為N,那麼Q1中的作業在經歷了N個時間片後若還沒有完成,則進入Q2佇列等待,若Q2的時間片用完後作業還不能完成,一直進入下一級佇列,直至完成。
4、在低優先順序的佇列中的程序在執行時,又有新到達的作業,那麼在執行完這個時間片後,CPU馬上分配給新到達的作業(搶佔式)。
(7)實時排程演算法
A、最早截止時間優先排程演算法
B、最低鬆弛度優先排程演算法
種演算法是根據任務緊急的程度,來確定任務的優先順序。比如說,一個任務在200ms時必須完成而它本身執行需要100ms,所以此任務就必須在100ms之前排程執行,此任務的鬆弛度就是100ms。在實現此演算法時需要系統中有一個按鬆弛度排序的實時任務就緒佇列,鬆弛度最低的任務排在最烈的最前面,排程程式總是選擇就粗佇列中的首任務執行!(可理解為最早額定開始)

相關推薦

linux任務排程機制

作業排程策略: 程序排程在近幾個版本中都進行了重要的修改。我們先了解一下程序排程的原理: (1)程序型別 在linux排程演算法中,將程序分為兩種型別,即:I/O消耗型和CPU消耗型。例如文字處理程式與正在執行的Make的程式。文字處理程式大部份時間都在等待I/O裝置的輸入

linux 任務排程 shell指令碼

一個簡單的任務排程 首先要寫一個指令碼world.sh  目的是為了驗證 #!、bin/bash echo "hello world'  >> tt.txt wq 退出儲存 然後更改許可權 chomd 755 world.sh 智遊更改許可權 sh才能變成可執行指

linux程序排程機制

版本宣告:轉載請註明出處,未經允許,禁止商業用途。 linux是以執行緒為單位進行CPU排程的。所以下面的描述中所說的執行緒和程序從CPU排程角度來說是等效。 Linux程序優先順序: Priority。程序的優先順序是作業系統自己給定並且動態調整的。使用者可以通過nice值來調整實際優先順序。 C

linux任務排程應用

定義一個mytask.sh指令碼,該指令碼的功能為,向 /tem/mydate.txt檔案中添加當前日期時間,而後使用crontab設定每隔1分鐘呼叫一次 mystak.sh指令碼 實現的過程大致可以分為這幾步 建立mytask.sh指令碼,該指令

linux任務排程基本說明

任務排程指的是系統在某個實踐執行特定的命令或程式 任務排程可以分為兩種 系統任務:有些重要的工作必須周而復始的執行,例如病毒掃描 個別使用者工作:個別使用者希望執行某些程式,比如對資料庫的備份 任務排程基本語法 cron

詳解UCOS中的任務排程機制

詳解UCOS的任務排程機制 一個作業系統核心提供的最核心的功能就是任務的排程機制,作業系統的核心排程機制有大體有兩種,一種是時間片輪番排程,就是將一個系統週期分為好幾段,第一段時間執行第一個任務,第二段時間執行第二個任務....每一段時間都執行相應的任務。一種就是搶佔式實

VxWorks中的任務排程(五):VxWorks任務排程機制

 第四節: VxWorks任務排程機制 在作業系統中,任務排程存在兩種方式:基於優先順序排程和基於時間片排程。嵌入式系統中任務排程一般都是基於優先順序的排程方式,VxWorks也就是傳說中的搶佔式排程。有沒有方法可以關閉這種搶佔式排程呢?VxWorks作業系統定義了一個

Linux之定時任務排程

一、crond 任務排程 crontab 進行 定時任務的設定 1、 概述 任務排程:是指系統在某個時間執行的特定的命令或程式。 任務排程分類:1.系統工作:有些重要的工作必須周而復始地執行。如病毒掃描等 2、 基本語法 crontab [選項] 常用選

linux--工作排程(計劃任務

linux工作排程有兩種:at,cron · at:at是一個可以處理僅執行一次就結束排程的命令。說白了就是在某個時間需要幹某一件事,例如在2018年10月12日下午一點要執行一個數據庫矯正指令碼。 · crontab:crontab是週期性的排程設定的命令。說白了就是週期性的例如每天

Linux定時任務排程

crond 任務排程 crontab 進行 定時任務的設定,。 概述     任務排程:是指系統在某個時間執行的特定的命令或程式。     任務排程分類:1.系統工作:有些重要的工作必須周而復始地執行。如病毒掃描等

Linux學習_任務排程基本說明

crond 任務排程 crontab 進行定時任務的設定 概述 任務排程:是指系統在某個時間執行的特定的命令或程式。 任務排程分類: 1.系統工作:有些重要的工作必須周而復始地執行。如病毒掃描等 2.個別使用者工作:個別使用者可能希望執行某些程式,比如對my

Linux 的 crontab 定時器 任務排程

原創轉載自海牛部落-青牛,http://hainiubl.com/topics/188 1.linux的crontab cron不停地檢查所有配置的任務在當前是否應該執行,任務執行的最小時間間隔是1分鐘,也就是說任務最頻繁只能每分鐘執行一次。 (1).crontab命令選項 cronta

Linux程序、執行緒、任務排程】二

Linux程序生命週期(就緒、執行、睡眠、停止、殭屍) 殭屍的含義 停止狀態與作業控制, cpulimit 記憶體洩漏的真實含義 task_struct以及task_struct之間的關係 初見fork和殭屍 本篇接著上一篇文章主要記錄以下學習內容: f

Linux學習筆記】17_Linux定時任務排程

crond 任務排程 crontab 進行定時任務的設定。 概述 任務排程 是指系統在某個時間執行的特定的命令或程式。 任務排程分類 系統工作:有些重要的工作必須周而復始地執行。如病毒掃描等

Linux】初識crond任務排程

一、基本介紹 任務排程:是指系統再某個時間執行的特定的命令或程式。 任務排程分類:1.系統工作:有些重要的工作必須周而復始的執行,比如病毒掃描等。                    

Linux下定時任務(系統任務排程、使用者任務排程)crontab使用詳解

一、簡介 crond是Linux下用來週期性的執行某種任務或等待處理某些事件的一個守護程序,與windows下的計劃任務類似,在CentOS Linux release 7.2.1511中預設是開機啟動的,大家可以使用命令:systemctl status c

linux核心完全剖析》筆記04-任務排程

問題: 任務排程在何時發生 任務排程的基本策略是什麼 任務切換時怎麼做到的 1. 隱含的睡眠佇列 建立睡眠等待佇列的原因,是因為有先後順序等待某項資源,然後要按順序喚醒程序,就要依照這裡隱含的佇列順序進行 sche

linux RCU鎖機制分析

nbsp -i html 都在 而且 content 服務器 單詞 插入 openVswitch(OVS)源代碼之linux RCU鎖機制分析 分類: linux內核 | 標簽: 雲計算,openVswitch,linux內核,RCU鎖機制 | 作者: yuzh

Linux任務計劃、周期性任務執行

linux任務計劃、周期性任務執行 crontab概論未來的某時間點執行一次某任務:at, batch 周期性運行某任務:crontab 執行結果:會通過郵件發送給用戶 查看郵箱服務是否開啟:(25端口) ~]# netstat -tnlp ~]# ss -tnl本地電子郵件服務:smtp:simple m

10.23 linux任務計劃cron10.24chkconfig工具10.25 systemd管理服務10.26 unit介紹 10.27 target介紹

10.23 linux任務計劃cron10.24chkconfig工具10.25 systemd管理服務10.26 unit介紹 10.27 target介紹- 10.23 linux任務計劃cron - 10.24 chkconfig工具 - 10.25 systemd管理服務 - 10.26 unit介紹