多進(jìn)程和多線程(上)[翻譯]

http://www.qnx.com/developers/docs/6.4.1/neutrino/getting_started/s1_procs.html

進(jìn)程和線程的基本原理

在我們開始討論線程瞳筏、進(jìn)程仓手、時(shí)間片和所有其他奇妙的“調(diào)度概念”之前当编,讓我們建立一個(gè)類比享甸。我首先要做的是說(shuō)明線程和進(jìn)程是如何工作的。我能想到的最好的方法(不深入研究實(shí)時(shí)系統(tǒng)的設(shè)計(jì))是想象線程和進(jìn)程的各種場(chǎng)景孔庭。

一個(gè)進(jìn)程是一個(gè)房子

讓我們用一個(gè)普通的日常對(duì)象——房子來(lái)類比進(jìn)程和線程尺上。房子實(shí)際上是一個(gè)容器材蛛,具有某些屬性(如地板空間的數(shù)量,臥室的數(shù)量怎抛,等等)卑吭。如果你從這個(gè)角度來(lái)看,房子本身并沒有主動(dòng)地做任何事情——它是一個(gè)被動(dòng)的物體马绝。這就是所謂的進(jìn)程豆赏。我們很快就會(huì)探討這個(gè)問題。

居住者是線程

住在房子里的人是活動(dòng)的對(duì)象——他們?cè)谑褂貌煌姆块g富稻,看電視掷邦,做飯,洗澡椭赋,等等抚岗。我們很快就會(huì)看到線程的行為。

簡(jiǎn)單的線程

如果你曾經(jīng)一個(gè)人住過哪怔,那么你就會(huì)知道這是什么樣子的——你知道你可以在任何時(shí)候在房子里做任何你想做的事情宣蔚,因?yàn)榉孔永餂]有其他人。如果你想打開音響蔓涧,去洗手間件已,吃晚飯——不管怎樣——你就去做吧。

多線程

當(dāng)你把另一個(gè)人加到房子里時(shí)元暴,事情會(huì)發(fā)生戲劇性的變化篷扩。假設(shè)你結(jié)婚了,現(xiàn)在你的配偶也住在那里茉盏。你不能在任何時(shí)候都大搖大擺地走進(jìn)洗手間;你需要先確認(rèn)你的配偶不在里面!
如果你有兩個(gè)負(fù)責(zé)任的成年人住在一所房子里鉴未,通常你可以在“安全”方面相當(dāng)松懈——你知道另一個(gè)成年人會(huì)尊重你的空間,不會(huì)試圖(故意的!)放火燒廚房鸠姨,等等⊥眩現(xiàn)在,再加上幾個(gè)孩子讶迁,事情突然變得有趣多了连茧。

返回進(jìn)程和線程

就像房子占用一塊不動(dòng)產(chǎn)一樣,進(jìn)程占用內(nèi)存巍糯。正如房子的居住者可以自由進(jìn)入任何他們想要的房間一樣啸驯,進(jìn)程的線程都可以共同訪問該內(nèi)存。如果一個(gè)線程分配了一些東西(媽媽出去買了一款游戲)祟峦,所有其他線程都可以立即訪問它(因?yàn)樗嬖谟诠驳刂房臻g——它在房子里)罚斗。同樣,如果進(jìn)程分配了內(nèi)存宅楞,那么這個(gè)新的內(nèi)存也可以被所有線程使用针姿。這里的技巧是識(shí)別內(nèi)存是否應(yīng)該對(duì)進(jìn)程中的所有線程可用袱吆。如果是,那么你需要讓所有線程同步它們對(duì)它的訪問距淫。如果不是绞绒,那么我們假設(shè)它是特定于特定線程的。在這種情況下榕暇,因?yàn)橹挥羞@個(gè)線程可以訪問它处铛,所以我們可以假定不需要同步——線程不會(huì)自己出錯(cuò)!

互斥

