亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 5760 | 回復(fù): 3
打印 上一主題 下一主題

【轉(zhuǎn)】Linux 實(shí)時(shí)技術(shù)與典型實(shí)現(xiàn)分析 [復(fù)制鏈接]

論壇徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2008-12-19 09:15 |只看該作者 |倒序?yàn)g覽
級(jí)別: 初級(jí)

楊燚 (yyang@ch.mvista.com), 計(jì)算機(jī)科學(xué)碩士


2005 年 6 月 01 日

本系列文章分兩部分,第 1 部分闡述了實(shí)時(shí)的概念、衡量實(shí)時(shí)性的指標(biāo),詳細(xì)地分析了嵌入式系統(tǒng)對(duì) Linux 實(shí)時(shí)性的需求以及 Linux 在實(shí)時(shí)性方面的不足,然后簡單地描述了三個(gè)著名的 Linux 實(shí)時(shí)實(shí)現(xiàn),第 2 部分對(duì)一個(gè)典型的實(shí)時(shí)實(shí)現(xiàn)(Ingo's RT patch)做了詳盡的分析。
一、實(shí)時(shí)的概念

所謂實(shí)時(shí),就是一個(gè)特定任務(wù)的執(zhí)行時(shí)間必須是確定的,可預(yù)測的,并且在任何情況下都能保證任務(wù)的時(shí)限(最大執(zhí)行時(shí)間限制)。實(shí)時(shí)又分軟實(shí)時(shí)和硬實(shí)時(shí),所謂軟實(shí)時(shí),就是對(duì)任務(wù)執(zhí)行時(shí)限的要求不那么嚴(yán)苛,即使在一些情況下不能滿足時(shí)限要求,也不會(huì)對(duì)系統(tǒng)本身產(chǎn)生致命影響,例如,媒體播放系統(tǒng)就是軟實(shí)時(shí)的,它需要系統(tǒng)能夠在1秒鐘播放24幀,但是即使在一些嚴(yán)重負(fù)載的情況下不能在1秒鐘內(nèi)處理24幀,也是可以接受的。所謂硬實(shí)時(shí),就是對(duì)任務(wù)的執(zhí)行時(shí)限的要求非常嚴(yán)格,無論在什么情況下,任務(wù)的執(zhí)行實(shí)現(xiàn)必須得到絕對(duì)保證,否則將產(chǎn)生災(zāi)難性后果,例如,飛行器自動(dòng)駕駛和導(dǎo)航系統(tǒng)就是硬實(shí)時(shí)的,它必須要求系統(tǒng)能在限定的時(shí)限內(nèi)完成特定的任務(wù),否則將導(dǎo)致重大事故,如碰撞或爆炸等。

二、衡量實(shí)時(shí)性的指標(biāo)

那么,如何判斷一個(gè)系統(tǒng)是否是實(shí)時(shí)的呢?主要有以下兩個(gè)指標(biāo):

1. 中斷延遲

中斷延遲就是從一個(gè)外部事件發(fā)生到相應(yīng)的中斷處理函數(shù)的第一條指令開始執(zhí)行所需要的時(shí)間。很多實(shí)時(shí)任務(wù)是靠中斷驅(qū)動(dòng)的,而且中斷事件必須在限定的時(shí)限內(nèi)處理,否則將產(chǎn)生災(zāi)難性后果,因此中斷延遲對(duì)于實(shí)時(shí)系統(tǒng)來說,是一個(gè)非常重要的指標(biāo)。

2. 搶占延遲

有時(shí)也稱調(diào)度延遲,搶占延遲就是從一個(gè)外部事件發(fā)生到相應(yīng)的處理該事件的任務(wù)的第一條命令開始執(zhí)行的時(shí)間。大多數(shù)實(shí)時(shí)系統(tǒng)都是處理一些周期性的或非周期性的重復(fù)事件,事件產(chǎn)生的頻度就確定了任務(wù)的執(zhí)行時(shí)限,因此每次事件發(fā)生時(shí),相應(yīng)的處理任務(wù)必須及時(shí)響應(yīng)處理,否則將無法滿足時(shí)限。搶占延遲就反映了系統(tǒng)的響應(yīng)及時(shí)程度。

如果以上兩個(gè)指標(biāo)是確定的,可預(yù)測的,那么就可以說系統(tǒng)是實(shí)時(shí)的。

三、影響系統(tǒng)實(shí)時(shí)性的因素

對(duì)系統(tǒng)實(shí)時(shí)性的影響因素既有硬件方面的,也有軟件方面的。

現(xiàn)代的高性能的硬件都使用了cache技術(shù)來彌補(bǔ)CPU和內(nèi)存間的性能差距,但是cache卻嚴(yán)重地影響著實(shí)時(shí)性,指令或數(shù)據(jù)在cache中的執(zhí)行時(shí)間和指令或數(shù)據(jù)不在cache中的執(zhí)行時(shí)間差距是非常巨大的,可能差幾個(gè)數(shù)量級(jí),因此為了保證執(zhí)行時(shí)間的確定性和可預(yù)測性,來滿足實(shí)時(shí)需要,一些系統(tǒng)就失效了cache或使用沒有cache的CPU。

另一個(gè)硬件方面的影響因素就是虛存管理,對(duì)于多用戶多任務(wù)的操作系統(tǒng),它確實(shí)非常有用,它使得系統(tǒng)能夠執(zhí)行比物理內(nèi)存更大的任務(wù),而且各任務(wù)互不影響,完全有自己的獨(dú)立的地址空間。但是虛存管理的缺頁機(jī)制嚴(yán)重地影響了任務(wù)執(zhí)行時(shí)間的可預(yù)測性和確定性,任務(wù)執(zhí)行時(shí)使用缺頁機(jī)制調(diào)入訪問的指令或數(shù)據(jù)和被執(zhí)行的指令和數(shù)據(jù)已經(jīng)在內(nèi)存中需要的執(zhí)行時(shí)間的差距是非常大的。因此一些實(shí)時(shí)系統(tǒng)就不使用虛存技術(shù),例如 Wind River的VxWorks。

在軟件方面,影響因素包括關(guān)中斷、不可搶占、一些O(n)的算法。

前面已經(jīng)提到,中斷延遲是衡量系統(tǒng)實(shí)時(shí)性的一個(gè)重要指標(biāo)。關(guān)中斷就導(dǎo)致了中斷無法被響應(yīng),增加了中斷延遲。

前面提到的搶占延遲也是衡量系統(tǒng)實(shí)時(shí)性的重要指標(biāo)。如果發(fā)生實(shí)時(shí)事件時(shí)系統(tǒng)是不可搶占的,搶占延遲就會(huì)增加。

還有就是一些時(shí)間復(fù)雜度為O(n)的算法也影響了執(zhí)行時(shí)間的不確定性,例如任務(wù)調(diào)度算法,要想執(zhí)行實(shí)時(shí)任務(wù)必須進(jìn)行調(diào)度,如果調(diào)度算法的執(zhí)行時(shí)間取決于當(dāng)前系統(tǒng)運(yùn)行的任務(wù)數(shù),那么調(diào)度實(shí)時(shí)任務(wù)所花費(fèi)的時(shí)間就是不確定的,因?yàn)樗桥c系統(tǒng)運(yùn)行的任務(wù)數(shù)呈線性關(guān)系的函數(shù),運(yùn)行的任務(wù)越多,時(shí)間就越長。

