大部分嵌入式項(xiàng)目還需要實(shí)時(shí)操作系統(tǒng)嗎?這個(gè)問(wèn)題問(wèn)得好,因?yàn)楝F(xiàn)代高性能處理器和 Linux、Windows 和其他通用操作系統(tǒng) (GPOS) 的實(shí)時(shí)補(bǔ)丁的可用性都在飛速發(fā)展。嵌入式設(shè)備的本質(zhì)道出了答案。在許多情況下,制造設(shè)備都需要幾千甚至幾百萬(wàn)個(gè)部件。哪怕設(shè)備硬件的單位成本節(jié)省 1 美元,都會(huì)為制造商帶來(lái)不小的財(cái)富。換言之,設(shè)備無(wú)法承受數(shù)千兆赫茲級(jí)處理器的成本(更不用說(shuō)熱耗散了)。例如,在汽車(chē)遠(yuǎn)程信息處理技術(shù)市場(chǎng),常見(jiàn)的 32 位處理器以約 600 Mhz 的速度運(yùn)行——遠(yuǎn)遠(yuǎn)慢于臺(tái)式機(jī)和服務(wù)器的常用處理器。在這種運(yùn)行環(huán)境中,實(shí)時(shí)操作系統(tǒng)能得到低端硬件超快、可預(yù)測(cè)的響應(yīng),因此具有顯著的節(jié)約成本的優(yōu)勢(shì)。
除節(jié)約成本之外,實(shí)時(shí)操作系統(tǒng)提供的服務(wù)還能使許多計(jì)算問(wèn)題迎刃而解,特別是當(dāng)多種運(yùn)行爭(zhēng)奪系統(tǒng)資源時(shí)。例如,試想一個(gè)用戶期望(或需要)立即響應(yīng)輸入的系統(tǒng)。利用實(shí)時(shí)操作系統(tǒng),軟件開(kāi)發(fā)人員能確保用戶啟動(dòng)的操作會(huì)先于其他系統(tǒng)活動(dòng)執(zhí)行,除非必須先執(zhí)行更重要的任務(wù)(如幫助保護(hù)用戶安全的運(yùn)行)。
再試想一個(gè)必須滿足服務(wù)質(zhì)量 (QoS) 要求的系統(tǒng),例如一臺(tái)可播放現(xiàn)場(chǎng)視頻的設(shè)備。如果設(shè)備依靠軟件播放其內(nèi)容,它可能會(huì)以用戶無(wú)法接受的速率出現(xiàn)失幀現(xiàn)象——從用戶的角度看,該設(shè)備不可靠。但使用實(shí)時(shí)操作系統(tǒng)的話,軟件開(kāi)發(fā)人員就能精確控制軟件進(jìn)程的執(zhí)行順序,確保以適當(dāng)和一致的媒體速率播放。
?實(shí)時(shí)操作系統(tǒng)并不“公平”
對(duì)“硬”實(shí)時(shí)的需求(以及對(duì)實(shí)現(xiàn)該功能的實(shí)時(shí)操作系統(tǒng)的需求)仍然是嵌入式產(chǎn)品業(yè)的普遍要求。問(wèn)題是,實(shí)時(shí)操作系統(tǒng)具備哪些通用操作系統(tǒng)所不具備的功能呢?適用于一些通用操作系統(tǒng)的實(shí)時(shí)擴(kuò)展組件有多大用處呢?它們能提供和實(shí)時(shí)操作系統(tǒng)一樣的性能嗎?
讓我們先從任務(wù)調(diào)度開(kāi)始。在通用操作系統(tǒng)中,調(diào)度程序通常使用一種“公平”策略,將線程和進(jìn)程分配到 CPU 中。這種策略可確保臺(tái)式機(jī)和服務(wù)器的應(yīng)用程序所需的較高的總吞吐量,但無(wú)法保證優(yōu)先級(jí)高、時(shí)間要求嚴(yán)格的線程先于優(yōu)先級(jí)低的線程執(zhí)行。
例如,通用操作系統(tǒng)可能會(huì)降低分配給優(yōu)先級(jí)高的線程的優(yōu)先級(jí),或按照有利于系統(tǒng)內(nèi)其他線程的公平原則,以動(dòng)態(tài)方式調(diào)整優(yōu)先級(jí)。因此,優(yōu)先級(jí)高的線程就可能被優(yōu)先級(jí)低的線程搶占。此外,大多數(shù)通用操作系統(tǒng)都具有無(wú)限期的分配潛伏期:系統(tǒng)內(nèi)的線程越多,通用操作系統(tǒng)調(diào)度線程執(zhí)行所需的時(shí)間就越久。其中任何一種因素都能導(dǎo)致優(yōu)先級(jí)高的線程錯(cuò)過(guò)最后期限,即使在速度很快的 CPU 上。
另一方面,在實(shí)時(shí)操作系統(tǒng)中,線程會(huì)按其優(yōu)先級(jí)的順序執(zhí)行。如果優(yōu)先級(jí)高的線程準(zhǔn)備運(yùn)行,它能在很短且有限的時(shí)間間隔內(nèi),從正在執(zhí)行的優(yōu)先級(jí)低的線程那里接管 CPU。此外,優(yōu)先級(jí)高的線程還能不間斷地運(yùn)行直到完成任務(wù)為止——當(dāng)然,除非它被優(yōu)先級(jí)更高的線程搶占。這種眾所周知的基于優(yōu)先級(jí)的搶占式調(diào)度,可確保優(yōu)先級(jí)高的線程始終如一地滿足最后期限的要求,即使在其他線程爭(zhēng)奪 CPU 時(shí)間時(shí)。
搶占式內(nèi)核
大多數(shù)通用操作系統(tǒng)的操作系統(tǒng)內(nèi)核都不是搶占式的。因此,優(yōu)先級(jí)高的用戶線程無(wú)法搶占內(nèi)核調(diào)用,相反,它必須等待整個(gè)調(diào)用全部結(jié)束——即使是系統(tǒng)內(nèi)優(yōu)先級(jí)低的進(jìn)程進(jìn)行調(diào)用。此外,當(dāng)驅(qū)動(dòng)程序或其他系統(tǒng)服務(wù)(通常在內(nèi)核調(diào)用中運(yùn)行)以客戶端線程的名義執(zhí)行時(shí),操作系統(tǒng)通常會(huì)丟失所有優(yōu)先級(jí)信息。這種系統(tǒng)行為會(huì)導(dǎo)致無(wú)法預(yù)料的延遲,而且會(huì)妨礙關(guān)鍵運(yùn)行按時(shí)完成。
另一方面,在實(shí)時(shí)操作系統(tǒng)中,內(nèi)核運(yùn)行是可搶占的。雖然仍有一些時(shí)間窗無(wú)法搶占,但在設(shè)計(jì)精密的實(shí)時(shí)操作系統(tǒng)中,這些間隔非常短暫,通常大約僅幾百納秒。另外,實(shí)時(shí)操作系統(tǒng)會(huì)針對(duì)搶占推遲和中斷禁止的時(shí)限設(shè)置上限;這能保證軟件開(kāi)發(fā)人員確定情況最糟的延遲期。
為實(shí)現(xiàn)這一目標(biāo),實(shí)時(shí)操作系統(tǒng)內(nèi)核必須盡可能簡(jiǎn)單、精致。實(shí)現(xiàn)這種簡(jiǎn)單性的最佳途徑是設(shè)計(jì)一種只包含短執(zhí)行路徑服務(wù)的內(nèi)核。通過(guò)排除內(nèi)核中任務(wù)集中的運(yùn)行(如進(jìn)程加載)并將其分配到外部進(jìn)程或線程,實(shí)時(shí)操作系統(tǒng)的設(shè)計(jì)人員就能保證通過(guò)內(nèi)核的最長(zhǎng)的非搶占代碼路徑有上限。
在一些通用操作系統(tǒng),內(nèi)核增加了某種程度的可搶占性。但無(wú)法搶占的時(shí)間間隔仍然比常見(jiàn)實(shí)時(shí)操作系統(tǒng)的長(zhǎng)得多;這種搶占間隔的長(zhǎng)度取決于通用操作系統(tǒng)內(nèi)核中包含的最長(zhǎng)的關(guān)鍵模塊部分(如網(wǎng)絡(luò))。另外,搶占式通用操作系統(tǒng)內(nèi)核不能解決可能的無(wú)限期延遲情形,例如因?yàn)榭蛻舳苏{(diào)用驅(qū)動(dòng)程序或其他系統(tǒng)服務(wù)時(shí)丟失優(yōu)先級(jí)信息。
避免優(yōu)先級(jí)反轉(zhuǎn)的機(jī)制
即使在實(shí)時(shí)操作系統(tǒng)中,優(yōu)先級(jí)低的線程也能在無(wú)意中阻止優(yōu)先級(jí)高的線程訪問(wèn) CPU——這種情況被稱為優(yōu)先級(jí)反轉(zhuǎn)。當(dāng)出現(xiàn)無(wú)限期的優(yōu)先級(jí)反轉(zhuǎn)時(shí),可能會(huì)錯(cuò)過(guò)關(guān)鍵的最后期限,進(jìn)而導(dǎo)致系統(tǒng)運(yùn)行異常和全面故障的結(jié)果。遺憾的是,在系統(tǒng)設(shè)計(jì)過(guò)程中人們往往會(huì)忽視優(yōu)先級(jí)反轉(zhuǎn)。有很多優(yōu)先級(jí)反轉(zhuǎn)的實(shí)例,包括 1997 年 7 月火星探路者項(xiàng)目遭受困擾的實(shí)例。1
一般來(lái)說(shuō),當(dāng)優(yōu)先級(jí)不同的兩個(gè)任務(wù)共享資源,而優(yōu)先級(jí)高的任務(wù)無(wú)法從優(yōu)先級(jí)低的任務(wù)那里獲得資源時(shí),就會(huì)出現(xiàn)優(yōu)先級(jí)反轉(zhuǎn)。為防止這種狀況超過(guò)有限的時(shí)間間隔,實(shí)時(shí)操作系統(tǒng)可提供一種通用操作系統(tǒng)不具備的選擇機(jī)制,包括優(yōu)先級(jí)繼承和優(yōu)先級(jí)封頂模擬。我們不能單純地評(píng)價(jià)兩種機(jī)制的優(yōu)劣,所以我們著重介紹優(yōu)先級(jí)繼承的實(shí)例。
首先,我們必須考慮任務(wù)同步如何能造成阻塞,而阻塞反過(guò)來(lái)又如何導(dǎo)致優(yōu)先級(jí)反轉(zhuǎn)。我們假設(shè)有任務(wù) 1 和任務(wù) 2 兩個(gè)任務(wù)正在運(yùn)行,其中任務(wù) 1 具有較高的優(yōu)先級(jí)。如果任務(wù) 1 準(zhǔn)備執(zhí)行,但必須等待任務(wù) 2 完成運(yùn)行,就出現(xiàn)阻塞的狀況。同步化也會(huì)導(dǎo)致這種阻塞;例如,任務(wù) 1 和任務(wù) 2 共享由鎖或信號(hào)量控制的資源,任務(wù) 1 等待任務(wù) 2 對(duì)資源進(jìn)行解鎖?;蛘?,當(dāng)任務(wù) 1 請(qǐng)求目前正由任務(wù) 2 使用的服務(wù)時(shí),也會(huì)出現(xiàn)阻塞狀況。
1 Michael Barr.“優(yōu)先級(jí)反轉(zhuǎn)簡(jiǎn)介”《嵌入式系統(tǒng)編程》(Embedded Systems Programming),第 15 卷:2002 年 4 月 第 4 版。 3
阻塞允許任務(wù) 2 運(yùn)行,直到任務(wù) 1 等待的條件出現(xiàn)為止(例如,任務(wù) 2 對(duì)兩個(gè)任務(wù)共享的資源解鎖)。此時(shí),任務(wù) 1 可以執(zhí)行。任務(wù) 1 須等待的總時(shí)間會(huì)隨最少時(shí)間、平均時(shí)間和最多時(shí)間變化。這種間隔就是阻塞因數(shù)。如果任務(wù) 1 必須滿足一定的時(shí)間限制,該因數(shù)就不能隨任何參數(shù)變化,如線程數(shù)或系統(tǒng)內(nèi)的輸入。換句話說(shuō),必須限制阻塞因數(shù)。
現(xiàn)在,我們引入第三個(gè)任務(wù)(任務(wù) 3)——其優(yōu)先級(jí)比任務(wù) 2 的高但比任務(wù) 1 的低(參見(jiàn)圖 1)。當(dāng)任務(wù) 2 正在運(yùn)行時(shí),任務(wù) 3 準(zhǔn)備運(yùn)行,它會(huì)搶占任務(wù) 2,而任務(wù) 2 在任務(wù) 3 被阻塞或完成前都無(wú)法運(yùn)行。當(dāng)然,這樣會(huì)增加任務(wù) 1 的阻塞因數(shù);也就是說(shuō),它會(huì)進(jìn)一步延遲任務(wù) 1 的運(yùn)行。搶占導(dǎo)致的總延遲就是優(yōu)先級(jí)反轉(zhuǎn)。
實(shí)際上,可以有多個(gè)任務(wù)以這種方式搶占任務(wù) 2,從而導(dǎo)致連續(xù)阻塞的結(jié)果。在這種情況下,任務(wù) 2 可能被無(wú)限期地?fù)屨迹a(chǎn)生無(wú)限期的優(yōu)先級(jí)反轉(zhuǎn),導(dǎo)致任務(wù) 1 無(wú)法滿足其最后期限。
這時(shí)優(yōu)先級(jí)繼承就會(huì)發(fā)揮作用。如果我們回到上述假設(shè)中,在同步期內(nèi)使任務(wù) 2 以任務(wù) 1 的優(yōu)先級(jí)運(yùn)行,那么任務(wù) 3 就無(wú)法搶占任務(wù) 2,這樣就能避免優(yōu)先級(jí)反轉(zhuǎn)的產(chǎn)生(參見(jiàn)圖 2)。
圖 1——當(dāng)任務(wù) 3 搶占任務(wù) 2 時(shí),任務(wù) 1 等待任務(wù) 2 完成運(yùn)行。這進(jìn)一步推遲了任務(wù) 1 的運(yùn)行。 4
圖 2——任務(wù) 2 繼承了任務(wù) 1 的優(yōu)先級(jí),因而阻止了任務(wù) 3 搶占任務(wù) 2。任務(wù) 3 不再推遲任務(wù) 1 的運(yùn)行。
評(píng)論