如果你想洗澡,但已經(jīng)有人在用浴室了拐揭,你就得等。線程如何處理這個(gè)問題?
這就是所謂的相互排斥奕塑。它的意思和你想的差不多——當(dāng)涉及到特定的資源時(shí)堂污,多個(gè)線程是互斥的。
如果你正在洗澡龄砰,你會(huì)想要單獨(dú)使用浴室盟猖。要做到這一點(diǎn),你通常會(huì)走進(jìn)浴室换棚,從里面把門鎖上式镐。其他想上廁所的人都會(huì)被鎖攔住。當(dāng)你完成后固蚤,你會(huì)打開門娘汞,讓其他人進(jìn)入。
這就是線程所做的夕玩。線程使用一個(gè)叫做mutex(縮寫MUTual EXclusion)的對(duì)象你弦。這個(gè)對(duì)象就像門上的鎖——一旦一個(gè)線程鎖定了互斥鎖,其他線程就不能得到互斥鎖燎孟,直到擁有它的線程釋放(解鎖)它禽作。就像門鎖一樣,等待獲取互斥鎖的線程將被禁止揩页。
互斥鎖和門鎖的另一個(gè)有趣的相似之處是互斥鎖實(shí)際上是一個(gè)“建議”鎖旷偿。如果一個(gè)線程沒有遵守使用互斥鎖的約定,那么這種保護(hù)是沒有用的爆侣。用我們的房子來(lái)比喻萍程,這就像有人沒有開鎖進(jìn)門,而是從一面墻闖入洗手間累提。

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

如果浴室現(xiàn)在是鎖著的尘喝,很多人都在等著用呢?很明顯,所有人都坐在外面斋陪,等在廁所里的人出來(lái)朽褪。真正的問題是置吓,“門打開時(shí)會(huì)發(fā)生什么?”下一個(gè)輪到誰(shuí)了?”
你會(huì)認(rèn)為讓等待時(shí)間最長(zhǎng)的人下一個(gè)離開是“公平的”〉拊或者讓年齡最大的人下一個(gè)離開也可能是“公平的”衍锚。或最高嗤堰。還是最重要的戴质。有很多方法可以決定什么是“公平的”。
我們通過兩個(gè)因素來(lái)解決這個(gè)問題:優(yōu)先級(jí)和等待時(shí)間踢匣。
線程也是一樣告匠。線程從其父線程繼承其調(diào)度算法,但可以調(diào)用pthread_setschedparam()來(lái)更改其調(diào)度策略和優(yōu)先級(jí)(如果它有權(quán)限這么做的話)离唬。
如果有許多線程正在等待后专,互斥鎖被解鎖,我們將把互斥鎖給予優(yōu)先級(jí)最高的等待線程输莺。然而戚哎,假設(shè)兩個(gè)人有相同的優(yōu)先級(jí)。現(xiàn)在你要做什么?好吧嫂用,在這種情況下型凳,允許等待時(shí)間最長(zhǎng)的人下一個(gè)離開是“公平的”。這不僅是“公平的”嘱函,而且也是Neutrino內(nèi)核所做的甘畅。在有一堆線程等待的情況下,我們首先按優(yōu)先級(jí)实夹,其次按等待時(shí)間長(zhǎng)度橄浓。
互斥對(duì)象當(dāng)然不是我們將遇到的唯一同步對(duì)象。讓我們看一些其他的亮航。

信號(hào)量

讓我們從浴室走到廚房荸实,因?yàn)槟鞘且粋€(gè)被社會(huì)接受的同時(shí)容納多人的地方。在廚房里缴淋,你可能不想讓所有人同時(shí)進(jìn)去准给。事實(shí)上,你可能想要限制在廚房的人數(shù)(太多廚師重抖,等等)露氮。
假設(shè)你不希望同時(shí)有超過兩個(gè)人在里面。你可以用互斥來(lái)做嗎?不像我們定義的那樣钟沛。為什么不呢?這對(duì)于我們的類比來(lái)說(shuō)是一個(gè)非常有趣的問題畔规。讓我們將其分解為幾個(gè)步驟。

計(jì)數(shù)為1的信號(hào)量

浴室有兩種情況恨统,有兩種狀態(tài)是相互關(guān)聯(lián)的:

  • 門沒鎖叁扫,房間里也沒人
  • 門是鎖著的三妈,房間里有一個(gè)人
    沒有其他的組合是可能的——房間里沒有人的時(shí)候門不能上鎖(我們?cè)趺撮_鎖?),房間里有人的時(shí)候門也不能上鎖(他們?cè)趺幢WC他們的隱私?)這是一個(gè)計(jì)數(shù)為1的信號(hào)量的例子——在那個(gè)房間里最多只能有一個(gè)人莫绣,或者一個(gè)線程使用這個(gè)信號(hào)量畴蒲。