四、嵌入式系統(tǒng)需要實(shí)時(shí)Linux

Linux在設(shè)計(jì)之初沒有對(duì)實(shí)時(shí)性進(jìn)行任何考慮,因此非實(shí)時(shí)性絕非偶然。Linus考慮的是資源共享,吞吐率最大化。但是隨著Linux的快速發(fā)展,它的應(yīng)用已經(jīng)遠(yuǎn)遠(yuǎn)超出了Linus自己的想象。Linux的開放性已經(jīng)對(duì)很多種架構(gòu)的支持使得它在嵌入式系統(tǒng)中得到了廣泛的應(yīng)用,但是許多嵌入式系統(tǒng)的實(shí)時(shí)性要求使得Linux在嵌入式領(lǐng)域的應(yīng)用受到了一定的障礙,因此人們要求Linux需要實(shí)時(shí)性的呼聲越來越高。

Linux的開放性和低成本是實(shí)時(shí)Linux發(fā)展的優(yōu)勢,越來越多的研究機(jī)構(gòu)和商業(yè)團(tuán)體開展了實(shí)時(shí)Linux的研究與開發(fā),其中最著名的就是FSMLab的Rtlinux和TimeSys Linux。還有一個(gè)就是Ingo's RT patch。

五、標(biāo)準(zhǔn)Linux內(nèi)核制約實(shí)時(shí)性的因素

標(biāo)準(zhǔn)Linux有幾個(gè)機(jī)制嚴(yán)重地影響了實(shí)時(shí)性。

1.內(nèi)核不可搶占

在Linux 2.4和以前的版本,內(nèi)核是不可搶占的,也就是說,如果當(dāng)前任務(wù)運(yùn)行在內(nèi)核態(tài),即使當(dāng)前有更緊急的任務(wù)需要運(yùn)行,當(dāng)前任務(wù)也不能被搶占。因此那個(gè)緊急任務(wù)必須等到當(dāng)前任務(wù)執(zhí)行完內(nèi)核態(tài)的操作返回用戶態(tài)后或當(dāng)前任務(wù)因需要等待某些條件滿足而主動(dòng)讓出CPU才能被考慮執(zhí)行,這很明顯嚴(yán)重影響搶占延遲。

在Linux 2.6中,內(nèi)核已經(jīng)可以搶占,因而實(shí)時(shí)性得到了加強(qiáng)。但是內(nèi)核中仍有大量的不可搶占區(qū)域, 如由自旋鎖 (spinlock)保護(hù)的臨界區(qū),以及一些顯式使用preempt_disable失效搶占的臨界區(qū)。

2.中斷關(guān)閉

Linux在一些同步操作中使用了中斷關(guān)閉指令,中斷關(guān)閉將增大中斷延遲,降低系統(tǒng)的實(shí)時(shí)性。

3.自旋鎖(spinlock)

自旋鎖是在可搶占內(nèi)核和SMP情況下對(duì)共享資源的一種同步機(jī)制,一般地一個(gè)任務(wù)對(duì)共享資源的訪問是非常短暫的,如果兩個(gè)任務(wù)競爭一個(gè)共享的資源時(shí),沒有得到資源的任務(wù)將自旋以等待另一個(gè)任務(wù)使用完該共享資源。這種鎖機(jī)制是非常高效的,但是在保持自旋鎖期間將失效搶占,這意味著搶占延遲將增加。在 2.6內(nèi)核中,自旋鎖的使用非常普遍,有的甚至對(duì)整個(gè)一個(gè)數(shù)組或鏈表的便歷過程都使用自旋鎖。因此搶占延遲非常不確定。

4.大內(nèi)核鎖

由于歷史原因,內(nèi)核一直保留有幾個(gè)大內(nèi)核鎖,大內(nèi)核鎖實(shí)質(zhì)上也是一種自旋鎖,但是它與一般的自旋鎖的區(qū)別是,它是用于同步整個(gè)內(nèi)核的,而且一般該鎖的保持時(shí)間較長,也即搶占失效時(shí)間長,因此它的使用將嚴(yán)重地影響搶占延遲。

5.中斷總是最高優(yōu)先級(jí)的

在Linux中,中斷(包括軟中斷)是最高優(yōu)先級(jí)的,不論在任何時(shí)刻,只要產(chǎn)生中斷事件,內(nèi)核將立即執(zhí)行相應(yīng)的中斷處理函數(shù)以及軟中斷,等到所有掛起的中斷和軟中斷處理完畢有才執(zhí)行正常的任務(wù)。因此在標(biāo)準(zhǔn)的Linux系統(tǒng)上,實(shí)時(shí)任務(wù)根本不可能得到實(shí)時(shí)性保證。例如,假設(shè)在一個(gè)標(biāo)準(zhǔn)Linux系統(tǒng)上運(yùn)行了一個(gè)實(shí)時(shí)任務(wù)(即使用了SCHED_FIFO調(diào)度策略并且設(shè)定了最高的實(shí)時(shí)優(yōu)先級(jí)),但是該系統(tǒng)有非常繁重的網(wǎng)絡(luò)負(fù)載和I/O負(fù)載,那么系統(tǒng)可能一直處在中斷處理狀態(tài)而沒有機(jī)會(huì)運(yùn)行任何任務(wù),這樣實(shí)時(shí)任務(wù)將永遠(yuǎn)無法運(yùn)行,搶占延遲將是無窮大。因此,如果這種機(jī)制不改,實(shí)時(shí)Linux將永遠(yuǎn)無法實(shí)現(xiàn)。

