欧美日韩不卡一区二区三区,www.蜜臀.com,高清国产一区二区三区四区五区,欧美日韩三级视频,欧美性综合,精品国产91久久久久久,99a精品视频在线观看

操作系統(tǒng)

解讀Linux系統(tǒng)中的進(jìn)程調(diào)度

時間:2025-03-19 23:26:51 操作系統(tǒng) 我要投稿
  • 相關(guān)推薦

解讀Linux系統(tǒng)中的進(jìn)程調(diào)度

  解讀Linux系統(tǒng)中的進(jìn)程調(diào)度

  操作系統(tǒng)要實(shí)現(xiàn)多進(jìn)程,進(jìn)程調(diào)度必不可少。

  有人說,進(jìn)程調(diào)度是操作系統(tǒng)中最為重要的一個部分。我覺得這種說法說得太絕對了一點(diǎn),就像很多人動輒就說"某某函數(shù)比某某函數(shù)效率高XX倍"一樣,脫離了實(shí)際環(huán)境,這些結(jié)論是比較片面的。

  而進(jìn)程調(diào)度究竟有多重要呢? 首先,我們需要明確一點(diǎn):進(jìn)程調(diào)度是對TASK_RUNNING狀態(tài)的進(jìn)程進(jìn)行調(diào)度(參見《linux進(jìn)程狀態(tài)淺析》)。如果進(jìn)程不可執(zhí)行(正在睡眠或其他),那么它跟進(jìn)程調(diào)度沒多大關(guān)系。

  所以,如果你的系統(tǒng)負(fù)載非常低,盼星星盼月亮才出現(xiàn)一個可執(zhí)行狀態(tài)的進(jìn)程。那么進(jìn)程調(diào)度也就不會太重要。哪個進(jìn)程可執(zhí)行,就讓它執(zhí)行去,沒有什么需要多考慮的。

  反之,如果系統(tǒng)負(fù)載非常高,時時刻刻都有N多個進(jìn)程處于可執(zhí)行狀態(tài),等待被調(diào)度運(yùn)行。那么進(jìn)程調(diào)度程序?yàn)榱藚f(xié)調(diào)這N個進(jìn)程的執(zhí)行,必定得做很多工作。協(xié)調(diào)得不好,系統(tǒng)的性能就會大打折扣。這個時候,進(jìn)程調(diào)度就是非常重要的。

  盡管我們平常接觸的很多計算機(jī)(如桌面系統(tǒng)、網(wǎng)絡(luò)服務(wù)器、等)負(fù)載都比較低,但是linux作為一個通用操作系統(tǒng),不能假設(shè)系統(tǒng)負(fù)載低,必須為應(yīng)付高負(fù)載下的進(jìn)程調(diào)度做精心的設(shè)計。

  當(dāng)然,這些設(shè)計對于低負(fù)載(且沒有什么實(shí)時性要求)的環(huán)境,沒多大用。極端情況下,如果CPU的負(fù)載始終保持0或1(永遠(yuǎn)都只有一個進(jìn)程或沒有進(jìn)程需要在CPU上運(yùn)行),那么這些設(shè)計基本上都是徒勞的。

  優(yōu)先級

  現(xiàn)在的操作系統(tǒng)為了協(xié)調(diào)多個進(jìn)程的“同時”運(yùn)行,最基本的手段就是給進(jìn)程定義優(yōu)先級。定義了進(jìn)程的優(yōu)先級,如果有多個進(jìn)程同時處于可執(zhí)行狀態(tài),那么誰優(yōu)先級高誰就去執(zhí)行,沒有什么好糾結(jié)的了。

  那么,進(jìn)程的優(yōu)先級該如何確定呢?有兩種方式:由用戶程序指定、由內(nèi)核的調(diào)度程序動態(tài)調(diào)整。(下面會說到)

  linux內(nèi)核將進(jìn)程分成兩個級別:普通進(jìn)程和實(shí)時進(jìn)程。實(shí)時進(jìn)程的優(yōu)先級都高于普通進(jìn)程,除此之外,它們的調(diào)度策略也有所不同。

  實(shí)時進(jìn)程的調(diào)度

  實(shí)時,原本的涵義是“給定的操作一定要在確定的時間內(nèi)完成”。重點(diǎn)并不在于操作一定要處理得多快,而是時間要可控(在最壞情況下也不能突破給定的時間)。

  這樣的“實(shí)時”稱為“硬實(shí)時”,多用于很精密的系統(tǒng)之中(比如什么火箭、導(dǎo)彈之類的)。一般來說,硬實(shí)時的系統(tǒng)是相對比較專用的。

  像linux這樣的通用操作系統(tǒng)顯然沒法滿足這樣的要求,中斷處理、虛擬內(nèi)存、等機(jī)制的存在給處理時間帶來了很大的不確定性。硬件的cache、磁盤尋道、總線爭用、也會帶來不確定性。

  比如考慮“i++;”這么一句C代碼。絕大多數(shù)情況下,它執(zhí)行得很快。但是極端情況下還是有這樣的可能:

  1、i的內(nèi)存空間未分配,CPU觸發(fā)缺頁異常。而linux在缺頁異常的處理代碼中試圖分配內(nèi)存時,又可能由于系統(tǒng)內(nèi)存緊缺而分配失敗,導(dǎo)致進(jìn)程進(jìn)入睡眠;

  2、代碼執(zhí)行過程中硬件產(chǎn)生中斷,linux進(jìn)入中斷處理程序而擱置當(dāng)前進(jìn)程。而中斷處理程序的處理過程中又可能發(fā)生新的硬件中斷,中斷永遠(yuǎn)嵌套不止……;

  等等……

  而像linux這樣號稱實(shí)現(xiàn)了“實(shí)時”的通用操作系統(tǒng),其實(shí)只是實(shí)現(xiàn)了“軟實(shí)時”,即盡可能地滿足進(jìn)程的實(shí)時需求。

  如果一個進(jìn)程有實(shí)時需求(它是一個實(shí)時進(jìn)程),則只要它是可執(zhí)行狀態(tài)的,內(nèi)核就一直讓它執(zhí)行,以盡可能地滿足它對CPU的需要,直到它完成所需要做的事情,然后睡眠或退出(變?yōu)榉强蓤?zhí)行狀態(tài))。

  而如果有多個實(shí)時進(jìn)程都處于可執(zhí)行狀態(tài),則內(nèi)核會先滿足優(yōu)先級最高的實(shí)時進(jìn)程對CPU的需要,直到它變?yōu)榉强蓤?zhí)行狀態(tài)。

  于是,只要高優(yōu)先級的實(shí)時進(jìn)程一直處于可執(zhí)行狀態(tài),低優(yōu)先級的'實(shí)時進(jìn)程就一直不能得到CPU;只要一直有實(shí)時進(jìn)程處于可執(zhí)行狀態(tài),普通進(jìn)程就一直不能得到CPU。

  那么,如果多個相同優(yōu)先級的實(shí)時進(jìn)程都處于可執(zhí)行狀態(tài)呢?這時就有兩種調(diào)度策略可供選擇:

  1、SCHED_FIFO:先進(jìn)先出。直到先被執(zhí)行的進(jìn)程變?yōu)榉强蓤?zhí)行狀態(tài),后來的進(jìn)程才被調(diào)度執(zhí)行。在這種策略下,先來的進(jìn)程可以執(zhí)行sched_yield系統(tǒng)調(diào)用,自愿放棄CPU,以讓權(quán)給后來的進(jìn)程;

  2、SCHED_RR:輪轉(zhuǎn)調(diào)度。內(nèi)核為實(shí)時進(jìn)程分配時間片,在時間片用完時,讓下一個進(jìn)程使用CPU;

  強(qiáng)調(diào)一下,這兩種調(diào)度策略以及sched_yield系統(tǒng)調(diào)用都僅僅針對于相同優(yōu)先級的多個實(shí)時進(jìn)程同時處于可執(zhí)行狀態(tài)的情況。

  在linux下,用戶程序可以通過sched_setscheduler系統(tǒng)調(diào)用來設(shè)置進(jìn)程的調(diào)度策略以及相關(guān)調(diào)度參數(shù);sched_setparam系統(tǒng)調(diào)用則只用于設(shè)置調(diào)度參數(shù)。這兩個系統(tǒng)調(diào)用要求用戶進(jìn)程具有設(shè)置進(jìn)程優(yōu)先級的能力(CAP_SYS_NICE,一般來說需要root權(quán)限)(參閱capability相關(guān)的文章)。

  通過將進(jìn)程的策略設(shè)為SCHED_FIFO或SCHED_RR,使得進(jìn)程變?yōu)閷?shí)時進(jìn)程。而進(jìn)程的優(yōu)先級則是通過以上兩個系統(tǒng)調(diào)用在設(shè)置調(diào)度參數(shù)時指定的。

  對于實(shí)時進(jìn)程,內(nèi)核不會試圖調(diào)整其優(yōu)先級。因?yàn)檫M(jìn)程實(shí)時與否?有多實(shí)時?這些問題都是跟用戶程序的應(yīng)用場景相關(guān),只有用戶能夠回答,內(nèi)核不能臆斷。

  綜上所述,實(shí)時進(jìn)程的調(diào)度是非常簡單的。進(jìn)程的優(yōu)先級和調(diào)度策略都由用戶定死了,內(nèi)核只需要總是選擇優(yōu)先級最高的實(shí)時進(jìn)程來調(diào)度執(zhí)行即可。唯一稍微麻煩一點(diǎn)的只是在選擇具有相同優(yōu)先級的實(shí)時進(jìn)程時,要考慮兩種調(diào)度策略。

  普通進(jìn)程的調(diào)度

  實(shí)時進(jìn)程調(diào)度的中心思想是,讓處于可執(zhí)行狀態(tài)的最高優(yōu)先級的實(shí)時進(jìn)程盡可能地占有CPU,因?yàn)樗袑?shí)時需求;而普通進(jìn)程則被認(rèn)為是沒有實(shí)時需求的進(jìn)程,于是調(diào)度程序力圖讓各個處于可執(zhí)行狀態(tài)的普通進(jìn)程和平共處地分享CPU,從而讓用戶覺得這些進(jìn)程是同時運(yùn)行的。

  與實(shí)時進(jìn)程相比,普通進(jìn)程的調(diào)度要復(fù)雜得多。內(nèi)核需要考慮兩件麻煩事:

  一、動態(tài)調(diào)整進(jìn)程的優(yōu)先級

  按進(jìn)程的行為特征,可以將進(jìn)程分為“交互式進(jìn)程”和“批處理進(jìn)程”:

  交互式進(jìn)程(如桌面程序、服務(wù)器、等)主要的任務(wù)是與外界交互。這樣的進(jìn)程應(yīng)該具有較高的優(yōu)先級,它們總是睡眠等待外界的輸入。而在輸入到來,內(nèi)核將其喚醒時,它們又應(yīng)該很快被調(diào)度執(zhí)行,以做出響應(yīng)。比如一個桌面程序,如果鼠標(biāo)點(diǎn)擊后半秒種還沒反應(yīng),用戶就會感覺系統(tǒng)“卡”了;

  批處理進(jìn)程(如編譯程序)主要的任務(wù)是做持續(xù)的運(yùn)算,因而它們會持續(xù)處于可執(zhí)行狀態(tài)。這樣的進(jìn)程一般不需要高優(yōu)先級,比如編譯程序多運(yùn)行了幾秒種,用戶多半不會太在意;

  如果用戶能夠明確知道進(jìn)程應(yīng)該有怎樣的優(yōu)先級,可以通過nice、setpriority系統(tǒng)調(diào)用來對優(yōu)先級進(jìn)行設(shè)置。(如果要提高進(jìn)程的優(yōu)先級,要求用戶進(jìn)程具有CAP_SYS_NICE能力。)

  然而應(yīng)用程序未必就像桌面程序、編譯程序這樣典型。程序的行為可能五花八門,可能一會兒像交互式進(jìn)程,一會兒又像批處理進(jìn)程。以致于用戶難以給它設(shè)置一個合適的優(yōu)先級。

  再者,即使用戶明確知道一個進(jìn)程是交互式還是批處理,也多半礙于權(quán)限或因?yàn)橥祽卸蝗ピO(shè)置進(jìn)程的優(yōu)先級。(你又是否為某個程序設(shè)置過優(yōu)先級呢?)

  于是,最終,區(qū)分交互式進(jìn)程和批處理進(jìn)程的重任就落到了內(nèi)核的調(diào)度程序上。

  調(diào)度程序關(guān)注進(jìn)程近一段時間內(nèi)的表現(xiàn)(主要是檢查其睡眠時間和運(yùn)行時間),根據(jù)一些經(jīng)驗(yàn)性的公式,判斷它現(xiàn)在是交互式的還是批處理的?程度如何?最后決定給它的優(yōu)先級做一定的調(diào)整。

  進(jìn)程的優(yōu)先級被動態(tài)調(diào)整后,就出現(xiàn)了兩個優(yōu)先級:

  1、用戶程序設(shè)置的優(yōu)先級(如果未設(shè)置,則使用默認(rèn)值),稱為靜態(tài)優(yōu)先級。這是進(jìn)程優(yōu)先級的基準(zhǔn),在進(jìn)程執(zhí)行的過程中往往是不改變的;

  2、優(yōu)先級動態(tài)調(diào)整后,實(shí)際生效的優(yōu)先級。這個值是可能時時刻刻都在變化的;

  二、調(diào)度的公平性

  在支持多進(jìn)程的系統(tǒng)中,理想情況下,各個進(jìn)程應(yīng)該是根據(jù)其優(yōu)先級公平地占有CPU。而不會出現(xiàn)“誰運(yùn)氣好誰占得多”這樣的不可控的情況。

  linux實(shí)現(xiàn)公平調(diào)度基本上是兩種思路:

  1、給處于可執(zhí)行狀態(tài)的進(jìn)程分配時間片(按照優(yōu)先級),用完時間片的進(jìn)程被放到“過期隊(duì)列”中。等可執(zhí)行狀態(tài)的進(jìn)程都過期了,再重新分配時間片;

  2、動態(tài)調(diào)整進(jìn)程的優(yōu)先級。隨著進(jìn)程在CPU上運(yùn)行,其優(yōu)先級被不斷調(diào)低,以便其他優(yōu)先級較低的進(jìn)程得到運(yùn)行機(jī)會;

  后一種方式有更小的調(diào)度粒度,并且將“公平性”與“動態(tài)調(diào)整優(yōu)先級”兩件事情合而為一,大大簡化了內(nèi)核調(diào)度程序的代碼。因此,這種方式也成為內(nèi)核調(diào)度程序的新寵。

  強(qiáng)調(diào)一下,以上兩點(diǎn)都是僅針對普通進(jìn)程的。而對于實(shí)時進(jìn)程,內(nèi)核既不能自作多情地去動態(tài)調(diào)整優(yōu)先級,也沒有什么公平性可言。

  普通進(jìn)程具體的調(diào)度算法非常復(fù)雜,并且隨linux內(nèi)核版本的演變也在不斷更替(不僅僅是簡單的調(diào)整),所以本文就不繼續(xù)深入了。

  調(diào)度程序的效率

  “優(yōu)先級”明確了哪個進(jìn)程應(yīng)該被調(diào)度執(zhí)行,而調(diào)度程序還必須要關(guān)心效率問題。調(diào)度程序跟內(nèi)核中的很多過程一樣會頻繁被執(zhí)行,如果效率不濟(jì)就會浪費(fèi)很多CPU時間,導(dǎo)致系統(tǒng)性能下降。

  在linux 2.4時,可執(zhí)行狀態(tài)的進(jìn)程被掛在一個鏈表中。每次調(diào)度,調(diào)度程序需要掃描整個鏈表,以找出最優(yōu)的那個進(jìn)程來運(yùn)行。復(fù)雜度為O(n);

  在linux 2.6早期,可執(zhí)行狀態(tài)的進(jìn)程被掛在N(N=140)個鏈表中,每一個鏈表代表一個優(yōu)先級,系統(tǒng)中支持多少個優(yōu)先級就有多少個鏈表。每次調(diào)度,調(diào)度程序只需要從第一個不為空的鏈表中取出位于鏈表頭的進(jìn)程即可。這樣就大大提高了調(diào)度程序的效率,復(fù)雜度為O(1);

  在linux 2.6近期的版本中,可執(zhí)行狀態(tài)的進(jìn)程按照優(yōu)先級順序被掛在一個紅黑樹(可以想象成平衡二叉樹)中。每次調(diào)度,調(diào)度程序需要從樹中找出優(yōu)先級最高的進(jìn)程。復(fù)雜度為O(logN)。

  那么,為什么從linux 2.6早期到近期linux 2.6版本,調(diào)度程序選擇進(jìn)程時的復(fù)雜度反而增加了呢?

  這是因?yàn)椋c此同時,調(diào)度程序?qū)叫缘膶?shí)現(xiàn)從上面提到的第一種思路改變?yōu)榈诙N思路(通過動態(tài)調(diào)整優(yōu)先級實(shí)現(xiàn))。而O(1)的算法是基于一組數(shù)目不大的鏈表來實(shí)現(xiàn)的,按我的理解,這使得優(yōu)先級的取值范圍很小(區(qū)分度很低),不能滿足公平性的需求。而使用紅黑樹則對優(yōu)先級的取值沒有限制(可以用32位、64位、或更多位來表示優(yōu)先級的值),并且O(logN)的復(fù)雜度也還是很高效的。

  調(diào)度觸發(fā)的時機(jī)

  調(diào)度的觸發(fā)主要有如下幾種情況:

  1、當(dāng)前進(jìn)程(正在CPU上運(yùn)行的進(jìn)程)狀態(tài)變?yōu)榉强蓤?zhí)行狀態(tài)。

  進(jìn)程執(zhí)行系統(tǒng)調(diào)用主動變?yōu)榉强蓤?zhí)行狀態(tài)。比如執(zhí)行nanosleep進(jìn)入睡眠、執(zhí)行exit退出、等等;

  進(jìn)程請求的資源得不到滿足而被迫進(jìn)入睡眠狀態(tài)。比如執(zhí)行read系統(tǒng)調(diào)用時,磁盤高速緩存里沒有所需要的數(shù)據(jù),從而睡眠等待磁盤IO;

  進(jìn)程響應(yīng)信號而變?yōu)榉强蓤?zhí)行狀態(tài)。比如響應(yīng)SIGSTOP進(jìn)入暫停狀態(tài)、響應(yīng)SIGKILL退出、等等;

  2、搶占。進(jìn)程運(yùn)行時,非預(yù)期地被剝奪CPU的使用權(quán)。這又分兩種情況:進(jìn)程用完了時間片、或出現(xiàn)了優(yōu)先級更高的進(jìn)程。

  優(yōu)先級更高的進(jìn)程受正在CPU上運(yùn)行的進(jìn)程的影響而被喚醒。如發(fā)送信號主動喚醒,或因?yàn)獒尫呕コ鈱ο?如釋放鎖)而被喚醒;

  內(nèi)核在響應(yīng)時鐘中斷的過程中,發(fā)現(xiàn)當(dāng)前進(jìn)程的時間片用完;

  內(nèi)核在響應(yīng)中斷的過程中,發(fā)現(xiàn)優(yōu)先級更高的進(jìn)程所等待的外部資源的變?yōu)榭捎,從而將其喚醒。比如CPU收到網(wǎng)卡中斷,內(nèi)核處理該中斷,發(fā)現(xiàn)某個socket可讀,于是喚醒正在等待讀這個socket的進(jìn)程;再比如內(nèi)核在處理時鐘中斷的過程中,觸發(fā)了定時器,從而喚醒對應(yīng)的正在nanosleep系統(tǒng)調(diào)用中睡眠的進(jìn)程。

  所有任務(wù)都采用linux分時調(diào)度策略時:

  1,創(chuàng)建任務(wù)指定采用分時調(diào)度策略,并指定優(yōu)先級nice值(-20~19)。

  2,將根據(jù)每個任務(wù)的nice值確定在cpu上的執(zhí)行時間(counter)。

  3,如果沒有等待資源,則將該任務(wù)加入到就緒隊(duì)列中。

  4,調(diào)度程序遍歷就緒隊(duì)列中的任務(wù),通過對每個任務(wù)動態(tài)優(yōu)先級的計算權(quán)值(counter+20-nice)結(jié)果,選擇計算結(jié)果最大的一個去運(yùn)行,當(dāng)這個時間片用完后(counter減至0)或者主動放棄cpu時,該任務(wù)將被放在就緒隊(duì)列末尾(時間片用完)或等待隊(duì)列(因等待資源而放棄cpu)中。

  5,此時調(diào)度程序重復(fù)上面計算過程,轉(zhuǎn)到第4步。

  6,當(dāng)調(diào)度程序發(fā)現(xiàn)所有就緒任務(wù)計算所得的權(quán)值都為不大于0時,重復(fù)第2步。

  所有任務(wù)都采用FIFO時:

  1,創(chuàng)建進(jìn)程時指定采用FIFO,并設(shè)置實(shí)時優(yōu)先級rt_priority(1-99)。

  2,如果沒有等待資源,則將該任務(wù)加入到就緒隊(duì)列中。

  3,調(diào)度程序遍歷就緒隊(duì)列,根據(jù)實(shí)時優(yōu)先級計算調(diào)度權(quán)值(1000+rt_priority),選擇權(quán)值最高的任務(wù)使用cpu,該FIFO任務(wù)將一直占有cpu直到有優(yōu)先級更高的任務(wù)就緒(即使優(yōu)先級相同也不行)或者主動放棄(等待資源)。

  4,調(diào)度程序發(fā)現(xiàn)有優(yōu)先級更高的任務(wù)到達(dá)(高優(yōu)先級任務(wù)可能被中斷或定時器任務(wù)喚醒,再或被當(dāng)前運(yùn)行的任務(wù)喚醒,等等),則調(diào)度程序立即在當(dāng)前任務(wù)堆棧中保存當(dāng)前cpu寄存器的所有數(shù)據(jù),重新從高優(yōu)先級任務(wù)的堆棧中加載寄存器數(shù)據(jù)到cpu,此時高優(yōu)先級的任務(wù)開始運(yùn)行。重復(fù)第3步。

  5,如果當(dāng)前任務(wù)因等待資源而主動放棄cpu使用權(quán),則該任務(wù)將從就緒隊(duì)列中刪除,加入等待隊(duì)列,此時重復(fù)第3步。

  所有任務(wù)都采用RR調(diào)度策略時:

  1,創(chuàng)建任務(wù)時指定調(diào)度參數(shù)為RR,并設(shè)置任務(wù)的實(shí)時優(yōu)先級和nice值(nice值將會轉(zhuǎn)換為該任務(wù)的時間片的長度)。

  2,如果沒有等待資源,則將該任務(wù)加入到就緒隊(duì)列中。

  3,調(diào)度程序遍歷就緒隊(duì)列,根據(jù)實(shí)時優(yōu)先級計算調(diào)度權(quán)值(1000+rt_priority),選擇權(quán)值最高的任務(wù)使用cpu。

  4,如果就緒隊(duì)列中的RR任務(wù)時間片為0,則會根據(jù)nice值設(shè)置該任務(wù)的時間片,同時將該任務(wù)放入就緒隊(duì)列的末尾。重復(fù)步驟3。

  5,當(dāng)前任務(wù)由于等待資源而主動退出cpu,則其加入等待隊(duì)列中。重復(fù)步驟3。

  系統(tǒng)中既有分時調(diào)度,又有時間片輪轉(zhuǎn)調(diào)度和先進(jìn)先出調(diào)度:

  1,RR調(diào)度和FIFO調(diào)度的進(jìn)程屬于實(shí)時進(jìn)程,以分時調(diào)度的進(jìn)程是非實(shí)時進(jìn)程。

  2,當(dāng)實(shí)時進(jìn)程準(zhǔn)備就緒后,如果當(dāng)前cpu正在運(yùn)行非實(shí)時進(jìn)程,則實(shí)時進(jìn)程立即搶占非實(shí)時進(jìn)程。

  3,RR進(jìn)程和FIFO進(jìn)程都采用實(shí)時優(yōu)先級做為調(diào)度的權(quán)值標(biāo)準(zhǔn),RR是FIFO的一個延伸。FIFO時,如果兩個進(jìn)程的優(yōu)先級一樣,則這兩個優(yōu)先級一樣的進(jìn)程具體執(zhí)行哪一個是由其在隊(duì)列中的未知決定的,這樣導(dǎo)致一些不公正性(優(yōu)先級是一樣的,為什么要讓你一直運(yùn)行?),如果將兩個優(yōu)先級一樣的任務(wù)的調(diào)度策略都設(shè)為RR,則保證了這兩個任務(wù)可以循環(huán)執(zhí)行,保證了公平。

  Ingo Molnar-實(shí)時補(bǔ)丁

  為了能并入主流內(nèi)核,Ingo Molnar的實(shí)時補(bǔ)丁也采用了非常靈活的策略,它支持四種搶占模式:

  1.No Forced Preemption (Server),這種模式等同于沒有使能搶占選項(xiàng)的標(biāo)準(zhǔn)內(nèi)核,主要適用于科學(xué)計算等服務(wù)器環(huán)境。

  2.Voluntary Kernel Preemption (Desktop),這種模式使能了自愿搶占,但仍然失效搶占內(nèi)核選項(xiàng),它通過增加搶占點(diǎn)縮減了搶占延遲,因此適用于一些需要較好的響應(yīng)性的環(huán)境,如桌面環(huán)境,當(dāng)然這種好的響應(yīng)性是以犧牲一些吞吐率為代價的。

  3.Preemptible Kernel (Low-Latency Desktop),這種模式既包含了自愿搶占,又使能了可搶占內(nèi)核選項(xiàng),因此有很好的響應(yīng)延遲,實(shí)際上在一定程度上已經(jīng)達(dá)到了軟實(shí)時性。它主要適用于桌面和一些嵌入式系統(tǒng),但是吞吐率比模式2更低。

  plete Preemption (Real-Time),這種模式使能了所有實(shí)時功能,因此完全能夠滿足軟實(shí)時需求,它適用于延遲要求為100微秒或稍低的實(shí)時系統(tǒng)。

  實(shí)現(xiàn)實(shí)時是以犧牲系統(tǒng)的吞吐率為代價的,因此實(shí)時性越好,系統(tǒng)吞吐率就越低。

【解讀Linux系統(tǒng)中的進(jìn)程調(diào)度】相關(guān)文章:

解析Linux系統(tǒng)中的進(jìn)程調(diào)度06-19

Linux系統(tǒng)中的守護(hù)進(jìn)程講解02-24

Linux系統(tǒng)中查殺僵尸進(jìn)程方法介紹03-01

linux系統(tǒng)中快速查看進(jìn)程pid的方法03-15

Linux系統(tǒng)下的進(jìn)程切換的解析08-03

Linux系統(tǒng)如何查看進(jìn)程的線程數(shù)06-07

linux操作系統(tǒng)要查看系統(tǒng)進(jìn)程的辦法07-24

解讀 Linux 集群的新型文件系統(tǒng)07-10

Linux 進(jìn)程權(quán)限的分析05-27