計(jì)數(shù)大于1的信號(hào)量

假設(shè)我們?cè)趶N房里安裝了傳統(tǒng)的鑰匙鎖。這把鎖的工作原理是对室,如果你有鑰匙模燥,你可以打開門進(jìn)去。任何用這把鎖的人都同意掩宜,當(dāng)他們進(jìn)到里面時(shí)蔫骂,他們會(huì)立即從里面把門鎖上,所以外面的人總是需要一把鑰匙牺汤。
好了纠吴,現(xiàn)在控制廚房里要有多少人就變得很簡(jiǎn)單了——在門外掛兩把鑰匙!廚房總是鎖著的。當(dāng)有人想進(jìn)廚房時(shí)慧瘤,他們會(huì)看看門外是否掛著一把鑰匙。如果是這樣固该,他們就隨身帶著鑰匙锅减,打開廚房門,走進(jìn)去伐坏,用鑰匙鎖上門怔匣。

作為互斥鎖的信號(hào)量

我們剛剛問了一個(gè)問題“你能用互斥器來(lái)做嗎?”,而答案是否定的桦沉。反過來(lái)怎么樣?我們可以使用一個(gè)信號(hào)量作為互斥量嗎?
是的每瞒。事實(shí)上,在某些操作系統(tǒng)中纯露,這正是它們所做的——它們沒有互斥剿骨,只有信號(hào)量!那么,為什么要費(fèi)心使用互斥鎖呢?
要回答這個(gè)問題埠褪,看看你的洗手間浓利。你房子的建造者是如何實(shí)現(xiàn)互斥的?我猜你墻上沒有掛鑰匙吧!
互斥是一種“特殊用途”的信號(hào)量。如果你想讓一個(gè)線程在特定的代碼段中運(yùn)行钞速,那么互斥鎖是目前為止最有效的實(shí)現(xiàn)贷掖。
稍后,我們將看看其他同步方案——稱為condvars渴语、barrier和sleepons的東西苹威。

為了避免混淆,請(qǐng)注意互斥鎖還有其他屬性驾凶,比如優(yōu)先級(jí)繼承牙甫,它們將互斥鎖與信號(hào)量區(qū)分開來(lái)掷酗。

內(nèi)核的角色

單一CPU

house的類比很好地傳達(dá)了同步的概念,但它在一個(gè)主要領(lǐng)域中并不適用腹暖。在我們家里汇在,有許多線程同時(shí)運(yùn)行。然而脏答,在真實(shí)的系統(tǒng)中糕殉,通常只有一個(gè)CPU,所以一次只能運(yùn)行一個(gè)“東西”殖告。

多CPU

如果你的系統(tǒng)具有多個(gè)相同的cpu阿蝶,它們都共享內(nèi)存和設(shè)備,那么你就擁有一個(gè)SMP框(SMP代表對(duì)稱多處理器黄绩,“對(duì)稱”部分表示系統(tǒng)中的所有cpu都是相同的)羡洁。在這種情況下,可以并發(fā)(同時(shí))運(yùn)行的線程數(shù)量受到cpu數(shù)量的限制爽丹。(實(shí)際上筑煮,單處理器盒子也是這樣!)由于每個(gè)處理器一次只能執(zhí)行一個(gè)線程,因此使用多個(gè)處理器時(shí)粤蝎,多個(gè)線程可以同時(shí)執(zhí)行真仲。
讓我們暫時(shí)忽略當(dāng)前cpu的數(shù)量——一個(gè)有用的抽象是將系統(tǒng)設(shè)計(jì)成多個(gè)線程同時(shí)運(yùn)行,即使事實(shí)并非如此初澎。稍后秸应,在“使用SMP時(shí)要注意的事項(xiàng)”一節(jié)中,我們將看到SMP的一些非直觀影響碑宴。

將內(nèi)核作為仲裁者