6.調(diào)度算法和調(diào)度點(diǎn)

在Linux 2.4和以前的版本,調(diào)度器的時(shí)間復(fù)雜度是O(n)的,而且在SMP的情況下性能低,因?yàn)樗械腃PU共享一個(gè)任務(wù)鏈表,任何時(shí)刻只能有一個(gè)調(diào)度器運(yùn)行。因此,搶占延遲很大程度上以來于當(dāng)前系統(tǒng)的任務(wù)數(shù),具有非常大的不確定性和不可預(yù)測性。

在2.6內(nèi)核中引入的O(1)調(diào)度器很好地解決了這些問題。

此外,即使內(nèi)核是可搶占的,也不是在任何地方可以發(fā)生調(diào)度,例如在中斷上下文,一個(gè)中斷處理函數(shù)可能喚醒了某一高優(yōu)先級(jí)進(jìn)程,但是該進(jìn)程并不能立即運(yùn)行,因?yàn)樵谥袛嗌舷挛牟荒馨l(fā)生調(diào)度,中斷處理完了之后內(nèi)核還要執(zhí)行掛起的軟中斷,等它們處理完之后才有機(jī)會(huì)調(diào)度剛才喚醒的進(jìn)程。在標(biāo)準(zhǔn)Linux內(nèi)核中,調(diào)度點(diǎn)(有意安排的執(zhí)行任務(wù)調(diào)度的點(diǎn))并不多,對(duì)2.4和2.6內(nèi)核測試的結(jié)果表明,缺乏調(diào)度點(diǎn)是影響Linux實(shí)時(shí)性的一個(gè)因素。

六、現(xiàn)存的Linux實(shí)時(shí)技術(shù)

現(xiàn)有的著名的實(shí)時(shí)Linux實(shí)現(xiàn)包括RTLinux、RTAI和TimeSys。

1. RTLinux

RTLinux是著名的研究機(jī)構(gòu)FSMLab研發(fā)的一款實(shí)時(shí)Linux,既有GPL和Free版本,又有商業(yè)版本。它使用的實(shí)現(xiàn)方式是子內(nèi)核方法,即把Linux內(nèi)核作為一個(gè)新實(shí)現(xiàn)的子內(nèi)核的閑暇任務(wù),子內(nèi)核位于Linux內(nèi)核和硬件抽象層之間,實(shí)時(shí)任務(wù)運(yùn)行于子內(nèi)核之上,只有當(dāng)沒有實(shí)時(shí)任務(wù)需要運(yùn)行時(shí),Linux內(nèi)核才有機(jī)會(huì)運(yùn)行。

特別是對(duì)中斷的管理,它采用了一種軟件的方式來處理Linux內(nèi)的中斷關(guān)閉,當(dāng)Linux內(nèi)核關(guān)閉中斷后,并不是真正地屏蔽了硬件中斷,相反,它使用了一個(gè)變量來保存Linux內(nèi)核的中斷標(biāo)志位,Linux內(nèi)核的開關(guān)中斷只是影響了該變量,硬件的中斷由子內(nèi)核來接管,當(dāng)Linux內(nèi)核關(guān)閉了中斷,子內(nèi)核仍然可以響應(yīng)任何中斷,只是如果子內(nèi)核不需要處理的中斷才交給Linux內(nèi)核來處理,如果Linux內(nèi)核關(guān)閉了中斷,子內(nèi)核將記錄該中斷并在 Linux內(nèi)核打開中斷后提交它處理。

在RTLinux里,每一個(gè)實(shí)時(shí)任務(wù)都是內(nèi)核線程,運(yùn)行在內(nèi)核空間,RTLinux提供了一套專門的機(jī)制來在實(shí)時(shí)任務(wù)和普通的Linux任務(wù)之間進(jìn)行進(jìn)程間通信。

這種子內(nèi)核的實(shí)現(xiàn)提供了非常好的實(shí)時(shí)性,完全是一個(gè)硬實(shí)時(shí)的Linux。

2.TimeSys Linux

Timesys很早就發(fā)布了實(shí)時(shí)Linux的商業(yè)版以及GPL版,它采用了與RTLinux完全不同的實(shí)現(xiàn)方式。前面已經(jīng)提到了標(biāo)準(zhǔn)Linux內(nèi)核的實(shí)時(shí)限制,TimeSys Linux就是通過消除這些限制來達(dá)到實(shí)時(shí)性的。它把中斷(IRQ)和軟中斷(softIRQ)全部線程化并賦予不同的優(yōu)先級(jí),實(shí)時(shí)任務(wù)可以有比中斷線程更高的優(yōu)先級(jí),它使用Mutex替代spinlock來使得自旋鎖完全可搶占。它也對(duì)調(diào)度器做了優(yōu)化使它是O(1)的(注:因?yàn)槭褂?.4內(nèi)核)。由于中斷已經(jīng)線程化了,很多中斷關(guān)閉就沒必要了,因而消除了很多中斷關(guān)閉區(qū)域。它還實(shí)現(xiàn)了對(duì)CPU和網(wǎng)絡(luò)資源的預(yù)定來改善實(shí)時(shí)性。后面將說的Ingo's RT patch就是借鑒這些思路來實(shí)現(xiàn)實(shí)時(shí)性的。

這種實(shí)現(xiàn)方式保持了全部的Linux應(yīng)用編程模式,實(shí)時(shí)應(yīng)用和普通的應(yīng)用采用同樣的編程方式,使用同樣的API,只是實(shí)時(shí)任務(wù)需要明確指定自己的優(yōu)先級(jí)與調(diào)度策略。但是這種實(shí)現(xiàn)方式也有弊病,那就是它滿足硬實(shí)時(shí)性有一定的困難,因?yàn)榧词怪袛嚓P(guān)閉和不可搶占區(qū)大為減少,但是還是存在,一些中斷還是無法線程化,如時(shí)鐘中斷等。

