技術(shù)員聯(lián)盟提供win764位系統(tǒng)下載,win10,win7,xp,裝機(jī)純凈版,64位旗艦版,綠色軟件,免費(fèi)軟件下載基地!

當(dāng)前位置:主頁(yè) > 教程 > 服務(wù)器類 >

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

來(lái)源:技術(shù)員聯(lián)盟┆發(fā)布時(shí)間:2018-02-09 12:19┆點(diǎn)擊:

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

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

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

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

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

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

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

  優(yōu)先級(jí)

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

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

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

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

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

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

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

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

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

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

  等等……

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

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

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

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

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

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

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

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