那么软啼,誰(shuí)來(lái)決定在任何給定時(shí)刻哪個(gè)線程將運(yùn)行呢?這是內(nèi)核的工作。
內(nèi)核決定在特定時(shí)刻哪個(gè)線程應(yīng)該使用CPU延柠,并將上下文切換到該線程祸挪。讓我們看看內(nèi)核對(duì)CPU做了什么。
CPU有許多寄存器(確切的數(shù)字取決于處理器家族贞间,例如匕积,x86和MIPS,以及特定的家族成員榜跌,例如闪唆,80486和奔騰)。當(dāng)線程運(yùn)行時(shí)钓葫,信息存儲(chǔ)在這些寄存器中(例如悄蕾,當(dāng)前程序的位置)。
當(dāng)內(nèi)核決定運(yùn)行另一個(gè)線程時(shí),它需要:
1.保存當(dāng)前運(yùn)行線程的寄存器和其他上下文信息
2.將新線程的寄存器和上下文加載到CPU中
但是內(nèi)核如何決定另一個(gè)線程應(yīng)該運(yùn)行呢?它查看特定線程是否能夠在此時(shí)使用CPU帆调。例如奠骄,當(dāng)我們談到互斥鎖時(shí),我們引入了阻塞狀態(tài)(當(dāng)一個(gè)線程擁有互斥鎖番刊,而另一個(gè)線程也想獲得它時(shí)含鳞,就會(huì)發(fā)生阻塞狀態(tài);第二個(gè)線程將被阻塞)。
因此芹务,從內(nèi)核的角度來(lái)看蝉绷,我們有一個(gè)線程可以消耗CPU,而另一個(gè)線程不能枣抱,因?yàn)樗蛔枞巳勐穑诘却粋€(gè)互斥鎖。在這種情況下佳晶,內(nèi)核允許可以運(yùn)行的線程消耗CPU桅狠,并將另一個(gè)線程放入一個(gè)內(nèi)部列表中(這樣內(nèi)核就可以跟蹤它對(duì)互斥鎖的請(qǐng)求)。
顯然轿秧,這不是一個(gè)很有趣的情況中跌。假設(shè)有很多線程可以使用CPU哈打。還記得我們根據(jù)優(yōu)先級(jí)和等待時(shí)間分配對(duì)互斥鎖的訪問嗎?內(nèi)核使用類似的方案來(lái)確定下一個(gè)運(yùn)行的線程毫捣。有兩個(gè)因素:優(yōu)先級(jí)調(diào)度算法沼瘫,以這個(gè)順序評(píng)估浙滤。

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

考慮兩個(gè)能夠使用CPU的線程。如果這些線程有不同的優(yōu)先級(jí)宠互,那么答案非常簡(jiǎn)單——內(nèi)核將CPU分配給優(yōu)先級(jí)最高的線程。Neutrino的優(yōu)先級(jí)從1(可用性最低的)到1,就像我們?cè)谟懻摣@取互斥鎖時(shí)提到的那樣铝侵。注意,優(yōu)先級(jí)0是為空閑線程保留的——你不能使用它触徐。(如果你想知道系統(tǒng)的最小值和最大值咪鲜,請(qǐng)使用sched_get_priority_min()sched_get_priority_max()函數(shù)——它們的原型在< sched_h >中。在本書中撞鹉,我們假設(shè)1為最低可用值疟丙,255為最高可用值。)
如果另一個(gè)具有更高優(yōu)先級(jí)的線程突然能夠使用CPU鸟雏,內(nèi)核將立即上下文切換到更高優(yōu)先級(jí)的線程享郊。我們稱之為搶占——高優(yōu)先級(jí)線程搶占了低優(yōu)先級(jí)線程。當(dāng)高優(yōu)先級(jí)線程完成時(shí)孝鹊,內(nèi)核上下文切換回之前運(yùn)行的低優(yōu)先級(jí)線程炊琉,我們稱之為恢復(fù)——內(nèi)核繼續(xù)運(yùn)行前一個(gè)線程。
現(xiàn)在,假設(shè)兩個(gè)線程能夠使用CPU苔咪,并且具有完全相同的優(yōu)先級(jí)锰悼。

調(diào)度算法

讓我們假設(shè)當(dāng)前有一個(gè)線程正在使用CPU。在本例中团赏,我們將研究?jī)?nèi)核用來(lái)決定何時(shí)進(jìn)行上下文切換的規(guī)則箕般。(當(dāng)然,整個(gè)討論只適用于具有相同優(yōu)先級(jí)的線程——當(dāng)更高優(yōu)先級(jí)的線程準(zhǔn)備使用它得到的CPU時(shí);這就是在實(shí)時(shí)操作系統(tǒng)中擁有優(yōu)先級(jí)的全部意義舔清。)
Neutrino內(nèi)核理解的兩種主要調(diào)度算法(策略)是輪循(或稱RR)和FIFO(先入先出)丝里。(也有零星的日程安排,但這超出了本書的范圍;參見系統(tǒng)架構(gòu)指南的QNX Neutrino內(nèi)核章節(jié)中的“Sporadic_scheduling”鸠踪。)

FIFO

在FIFO調(diào)度算法中丙者,允許一個(gè)線程在它想要的時(shí)間內(nèi)消耗CPU。這意味著营密,如果該線程正在進(jìn)行非常長(zhǎng)的數(shù)學(xué)計(jì)算械媒,并且沒有其他更高優(yōu)先級(jí)的線程準(zhǔn)備好,那么該線程可能會(huì)永遠(yuǎn)運(yùn)行下去评汰。那么具有相同優(yōu)先級(jí)的線程呢?他們也被鎖在外面了纷捞。(這一點(diǎn)應(yīng)該很明顯,較低優(yōu)先級(jí)的線程也被鎖定了被去。)
如果正在運(yùn)行的線程退出或自愿放棄CPU主儡,那么內(nèi)核將尋找具有相同優(yōu)先級(jí)、能夠使用CPU的其他線程惨缆。如果沒有這樣的線程糜值,那么內(nèi)核將尋找能夠使用CPU的低優(yōu)先級(jí)線程。注意坯墨,術(shù)語(yǔ)“自愿放棄CPU”可能意味著兩種情況之一寂汇。如果線程進(jìn)入睡眠狀態(tài),或者阻塞信號(hào)量等捣染,那么是的骄瓣,低優(yōu)先級(jí)線程可以運(yùn)行(如上所述)。但是還有一個(gè)“特殊”調(diào)用耍攘,sched_yield()(基于內(nèi)核調(diào)用SchedYield())榕栏,它只將CPU讓給另一個(gè)具有相同優(yōu)先級(jí)的線程——如果高優(yōu)先級(jí)的線程準(zhǔn)備運(yùn)行,則不會(huì)給低優(yōu)先級(jí)的線程運(yùn)行的機(jī)會(huì)蕾各。如果一個(gè)線程確實(shí)調(diào)用了sched_yield()扒磁,并且沒有其他具有相同優(yōu)先級(jí)的線程準(zhǔn)備運(yùn)行,那么原始線程將繼續(xù)運(yùn)行式曲。實(shí)際上渗磅,sched_yield()用于在CPU上為另一個(gè)具有相同優(yōu)先級(jí)的線程提供漏洞。
在下圖中,我們看到三個(gè)線程在兩個(gè)不同的進(jìn)程中運(yùn)行:

Three threads in two different processes

如果我們假設(shè)線程“A”和“B”準(zhǔn)備好了始鱼,線程“C”被阻塞(可能在等待互斥鎖)仔掸,線程“D”(未顯示)正在執(zhí)行,那么這就是Neutrino內(nèi)核維護(hù)的就緒隊(duì)列的一部分看起來(lái)像:
Two threads on the READY queue, one blocked, one running

這顯示了內(nèi)核的內(nèi)部就緒隊(duì)列医清,內(nèi)核使用該隊(duì)列來(lái)決定下一步調(diào)度誰(shuí)起暮。注意,線程“C”不在就緒隊(duì)列中会烙,因?yàn)樗蛔枞烁号常€程“D”也不在就緒隊(duì)列中,因?yàn)樗谶\(yùn)行柏腻。

輪循

RR調(diào)度算法與FIFO相同纸厉,只是如果有另一個(gè)線程具有相同的優(yōu)先級(jí),該線程不會(huì)永遠(yuǎn)運(yùn)行五嫂。它只對(duì)系統(tǒng)定義的時(shí)間片運(yùn)行颗品,其值可以通過使用sched_rr_get_interval()函數(shù)確定。時(shí)間片通常是4毫秒沃缘,但它實(shí)際上是ticksize的4倍躯枢,你可以用ClockPeriod()查詢或設(shè)置它。
發(fā)生的情況是內(nèi)核啟動(dòng)一個(gè)RR線程槐臀,并記錄時(shí)間锄蹂。如果RR線程正在運(yùn)行一段時(shí)間,分配給它的時(shí)間將會(huì)結(jié)束(時(shí)間片將會(huì)過期)水慨。內(nèi)核會(huì)查看是否有另一個(gè)具有相同優(yōu)先級(jí)的線程已經(jīng)就緒得糜。如果有,則由內(nèi)核運(yùn)行晰洒。如果沒有朝抖,則內(nèi)核將繼續(xù)運(yùn)行RR線程(即內(nèi)核授予該線程另一個(gè)時(shí)間片)。

The rules

讓我們總結(jié)一下調(diào)度規(guī)則(針對(duì)單個(gè)CPU)欢顷,按重要性排序:

  • 一次只能運(yùn)行一個(gè)線程。
  • 最高優(yōu)先級(jí)的就緒線程將運(yùn)行捉蚤。
  • 線程將一直運(yùn)行抬驴,直到阻塞或退出。
  • RR線程將運(yùn)行它的時(shí)間片缆巧,然后內(nèi)核將重新調(diào)度它(如果需要的話)布持。

下面的流程圖顯示了內(nèi)核所做的決定:


Scheduling roadmap

對(duì)于多cpu系統(tǒng),除了多個(gè)cpu可以同時(shí)運(yùn)行多個(gè)線程之外陕悬,其他規(guī)則都是相同的题暖。線程的運(yùn)行順序(即哪個(gè)線程在多個(gè)CPU上運(yùn)行)的確定方式與在單個(gè)CPU上完全相同——最高優(yōu)先級(jí)的就緒線程將在一個(gè)CPU上運(yùn)行。對(duì)于低優(yōu)先級(jí)或等待時(shí)間較長(zhǎng)的線程,內(nèi)核在何時(shí)調(diào)度它們方面具有一定的靈活性胧卤,以避免使用緩存時(shí)效率低下唯绍。有關(guān)SMP的更多信息,請(qǐng)參見[Multicore Processing User's Guide]枝誊。(http://www.qnx.com/developers/docs/6.4.1/multicore_en/user_guide/about.html).

內(nèi)核的狀態(tài)

我們已經(jīng)松散地討論了“running”况芒、“ready”和“blocked”——現(xiàn)在讓我們形式化這些線程狀態(tài)。

RUNNING

Neutrino的運(yùn)行狀態(tài)僅僅意味著線程現(xiàn)在正在積極地消耗CPU叶撒。在SMP系統(tǒng)中绝骚,會(huì)有多個(gè)線程在運(yùn)行;在單處理器系統(tǒng)上,只有一個(gè)線程在運(yùn)行祠够。

READY

就緒狀態(tài)意味著這個(gè)線程現(xiàn)在可以運(yùn)行——除非它沒有運(yùn)行压汪,因?yàn)榱硪粋€(gè)線程(具有相同或更高的優(yōu)先級(jí))正在運(yùn)行。如果兩個(gè)線程能夠使用CPU古瓤,一個(gè)線程優(yōu)先級(jí)為10止剖,一個(gè)線程優(yōu)先級(jí)為7,那么優(yōu)先級(jí)為10的線程將正在運(yùn)行湿滓,優(yōu)先級(jí)為7的線程將準(zhǔn)備就緒滴须。

The blocked states

我們?cè)趺捶Q呼阻塞狀態(tài)呢?問題是,不只有一個(gè)阻塞狀態(tài)叽奥。在Neutrino的作用下扔水,實(shí)際上有十幾種阻塞狀態(tài)。
為什么那么多?因?yàn)閮?nèi)核會(huì)跟蹤為什么線程會(huì)被阻塞朝氓。
我們已經(jīng)看到了兩種阻塞狀態(tài)——當(dāng)線程阻塞等待互斥鎖時(shí)魔市,該線程處于互斥鎖狀態(tài)。當(dāng)線程阻塞等待信號(hào)量時(shí)赵哲,它處于SEM狀態(tài)待德。這些狀態(tài)只是指示線程阻塞在哪個(gè)隊(duì)列(和哪個(gè)資源)上。
如果多個(gè)線程在一個(gè)互斥鎖上阻塞(處于互斥鎖阻塞狀態(tài))枫夺,那么它們不會(huì)受到內(nèi)核的關(guān)注将宪,直到擁有互斥鎖的線程釋放它。此時(shí)橡庞,一個(gè)被阻塞的線程已經(jīng)就緒较坛,內(nèi)核會(huì)做出重新調(diào)度決策(如果需要的話)。
為什么“如果需要嗎?”剛剛釋放互斥鎖的線程可能仍然有其他事情要做扒最,并且比等待的線程具有更高的優(yōu)先級(jí)丑勤。在本例中,我們轉(zhuǎn)向第二條規(guī)則吧趣,它聲明“最高優(yōu)先級(jí)的就緒線程將運(yùn)行”法竞,這意味著調(diào)度順序沒有改變——更高優(yōu)先級(jí)的線程繼續(xù)運(yùn)行耙厚。

內(nèi)核狀態(tài),完整的列表

下面是內(nèi)核阻塞狀態(tài)的完整列表岔霸,以及對(duì)每種狀態(tài)的簡(jiǎn)要解釋薛躬。順便說(shuō)一下,這個(gè)列表可以在 <sys/neutrino.h> 秉剑,你會(huì)注意到所有的狀態(tài)都以STATE_作為前綴(例如泛豪,這個(gè)表中的“READY”在頭文件中以STATE_READY的形式列出):


Kernel states, the complete list

需要記住的重要一點(diǎn)是侦鹏,當(dāng)一個(gè)線程被阻塞時(shí)诡曙,無(wú)論阻塞在哪個(gè)狀態(tài),它都不會(huì)消耗CPU略水。相反价卤,線程消耗CPU的唯一狀態(tài)是運(yùn)行狀態(tài)。
我們將在消息傳遞章節(jié)中看到發(fā)送渊涝、接收和應(yīng)答阻塞狀態(tài)慎璧。NANOSLEEP狀態(tài)與sleep()之類的函數(shù)一起使用,我們將在關(guān)于時(shí)鐘跨释、計(jì)時(shí)器和不時(shí)得到踢腳的那一章中了解它胸私。INTR狀態(tài)與interrupwait()一起使用,我們將在中斷一章中介紹鳖谈。大多數(shù)其他狀態(tài)將在本章中討論岁疼。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市缆娃,隨后出現(xiàn)的幾起案子捷绒,更是在濱河造成了極大的恐慌,老刑警劉巖贯要,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件暖侨,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡崇渗,警方通過查閱死者的電腦和手機(jī)字逗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)宅广,“玉大人葫掉,你說(shuō)我怎么就攤上這事〕吮” “怎么了挖息?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵金拒,是天一觀的道長(zhǎng)兽肤。 經(jīng)常有香客問我套腹,道長(zhǎng),這世上最難降的妖魔是什么资铡? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任电禀,我火速辦了婚禮,結(jié)果婚禮上笤休,老公的妹妹穿的比我還像新娘尖飞。我一直安慰自己,他們只是感情好店雅,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布政基。 她就那樣靜靜地躺著,像睡著了一般闹啦。 火紅的嫁衣襯著肌膚如雪沮明。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天窍奋,我揣著相機(jī)與錄音荐健,去河邊找鬼。 笑死琳袄,一個(gè)胖子當(dāng)著我的面吹牛江场,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播窖逗,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼址否,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了滑负?” 一聲冷哼從身側(cè)響起在张,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎矮慕,沒想到半個(gè)月后帮匾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡痴鳄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年瘟斜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痪寻。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡螺句,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出橡类,到底是詐尸還是另有隱情蛇尚,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布顾画,位于F島的核電站取劫,受9級(jí)特大地震影響匆笤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谱邪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一炮捧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧惦银,春花似錦咆课、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至迅栅,卻和暖如春善炫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背库继。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工箩艺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宪萄。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓艺谆,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親拜英。 傳聞我的和親對(duì)象是個(gè)殘疾皇子静汤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容