3. Ingo's RT patch

Ingo's RT patch是又一個(gè)Linux實(shí)時(shí)實(shí)現(xiàn),它采用了與TimeSys完全相同的技術(shù)路線,而且有一些實(shí)現(xiàn)是基于TimeSys的源代碼的,如IRQ和 softirq線程化。但是它與前面提到的兩個(gè)實(shí)時(shí)實(shí)現(xiàn)不同的地方是,它可能并入到標(biāo)準(zhǔn)Linux內(nèi)核(作者預(yù)見,可能并入到2.6.13或以后的某個(gè)版本中)。在最新的標(biāo)準(zhǔn)內(nèi)核Linux 2.6.11中,已經(jīng)出現(xiàn)了這個(gè)補(bǔ)丁曾經(jīng)包含的部分代碼,如IRQ子系統(tǒng),那是IRQ和softirq線程化的基礎(chǔ),已經(jīng)隱含了一些線程化的代碼,如自愿搶占代碼,那是2.4的低延遲補(bǔ)。╨ow latency patch)和Ingo的一些自愿搶占代碼以及Robert Love的鎖分解補(bǔ)丁的集合,還有可搶占的大內(nèi)核鎖。

本系列第 2 部分將專門對(duì)Ingo's RT patch進(jìn)行詳細(xì)的解讀。





關(guān)于作者



  楊燚,計(jì)算機(jī)科學(xué)碩士,畢業(yè)于中科院計(jì)算技術(shù)研究所,有 4 年的 Linux 內(nèi)核編程經(jīng)驗(yàn),目前從事嵌入式實(shí)時(shí)Linux的開發(fā)與性能測試。您可以通過yang.yi@bmrtech.comyyang@ch.mvista.com與作者聯(lián)系。

論壇徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
2 [報(bào)告]
發(fā)表于 2008-12-19 09:15 |只看該作者
級(jí)別: 初級(jí)

楊燚 (yyang@ch.mvista.com), 計(jì)算機(jī)科學(xué)碩士


2005 年 6 月 01 日

這是本系列文章(分兩部分)的第 2 部分,詳細(xì)分析了一個(gè)典型的實(shí)時(shí)實(shí)現(xiàn)(Ingo's RT patch)。第 1 部分闡述了實(shí)時(shí)的概念、衡量實(shí)時(shí)性的指標(biāo),詳細(xì)地分析了嵌入式系統(tǒng)對(duì) Linux 實(shí)時(shí)性的需求以及 Linux 在實(shí)時(shí)性方面的不足,然后簡單地描述了三個(gè)著名的 Linux 實(shí)時(shí)實(shí)現(xiàn)。
一、簡介

Ingo Molnar 的實(shí)時(shí)補(bǔ)丁是完全開源的,它采用的實(shí)時(shí)實(shí)現(xiàn)技術(shù)完全類似于Timesys Linux,而且中斷線程化的代碼是基于TimeSys Linux的中斷線程化代碼的。這些實(shí)時(shí)實(shí)現(xiàn)技術(shù)包括:中斷線程化(包括IRQ和softirq)、用Mutex取代spinlock、優(yōu)先級(jí)繼承和死鎖檢測、等待隊(duì)列優(yōu)先級(jí)化、大內(nèi)核鎖(BKL-Big Kernel Lock)可搶占等。

該實(shí)時(shí)實(shí)現(xiàn)包含了以前的VP補(bǔ)。ㄔ趦(nèi)核郵件列表這么稱呼,即Voluntary Preemption),VP補(bǔ)丁由針對(duì)2.4內(nèi)核的低延遲補(bǔ)丁(low latency patch)演進(jìn)而來,它使用兩種方法來實(shí)現(xiàn)低延遲:

一種就是鎖分解,即把大循環(huán)中保持的鎖分解為每一輪循環(huán)中都獲得鎖和釋放鎖,典型的代碼結(jié)構(gòu)示例如下:鎖分解前:

spin_lock(&x_lock);
for (…) {
    some operations;
    …
}
spin_unlock(&x_lock);





鎖分解后:

for (…) {
    spin_lock(&x_lock);
    some operations;
    …
    spin_unlock(&x_lock);
}





另一種是增加搶占點(diǎn),即自愿被搶占,下面是一個(gè)鼠標(biāo)驅(qū)動(dòng)的例子:

未增加搶占點(diǎn)以前在文件driver/char/tty_io.c中的一段代碼:

        /* Do the write .. */
        for (;;) {
                size_t size = count;
                if (size > chunk)
                        size = chunk;
                ret = -EFAULT;
                if (copy_from_user(tty->write_buf, buf, size))
                        break;
                lock_kernel();
                ret = write(tty, file, tty->write_buf, size);
                unlock_kernel();
                if (ret <= 0)
                        break;
                written += ret;
                buf += ret;
                count -= ret;
                if (!count)
                        break;
                ret = -ERESTARTSYS;
                if (signal_pending(current))
                        break;
        }
        




增加搶占點(diǎn)之后:

                /* Do the write .. */
        for (;;) {
                size_t size = count;
                if (size > chunk)
                        size = chunk;
                ret = -EFAULT;
                if (copy_from_user(tty->write_buf, buf, size))
                        break;
                lock_kernel();
                ret = write(tty, file, tty->write_buf, size);
                unlock_kernel();
                if (ret <= 0)
                        break;
                written += ret;
                buf += ret;
                count -= ret;
                if (!count)
                        break;
                ret = -ERESTARTSYS;
                if (signal_pending(current))
                        break;
                cond_resched();
        }
        




語句cond_resched()將判斷是否有進(jìn)程需要搶占當(dāng)前進(jìn)程,如果是將立即發(fā)生調(diào)度,這就是增加的強(qiáng)占點(diǎn)。

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

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

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

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

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

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

在寫本文時(shí)最新的實(shí)時(shí)實(shí)現(xiàn)補(bǔ)丁是:

http://people.redhat.com/~mingo/ ... 6.12-rc4-V0.7.47-03

它自2004年10月發(fā)布以來一直更新很頻繁,幾乎每天都有新版本發(fā)布,直到最近才比較穩(wěn)定。它的很多代碼部分已經(jīng)并入到標(biāo)準(zhǔn)的2.6內(nèi)核源碼數(shù),包括IRQ子系統(tǒng),那為中斷線程化提供了很好的基礎(chǔ);自愿搶占;大內(nèi)核鎖可搶占;這些已經(jīng)包含在2.6.11中。作者預(yù)期,其余的代碼部分也將很快進(jìn)入到主流內(nèi)核,可能是2.6.12或以后的某個(gè)版本。

因此,本文專門對(duì)這個(gè)實(shí)時(shí)實(shí)現(xiàn)進(jìn)行詳細(xì)的實(shí)現(xiàn)分析將有重要意義。

二、中斷線程化

中斷線程化是實(shí)現(xiàn)Linux實(shí)時(shí)性的一個(gè)重要步驟,在Linux標(biāo)準(zhǔn)內(nèi)核中,中斷是最高優(yōu)先級(jí)的執(zhí)行單元,不管內(nèi)核當(dāng)時(shí)處理什么,只要有中斷事件,系統(tǒng)將立即響應(yīng)該事件并執(zhí)行相應(yīng)的中斷處理代碼,除非當(dāng)時(shí)中斷關(guān)閉(即使用local_irq_disable失效了IRQ)。因此,如果系統(tǒng)有嚴(yán)重的網(wǎng)絡(luò)或I/O負(fù)載,中斷將非常頻繁,實(shí)時(shí)任務(wù)將很難有機(jī)會(huì)運(yùn)行,也就是說,毫無實(shí)時(shí)性可言。中斷線程化之后,中斷將作為內(nèi)核線程運(yùn)行而且賦予不同的實(shí)時(shí)優(yōu)先級(jí),實(shí)時(shí)任務(wù)可以有比中斷線程更高的優(yōu)先級(jí),這樣,實(shí)時(shí)任務(wù)就可以作為最高優(yōu)先級(jí)的執(zhí)行單元來運(yùn)行,即使在嚴(yán)重負(fù)載下仍有實(shí)時(shí)性保證。

中斷線程化的另一個(gè)重要原因是spinlock被mutex取代。中斷處理代碼中大量地使用了spinlock,當(dāng)spinlock被mutex取代之后,中斷處理代碼就有可能因?yàn)榈貌坏芥i而需要被掛到等待隊(duì)列上,但是只有可調(diào)度的進(jìn)程才可以這么做,如果中斷處理代碼仍然使用原來的 spinlock,則spinlock取代mutex的努力將大打折扣,因此為了滿足這一要求,中斷必須被線程化,包括IRQ和softirq。

在Ingo Molnar的實(shí)時(shí)補(bǔ)丁中,中斷線程化的實(shí)現(xiàn)方法是:

對(duì)于IRQ,在內(nèi)核初始化階段init(該函數(shù)在內(nèi)核源碼樹的文件init/main.c中定義)調(diào)用init_hardirqs(該函數(shù)在內(nèi)核源碼樹的文件kernel/irq/manage.c中定義)來為每一個(gè)IRQ創(chuàng)建一個(gè)內(nèi)核線程,IRQ號(hào)為0的中斷賦予實(shí)時(shí)優(yōu)先級(jí)49,IRQ號(hào)為1的賦予實(shí)時(shí)優(yōu)先級(jí)48,依次類推直到25,因此任何IRQ線程的最低實(shí)時(shí)優(yōu)先級(jí)為25。原來的 do_IRQ 被分解成兩部分,架構(gòu)相關(guān)的放在類似于arch/*/kernel/irq.c的文件中,名稱仍然為do_IRQ,而架構(gòu)獨(dú)立的部分被放在IRQ子系統(tǒng)的位置kernel/irq/handle.c中,名稱為__do_IRQ。當(dāng)發(fā)生中斷時(shí),CPU將執(zhí)行do_IRQ來處理相應(yīng)的中斷,do_IRQ將做了必要的架構(gòu)相關(guān)的處理后調(diào)用__do_IRQ。函數(shù)__do_IRQ將判斷該中斷是否已經(jīng)被線程化(如果中斷描述符的狀態(tài)字段不包含SA_NODELAY 標(biāo)志說明中斷被線程化了),如果是將喚醒相應(yīng)的處理線程,否則將直接調(diào)用handle_IRQ_event(在IRQ子系統(tǒng)位置的 kernel/irq/handle.c文件中)來處理。對(duì)于已經(jīng)線程化的情況,中斷處理線程被喚醒并開始運(yùn)行后,將調(diào)用do_hardirq(在源碼樹的IRQ子系統(tǒng)位置的文件kernel/irq/manage.c中定義)來處理相應(yīng)的中斷,該函數(shù)將判斷是否有中斷需要被處理(中斷描述符的狀態(tài)標(biāo)志 IRQ_INPROGRESS),如果有就調(diào)用handle_IRQ_event來處理。handle_IRQ_event將直接調(diào)用相應(yīng)的中斷處理句柄來完成中斷處理。

如果某個(gè)中斷需要被實(shí)時(shí)處理,它可以用SA_NODELAY標(biāo)志來聲明自己非線程化,例如:

系統(tǒng)的時(shí)鐘中斷就是,因?yàn)樗挥脕砭S護(hù)系統(tǒng)時(shí)間以及定時(shí)器等,所以不應(yīng)當(dāng)被線程化。

static struct irqaction irq0  =
{ timer_interrupt, SA_INTERRUPT | SA_NODELAY, CPU_MASK_NONE, "timer", NULL, NULL};





這是在靜態(tài)聲明時(shí)指定不要線程化,也可以在調(diào)用request_irq時(shí)指定,如:

request_irq (HIGHWIRE_SMI_IRQ,                                       
highwire_smi_interrupt, SA_NODELAY, "System Management Switch", NULL))





對(duì)于softirq,標(biāo)準(zhǔn)Linux內(nèi)核已經(jīng)使用內(nèi)核線程的方式來處理,只是Ingo Molnar的實(shí)時(shí)補(bǔ)丁做了修改使其易于被搶占,改進(jìn)了實(shí)時(shí)性,具體的修改包括:

把ksoftirqd的優(yōu)先級(jí)設(shè)置為nice值為-10,即它的優(yōu)先級(jí)高于普通的用戶態(tài)進(jìn)程和內(nèi)核態(tài)線程,但它不是實(shí)時(shí)線程,因此這樣一來softirq對(duì)實(shí)時(shí)性的影響將顯著減小。

在處理軟中斷期間,搶占是使能的,這使得實(shí)時(shí)性更進(jìn)一步地增強(qiáng)。

在處理軟中斷的函數(shù)___do_softirq中,每次處理完一個(gè)待處理的軟中斷后,都將調(diào)用cond_resched_all(),這顯著地增加了調(diào)度點(diǎn)數(shù),提高了整個(gè)系統(tǒng)的實(shí)時(shí)性。

增加了兩個(gè)函數(shù)_do_softirq和___do_softirq,其中___do_softirq就是原來的__do_softirq,只是增加了調(diào)度點(diǎn)。__do_softirq則是對(duì)___do_softirq的包裝,_do_softirq是對(duì)do_softirq的替代,但保留 do_softirq用于一些特殊需要。

三、spinlock轉(zhuǎn)換成mutex

spinlock是一個(gè)高效的共享資源同步機(jī)制,在SMP(對(duì)稱多處理器Symmetric Multiple Proocessors)的情況下,它用于保護(hù)共享資源,如全局的數(shù)據(jù)結(jié)構(gòu)或一個(gè)只能獨(dú)占的硬件資源。但是spinlock保持期間將使搶占失效,用 spinlock保護(hù)的區(qū)域稱為臨界區(qū)(Critical Section),在內(nèi)核中大量地使用了spinlock,有大量的臨界區(qū)存在,因此它們將嚴(yán)重地影響著系統(tǒng)的實(shí)時(shí)性。Ingo Molnar的實(shí)時(shí)補(bǔ)丁使用mutex來替換spinlock,它的意圖是讓spinlock可搶占,但是可搶占后將產(chǎn)生很多后續(xù)影響。

Spinlock失效搶占的目的是避免死鎖。Spinlock如果可搶占了,一個(gè)spinlock的競爭者將可能搶占該spinlock的保持者來運(yùn)行,但是由于得不到spinlock將自旋在那里,如果競爭者的優(yōu)先級(jí)高于保持者的優(yōu)先級(jí),將形成一種死鎖的局面,因?yàn)楸3终邿o法得到運(yùn)行而永遠(yuǎn)不能釋放spinlock,而競爭者由于不能得到一個(gè)不可能釋放的spinlock而永遠(yuǎn)自旋在那里。

由于中斷處理函數(shù)也可以使用spinlock,如果它使用的spinlock已經(jīng)被一個(gè)進(jìn)程保持,中斷處理函數(shù)將無法繼續(xù)進(jìn)行,從而形成死鎖,這樣的spinlock在使用時(shí)應(yīng)當(dāng)中斷失效來避免這種死鎖的情況發(fā)生。標(biāo)準(zhǔn)linux內(nèi)核就是這么做的,中斷線程化之后,中斷失效就沒有必要,因?yàn)橛龅竭@種狀況后,中斷線程將掛在等待隊(duì)列上并放棄CPU讓別的線程或進(jìn)程來運(yùn)行。

等待隊(duì)列就是解決這種死鎖僵局的方法,在Ingo Molnar的實(shí)時(shí)補(bǔ)丁中,每個(gè)spinlock都有一個(gè)等待隊(duì)列,該等待隊(duì)列是按進(jìn)程或線程的優(yōu)先級(jí)排隊(duì)的。如果一個(gè)進(jìn)程或線程競爭的spinlock 已經(jīng)被另一個(gè)線程保持,它將把自己掛在該spinlock的優(yōu)先級(jí)化的等待隊(duì)列上,然后發(fā)生調(diào)度把CPU讓給別的進(jìn)程或線程。

需要特別注意,對(duì)于非線程化的中斷,必須使用原來的spinlock,原因前面已經(jīng)講得很清楚。

原來的spinlock結(jié)構(gòu)如下:

typedef struct {
        volatile unsigned long lock;
# ifdef CONFIG_DEBUG_SPINLOCK
        unsigned int magic;
# endif
# ifdef CONFIG_PREEMPT
        unsigned int break_lock;
# endif
} spinlock_t;





它非常簡潔,替換成mutex之后,它的結(jié)構(gòu)為:

typedef struct {
        struct rt_mutex lock;
        unsigned int break_lock;
} spinlock_t;





其中struct rt_mutex結(jié)構(gòu)如下:

struct rt_mutex {
        raw_spinlock_t          wait_lock;
        struct plist            wait_list;
        struct task_struct      *owner;
        int                     owner_prio;
# ifdef CONFIG_RT_DEADLOCK_DETECT
        int                     save_state;
        struct list_head        held_list;
        unsigned long           acquire_eip;
        char                    *name, *file;
        int                     line;
# endif
};





類型raw_spinlock_t就是原來的spinlock_t。在結(jié)構(gòu)struct rt_mutex中的wait_list字段就是優(yōu)先級(jí)化的等待隊(duì)列。

原來的rwlock_t結(jié)構(gòu)如下:

typedef struct { volatile unsigned long lock; # ifdef CONFIG_DEBUG_SPINLOCK unsigned magic; # endif # ifdef CONFIG_PREEMPT unsigned int break_lock; # endif } rwlock_t;

被mutex化的rwlock結(jié)構(gòu)如下:

typedef struct { struct rw_semaphore lock; unsigned int break_lock; } rwlock_t;

其中rw_semaphore結(jié)構(gòu)為:

struct rw_semaphore { struct rt_mutex lock; int read_depth; };

rwlock_t和spinlock_t沒有本質(zhì)的不同,只是rwlock_t只能有一個(gè)寫者,但可以有多個(gè)讀者,因此使用了字段read_depth,其他都等同于spinlock_t。

如果必須使用原來的spinlock,可以把它聲明為raw_spinlock_t,如果必須使用原來的rwlock_t,可以把它聲明為 raw_rwlock_t,但是對(duì)其進(jìn)行鎖或解鎖操作時(shí)仍然使用同樣的函數(shù),靜態(tài)初始化時(shí)必須分別使用RAW_SPIN_LOCK_UNLOCKED和 RAW_RWLOCK_UNLOCKED。為什么不同的變量類型可以使用同樣的函數(shù)操作呢?關(guān)鍵在于使用了gcc的內(nèi)嵌函數(shù) __builtin_types_compatible_p,下面以spin_lock為例來說明其中的奧妙:

#define spin_lock(lock)         PICK_OP(raw_spinlock_t, spin, _lock, lock)





PICK_OP的定義為:

#define PICK_OP(type, optype, op, lock)                         \
do {                                                            \
        if (TYPE_EQUAL((lock), type))                           \
                _raw_##optype##op((type *)(lock));              \
        else if (TYPE_EQUAL(lock, spinlock_t))                  \
                _spin##op((spinlock_t *)(lock));                \
        else __bad_spinlock_type();                             \
} while (0)





TYPE_EQUAL的定義為:

                #define TYPE_EQUAL(lock, type) \
                __builtin_types_compatible_p(typeof(lock), type *)
               




gcc內(nèi)嵌函數(shù)__builtin_types_compatible_p用于判斷一個(gè)變量的類型是否為某指定的類型,如果是就返回1,否則返回0。

因此,如果一個(gè)spinlock的類型如果是spinlock_t,宏spin_lock的預(yù)處理結(jié)果將是:

do {
    if (0)
        _raw_spin_lock((raw_spinlock_t *)(lock));
    else if (1)
        _spin_lock((spinlock_t *)(lock));
    else __bad_spinlock_type;
} while (0)





如果一個(gè)spinlock的類型為raw_spinlock_t,宏spin_lock的預(yù)處理結(jié)果將是:

do {
    if (1)
        _raw_spin_lock((raw_spinlock_t *)(lock));
    else if (0)
        _spin_lock((spinlock_t *)(lock));
    else __bad_spinlock_type;
} while (0)





很明顯,如果類型為spinlock_t,將運(yùn)行函數(shù)_spin_lock,而如果類型為raw_spinlock_t,將運(yùn)行函數(shù)_raw_spin_lock。

_spin_lock是新的spinlock的鎖實(shí)現(xiàn)函數(shù),而_raw_spin_lock就是原來的spinlock的鎖實(shí)現(xiàn)函數(shù)。

等待隊(duì)列優(yōu)先級(jí)化的目的是為了更好地改善實(shí)時(shí)性,因?yàn)閮?yōu)先級(jí)化后,每次當(dāng)spinlock保持者釋放鎖時(shí)總是喚醒排在最前面的優(yōu)先級(jí)最高的進(jìn)程或線程,而喚醒的時(shí)間復(fù)雜度為O(1)。






回頁首





四、優(yōu)先級(jí)繼承和死鎖檢測

spinlock被mutex化后會(huì)產(chǎn)生優(yōu)先級(jí)逆轉(zhuǎn)(Priority Inversion)現(xiàn)象。所謂優(yōu)先級(jí)逆轉(zhuǎn),就是優(yōu)先級(jí)高的進(jìn)程由于優(yōu)先級(jí)低的進(jìn)程保持了競爭資源被迫等待,而讓中間優(yōu)先級(jí)的進(jìn)程運(yùn)行,優(yōu)先級(jí)逆轉(zhuǎn)將導(dǎo)致高優(yōu)先級(jí)進(jìn)程的搶占延遲增大,中間優(yōu)先級(jí)的進(jìn)程的執(zhí)行時(shí)間的不確定性導(dǎo)致了高優(yōu)先級(jí)進(jìn)程搶占延遲的不確定性,因此為了保證實(shí)時(shí)性,必須消除優(yōu)先級(jí)逆轉(zhuǎn)現(xiàn)象。

優(yōu)先級(jí)繼承協(xié)議(Priority Inheritance Protocol)和優(yōu)先級(jí)頂棚協(xié)議(Priority Ceiling Protocol)就是專門針對(duì)優(yōu)先級(jí)逆轉(zhuǎn)問題提出的解決辦法。

所謂優(yōu)先級(jí)繼承,就是spinlock的保持者將繼承高優(yōu)先級(jí)的競爭者進(jìn)程的優(yōu)先級(jí),從而能先于中間優(yōu)先級(jí)進(jìn)程運(yùn)行,盡可能快地釋放鎖,這樣高優(yōu)先級(jí)進(jìn)程就能很快得到競爭的spinlock,使得搶占延遲更確定,更短。

所謂優(yōu)先級(jí)頂棚,就是根據(jù)靜態(tài)分析確定一個(gè)spinlock的可能擁有者的最高優(yōu)先級(jí),然后把spinlock的優(yōu)先級(jí)頂棚設(shè)置為該確定的值,每次當(dāng)進(jìn)程獲得該spinlock后,就將該進(jìn)程的優(yōu)先級(jí)設(shè)置為spinlock的優(yōu)先級(jí)頂棚值。

Ingo Molnar的實(shí)時(shí)補(bǔ)丁實(shí)現(xiàn)了優(yōu)先級(jí)繼承協(xié)議,但沒有實(shí)現(xiàn)優(yōu)先級(jí)頂棚協(xié)議。

Spinlock被mutex化后引入的另一個(gè)問題就是死鎖,典型的死鎖有兩種:

一種為自鎖,即一個(gè)spinlock保持者試圖獲得它已經(jīng)保持的鎖,很顯然,這會(huì)導(dǎo)致該進(jìn)程無法運(yùn)行而死鎖。

另一種為非順序鎖而導(dǎo)致的,即進(jìn)程 P1已經(jīng)保持了spinlock LOCKA但是要獲得進(jìn)程P2已經(jīng)保持的spinlock LOCKB,而進(jìn)程P2要獲得進(jìn)程P1已經(jīng)保持的spinlock LOCKA,這樣進(jìn)程P1和P2都將因?yàn)樾枰玫綄?duì)方擁有的但永遠(yuǎn)不可能釋放的spinlock而死鎖。

Ingo Molnar的實(shí)時(shí)補(bǔ)丁對(duì)這兩種情況進(jìn)行了檢測,一旦發(fā)生這種死鎖,內(nèi)核將輸出死鎖執(zhí)行路徑并panic。

五、大內(nèi)核鎖可搶占

大內(nèi)核鎖(BKL---Big Kernel Lock)實(shí)質(zhì)上也是spinlock,只是它一般用于保護(hù)整個(gè)內(nèi)核,該鎖的保持時(shí)間比較長,因此它對(duì)整個(gè)系統(tǒng)的實(shí)時(shí)性影響是非常大的,在Ingo Molnar的實(shí)時(shí)補(bǔ)丁中,大內(nèi)核鎖使用了semaphore來實(shí)現(xiàn),如果內(nèi)核配置為前面三種搶占模式,struct semaphore是架構(gòu)相關(guān)的,如對(duì)于x86,結(jié)構(gòu)定義如下:

struct semaphore {
        atomic_t count;
        int sleepers;
        wait_queue_head_t wait;
};





但對(duì)于第四種搶占模式,其結(jié)構(gòu)為:

struct semaphore {
        atomic_t count;
        struct rt_mutex lock;
};





注意新的spinlock定義也包含字段struct rt_mutex lock,因此可搶占大內(nèi)核鎖和新的spinlock共用了低層的處理代碼。使用semaphore之后,大內(nèi)核鎖就可搶占了。

六、架構(gòu)支持和一些移植以及驅(qū)動(dòng)注意事項(xiàng)

Ingo Molnar的實(shí)時(shí)補(bǔ)丁支持的架構(gòu)包括i386、x86_64、ppc和mips,基本上含蓋了主流的架構(gòu),對(duì)于其他的架構(gòu),移植起來也是非常容易的。

架構(gòu)移植主要涉及到以下幾個(gè)方面:

1.中斷線程化

中斷線程化有兩種做法,一種是利用IRQ子系統(tǒng)的代碼,另一種是在架構(gòu)相關(guān)的子樹實(shí)現(xiàn),前一種方法利用的是已有的中斷線程化代碼,因此移植時(shí)幾乎不需要做什么工作,但是對(duì)一些架構(gòu),這種方法缺乏靈活性,尤其是一些架構(gòu)中斷處理比較特別時(shí),可能會(huì)是IRQ子系統(tǒng)的中斷線程化代碼部分變的越來越丑陋,因此對(duì)于這種架構(gòu),后一種方法就有明顯優(yōu)勢,當(dāng)然在后一種方法中仍然可以拷貝IRQ子系統(tǒng)內(nèi)的大部分線程化處理代碼。

中斷線程化要求一些spinlock或rwlock必須是raw_*類型的,而且一些IRQ必須是非線程化的,如時(shí)鐘中斷、級(jí)聯(lián)中斷等。這些是中斷線程化的必要前提。

2.一些架構(gòu)相關(guān)的代碼

有一些變量定義在架構(gòu)相關(guān)的子樹下,如hardirq_preemption等,還有就是需要對(duì)entry.S做一些修改,因?yàn)樵黾恿艘粋(gè)新的調(diào)用 preempt_schedule_irq,它要求在調(diào)用之前失效中斷。還有就是一些調(diào)試代碼支持,那是完全架構(gòu)相關(guān)的必須重新實(shí)現(xiàn),如mcount。

3.架構(gòu)相關(guān)的semaphore定義必須在第四種搶占模式下失效

前面已經(jīng)講過,如果使能第四種搶占模式,將使用新定義的semaphore,它是架構(gòu)無關(guān)的,相應(yīng)的處理代碼也是架構(gòu)無關(guān)的,因此原來的架構(gòu)相關(guān)的定義和處理代碼必須失效,這需要修改相應(yīng)的.h、.c和Makefile。

4.一些spinlock必須聲明為raw_*類型的

在架構(gòu)相關(guān)的子樹中,一些spinlock必須聲明為raw_*類型的,靜態(tài)初始化也必須修改為RAW_*,一些外部聲名也得做相應(yīng)的改動(dòng)。

5.在打開第四種搶占模式或中斷線程化使能之后,一些編程邏輯要求已經(jīng)發(fā)生了變化。

中斷線程化后,在中斷處理函數(shù)中失效中斷不在需要,因?yàn)槿绻袛嗵幚砭程在中斷失效后想得到spinlock時(shí),將可能發(fā)生上下文切換,新的實(shí)時(shí)實(shí)現(xiàn)認(rèn)為這種狀況不應(yīng)當(dāng)發(fā)生將輸出警告信息。

原來用中斷失效保護(hù)共享資源,現(xiàn)在完全可以用搶占失效來替代,因此不是萬不得已,建議不使用中斷失效。在網(wǎng)卡驅(qū)動(dòng)的發(fā)送處理函數(shù)中不能失效中斷,因此原來顯式得失效中斷的函數(shù)應(yīng)當(dāng)被替換,如:

local_irq_save應(yīng)當(dāng)變成為local_irq_save_nort
local_irq_restore應(yīng)當(dāng)變成為local_irq_restore_nort

網(wǎng)絡(luò)的核心代碼將主動(dòng)檢測這種情況,如果中斷失效了,將重新打開中斷,但是將輸出警告信息。

在保持了raw_spinlock之后不能在試圖獲得新的spinlock類型的鎖,因?yàn)閞aw_spinlock是搶占失效的,但是新的spinlock卻能夠?qū)е逻M(jìn)程睡眠或發(fā)生搶占。

對(duì)于新的semaphore,必須要求執(zhí)行down和up操作的是同一個(gè)進(jìn)程,否則優(yōu)先級(jí)繼承和死鎖檢測將無法實(shí)現(xiàn)。而且代碼本身也將操作失敗。





關(guān)于作者



  楊燚,計(jì)算機(jī)科學(xué)碩士,畢業(yè)于中科院計(jì)算技術(shù)研究所,有 4 年的 Linux 內(nèi)核編程經(jīng)驗(yàn),目前從事嵌入式實(shí)時(shí) Linux 的開發(fā)與性能測試。您可以通過yang.yi@bmrtech.comyyang@ch.mvista.com與作者聯(lián)系。

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2008-12-19 09:50 |只看該作者

回復(fù) #1 dreamice 的帖子

體會(huì)的比較的深入,收藏

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2008-12-20 22:17 |只看該作者
一直對(duì)實(shí)時(shí)操作系統(tǒng)比較感興趣,正好學(xué)學(xué)實(shí)時(shí)的概念
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP