大部分嵌入式項(xiàng)目還需要實(shí)時操作系統(tǒng)嗎?這個問題問得好,因?yàn)楝F(xiàn)代高性能處理器和 Linux,、Windows 和其他通用操作系統(tǒng) (GPOS) 的實(shí)時補(bǔ)丁的可用性都在飛速發(fā)展。嵌入式設(shè)備的本質(zhì)道出了答案,。在許多情況下,,制造設(shè)備都需要幾千甚至幾百萬個部件。哪怕設(shè)備硬件的單位成本節(jié)省 1 美元,,都會為制造商帶來不小的財(cái)富,。換言之,設(shè)備無法承受數(shù)千兆赫茲級處理器的成本(更不用說熱耗散了),。例如,,在汽車遠(yuǎn)程信息處理技術(shù)市場,,常見的 32 位處理器以約 600 Mhz 的速度運(yùn)行——遠(yuǎn)遠(yuǎn)慢于臺式機(jī)和服務(wù)器的常用處理器。在這種運(yùn)行環(huán)境中,,實(shí)時操作系統(tǒng)能得到低端硬件超快,、可預(yù)測的響應(yīng),因此具有顯著的節(jié)約成本的優(yōu)勢,。
除節(jié)約成本之外,,實(shí)時操作系統(tǒng)提供的服務(wù)還能使許多計(jì)算問題迎刃而解,特別是當(dāng)多種運(yùn)行爭奪系統(tǒng)資源時,。例如,,試想一個用戶期望(或需要)立即響應(yīng)輸入的系統(tǒng)。利用實(shí)時操作系統(tǒng),,軟件開發(fā)人員能確保用戶啟動的操作會先于其他系統(tǒng)活動執(zhí)行,,除非必須先執(zhí)行更重要的任務(wù)(如幫助保護(hù)用戶安全的運(yùn)行)。
再試想一個必須滿足服務(wù)質(zhì)量 (QoS) 要求的系統(tǒng),,例如一臺可播放現(xiàn)場視頻的設(shè)備,。如果設(shè)備依靠軟件播放其內(nèi)容,它可能會以用戶無法接受的速率出現(xiàn)失幀現(xiàn)象——從用戶的角度看,,該設(shè)備不可靠,。但使用實(shí)時操作系統(tǒng)的話,軟件開發(fā)人員就能精確控制軟件進(jìn)程的執(zhí)行順序,,確保以適當(dāng)和一致的媒體速率播放,。
實(shí)時操作系統(tǒng)并不“公平”
對“硬”實(shí)時的需求(以及對實(shí)現(xiàn)該功能的實(shí)時操作系統(tǒng)的需求)仍然是嵌入式產(chǎn)品業(yè)的普遍要求。問題是,,實(shí)時操作系統(tǒng)具備哪些通用操作系統(tǒng)所不具備的功能呢?適用于一些通用操作系統(tǒng)的實(shí)時擴(kuò)展組件有多大用處呢?它們能提供和實(shí)時操作系統(tǒng)一樣的性能嗎?
讓我們先從任務(wù)調(diào)度開始,。在通用操作系統(tǒng)中,調(diào)度程序通常使用一種“公平”策略,,將線程和進(jìn)程分配到 CPU 中,。這種策略可確保臺式機(jī)和服務(wù)器的應(yīng)用程序所需的較高的總吞吐量,但無法保證優(yōu)先級高,、時間要求嚴(yán)格的線程先于優(yōu)先級低的線程執(zhí)行,。
例如,通用操作系統(tǒng)可能會降低分配給優(yōu)先級高的線程的優(yōu)先級,,或按照有利于系統(tǒng)內(nèi)其他線程的公平原則,,以動態(tài)方式調(diào)整優(yōu)先級。因此,,優(yōu)先級高的線程就可能被優(yōu)先級低的線程搶占,。此外,大多數(shù)通用操作系統(tǒng)都具有無限期的分配潛伏期:系統(tǒng)內(nèi)的線程越多,,通用操作系統(tǒng)調(diào)度線程執(zhí)行所需的時間就越久,。其中任何一種因素都能導(dǎo)致優(yōu)先級高的線程錯過最后期限,,即使在速度很快的 CPU 上。
另一方面,,在實(shí)時操作系統(tǒng)中,,線程會按其優(yōu)先級的順序執(zhí)行。如果優(yōu)先級高的線程準(zhǔn)備運(yùn)行,,它能在很短且有限的時間間隔內(nèi),,從正在執(zhí)行的優(yōu)先級低的線程那里接管 CPU。此外,,優(yōu)先級高的線程還能不間斷地運(yùn)行直到完成任務(wù)為止——當(dāng)然,除非它被優(yōu)先級更高的線程搶占,。這種眾所周知的基于優(yōu)先級的搶占式調(diào)度,,可確保優(yōu)先級高的線程始終如一地滿足最后期限的要求,即使在其他線程爭奪 CPU 時間時,。
搶占式內(nèi)核
大多數(shù)通用操作系統(tǒng)的操作系統(tǒng)內(nèi)核都不是搶占式的,。因此,優(yōu)先級高的用戶線程無法搶占內(nèi)核調(diào)用,,相反,,它必須等待整個調(diào)用全部結(jié)束——即使是系統(tǒng)內(nèi)優(yōu)先級低的進(jìn)程進(jìn)行調(diào)用。此外,,當(dāng)驅(qū)動程序或其他系統(tǒng)服務(wù)(通常在內(nèi)核調(diào)用中運(yùn)行)以客戶端線程的名義執(zhí)行時,,操作系統(tǒng)通常會丟失所有優(yōu)先級信息。這種系統(tǒng)行為會導(dǎo)致無法預(yù)料的延遲,,而且會妨礙關(guān)鍵運(yùn)行按時完成,。
另一方面,在實(shí)時操作系統(tǒng)中,,內(nèi)核運(yùn)行是可搶占的,。雖然仍有一些時間窗無法搶占,但在設(shè)計(jì)精密的實(shí)時操作系統(tǒng)中,,這些間隔非常短暫,,通常大約僅幾百納秒。另外,,實(shí)時操作系統(tǒng)會針對搶占推遲和中斷禁止的時限設(shè)置上限;這能保證軟件開發(fā)人員確定情況最糟的延遲期,。
為實(shí)現(xiàn)這一目標(biāo),實(shí)時操作系統(tǒng)內(nèi)核必須盡可能簡單,、精致,。實(shí)現(xiàn)這種簡單性的最佳途徑是設(shè)計(jì)一種只包含短執(zhí)行路徑服務(wù)的內(nèi)核。通過排除內(nèi)核中任務(wù)集中的運(yùn)行(如進(jìn)程加載)并將其分配到外部進(jìn)程或線程,,實(shí)時操作系統(tǒng)的設(shè)計(jì)人員就能保證通過內(nèi)核的最長的非搶占代碼路徑有上限,。
在一些通用操作系統(tǒng),,內(nèi)核增加了某種程度的可搶占性。但無法搶占的時間間隔仍然比常見實(shí)時操作系統(tǒng)的長得多;這種搶占間隔的長度取決于通用操作系統(tǒng)內(nèi)核中包含的最長的關(guān)鍵模塊部分(如網(wǎng)絡(luò)),。另外,,搶占式通用操作系統(tǒng)內(nèi)核不能解決可能的無限期延遲情形,例如因?yàn)榭蛻舳苏{(diào)用驅(qū)動程序或其他系統(tǒng)服務(wù)時丟失優(yōu)先級信息,。
避免優(yōu)先級反轉(zhuǎn)的機(jī)制
即使在實(shí)時操作系統(tǒng)中,,優(yōu)先級低的線程也能在無意中阻止優(yōu)先級高的線程訪問 CPU——這種情況被稱為優(yōu)先級反轉(zhuǎn)。當(dāng)出現(xiàn)無限期的優(yōu)先級反轉(zhuǎn)時,,可能會錯過關(guān)鍵的最后期限,,進(jìn)而導(dǎo)致系統(tǒng)運(yùn)行異常和全面故障的結(jié)果。遺憾的是,,在系統(tǒng)設(shè)計(jì)過程中人們往往會忽視優(yōu)先級反轉(zhuǎn),。有很多優(yōu)先級反轉(zhuǎn)的實(shí)例,包括 1997 年 7 月火星探路者項(xiàng)目遭受困擾的實(shí)例,。1
一般來說,,當(dāng)優(yōu)先級不同的兩個任務(wù)共享資源,而優(yōu)先級高的任務(wù)無法從優(yōu)先級低的任務(wù)那里獲得資源時,,就會出現(xiàn)優(yōu)先級反轉(zhuǎn),。為防止這種狀況超過有限的時間間隔,實(shí)時操作系統(tǒng)可提供一種通用操作系統(tǒng)不具備的選擇機(jī)制,,包括優(yōu)先級繼承和優(yōu)先級封頂模擬,。我們不能單純地評價兩種機(jī)制的優(yōu)劣,所以我們著重介紹優(yōu)先級繼承的實(shí)例,。
首先,,我們必須考慮任務(wù)同步如何能造成阻塞,而阻塞反過來又如何導(dǎo)致優(yōu)先級反轉(zhuǎn),。我們假設(shè)有任務(wù) 1 和任務(wù) 2 兩個任務(wù)正在運(yùn)行,,其中任務(wù) 1 具有較高的優(yōu)先級。如果任務(wù) 1 準(zhǔn)備執(zhí)行,,但必須等待任務(wù) 2 完成運(yùn)行,,就出現(xiàn)阻塞的狀況。同步化也會導(dǎo)致這種阻塞;例如,,任務(wù) 1 和任務(wù) 2 共享由鎖或信號量控制的資源,,任務(wù) 1 等待任務(wù) 2 對資源進(jìn)行解鎖?;蛘?,當(dāng)任務(wù) 1 請求目前正由任務(wù) 2 使用的服務(wù)時,也會出現(xiàn)阻塞狀況。
1 Michael Barr.“優(yōu)先級反轉(zhuǎn)簡介”
阻塞允許任務(wù) 2 運(yùn)行,,直到任務(wù) 1 等待的條件出現(xiàn)為止(例如,,任務(wù) 2 對兩個任務(wù)共享的資源解鎖)。此時,,任務(wù) 1 可以執(zhí)行,。任務(wù) 1 須等待的總時間會隨最少時間、平均時間和最多時間變化,。這種間隔就是阻塞因數(shù),。如果任務(wù) 1 必須滿足一定的時間限制,該因數(shù)就不能隨任何參數(shù)變化,,如線程數(shù)或系統(tǒng)內(nèi)的輸入,。換句話說,必須限制阻塞因數(shù),。
現(xiàn)在,,我們引入第三個任務(wù)(任務(wù) 3)——其優(yōu)先級比任務(wù) 2 的高但比任務(wù) 1 的低(參見圖 1)。當(dāng)任務(wù) 2 正在運(yùn)行時,,任務(wù) 3 準(zhǔn)備運(yùn)行,它會搶占任務(wù) 2,,而任務(wù) 2 在任務(wù) 3 被阻塞或完成前都無法運(yùn)行,。當(dāng)然,這樣會增加任務(wù) 1 的阻塞因數(shù);也就是說,,它會進(jìn)一步延遲任務(wù) 1 的運(yùn)行,。搶占導(dǎo)致的總延遲就是優(yōu)先級反轉(zhuǎn)。
實(shí)際上,,可以有多個任務(wù)以這種方式搶占任務(wù) 2,,從而導(dǎo)致連續(xù)阻塞的結(jié)果。在這種情況下,,任務(wù) 2 可能被無限期地?fù)屨?,產(chǎn)生無限期的優(yōu)先級反轉(zhuǎn),導(dǎo)致任務(wù) 1 無法滿足其最后期限,。
這時優(yōu)先級繼承就會發(fā)揮作用,。如果我們回到上述假設(shè)中,在同步期內(nèi)使任務(wù) 2 以任務(wù) 1 的優(yōu)先級運(yùn)行,,那么任務(wù) 3 就無法搶占任務(wù) 2,,這樣就能避免優(yōu)先級反轉(zhuǎn)的產(chǎn)生(參見圖 2)?!?/p>
圖 1——當(dāng)任務(wù) 3 搶占任務(wù) 2 時,,任務(wù) 1 等待任務(wù) 2 完成運(yùn)行。這進(jìn)一步推遲了任務(wù) 1 的運(yùn)行。 4
圖 2——任務(wù) 2 繼承了任務(wù) 1 的優(yōu)先級,,因而阻止了任務(wù) 3 搶占任務(wù) 2,。任務(wù) 3 不再推遲任務(wù) 1 的運(yùn)行。
提供有保證的 CPU 可用性的分區(qū)調(diào)度
保證資源的可用性對許多系統(tǒng)而言都至關(guān)重要,。如果某個關(guān)鍵子系統(tǒng)(如 CPU 周期)丟失,,用戶就無法獲取該子系統(tǒng)提供的服務(wù)。例如,,在拒絕服務(wù) (DoS) 攻擊中,,惡意用戶會利用需要優(yōu)先級高的進(jìn)程處理的請求攻擊系統(tǒng)。該進(jìn)程會使 CPU 過載并導(dǎo)致其他進(jìn)程的 CPU 周期匱乏,,從而使用戶無法使用系統(tǒng),。
安全漏洞并非是導(dǎo)致進(jìn)程匱乏的唯一原因。在許多情況下,,增加系統(tǒng)的軟件功能都會導(dǎo)致系統(tǒng)“瀕臨危險邊緣”,,導(dǎo)致現(xiàn)有應(yīng)用程序的 CPU 時間匱乏。及時運(yùn)行的應(yīng)用程序或服務(wù)不再按預(yù)期或要求的那樣迅速響應(yīng),。從歷史角度,,解決這一問題的唯一途徑是更新硬件或?qū)浖M(jìn)行重新編碼(或重新設(shè)計(jì))——這兩種方法都無法讓人滿意。
為解決這些問題,,系統(tǒng)設(shè)計(jì)人員需要一種可通過硬件或軟件執(zhí)行 CPU 預(yù)算的分區(qū)計(jì)劃,,以阻止進(jìn)程或線程獨(dú)占其他進(jìn)程或線程所需的 CPU 周期。實(shí)時操作系統(tǒng)正是執(zhí)行 CPU 分區(qū)預(yù)算的最佳選擇,,因?yàn)閷?shí)時操作系統(tǒng)已經(jīng)提供了對 CPU,、內(nèi)存和其他計(jì)算資源的集中訪問。
某些實(shí)時操作系統(tǒng)提供了固定分區(qū)調(diào)度算法,。系統(tǒng)設(shè)計(jì)人員能利用這種調(diào)度算法對任務(wù)進(jìn)行分組或分區(qū),,然后為每個分區(qū)分配一定比例的 CPU 時間。利用這種方法,,任何既定分區(qū)內(nèi)的任務(wù)消耗的 CPU 時間都不會超過該分區(qū)靜態(tài)確定的比例,。例如,我們假設(shè)為分區(qū)分配了 30% 的 CPU,。如果該分區(qū)內(nèi)的進(jìn)程隨后成為拒絕服務(wù)攻擊的目標(biāo),,它會消耗不超過 30% 的 CPU 時間。這種分配限制確保了其他進(jìn)程保持各自的可用性;例如,,它能保證可訪問的用戶界面(如遠(yuǎn)程終端),。因此,操作人員能訪問系統(tǒng)并解決問題——無需按動復(fù)位開關(guān),。 5
但是,,這種方法也存在問題。由于調(diào)度算法是固定的,因此一個分區(qū)無法使用分配到另一個分區(qū)的 CPU 周期,,即使這些分區(qū)未使用其分配的周期,。這種方法會浪費(fèi) CPU 周期并阻止系統(tǒng)處理高峰需求。因此,,系統(tǒng)設(shè)計(jì)人員必須使用更昂貴的處理器應(yīng)對運(yùn)行緩慢的系統(tǒng),,或限制系統(tǒng)能支持的功能數(shù)量。
自適應(yīng)分區(qū)
另一種被稱作自適應(yīng)分區(qū)的方法提供了更靈活的動態(tài)調(diào)度算法,,從而有效克服了這些缺陷,。與靜態(tài)分區(qū)一樣,自適應(yīng)分區(qū)允許系統(tǒng)設(shè)計(jì)人員為單獨(dú)進(jìn)程或一組進(jìn)程預(yù)留 CPU 周期,。因此,,系統(tǒng)設(shè)計(jì)人員能保證一個子系統(tǒng)或分區(qū)上的負(fù)載不會影響其他子系統(tǒng)的可用性。而且,,與靜態(tài)分區(qū)不同的是,,自適應(yīng)分區(qū)還能將空閑分區(qū)中的 CPU 周期以動態(tài)方式重新分配到可受益于額外處理時間的分區(qū)——只有當(dāng) CPU 滿載時,分區(qū)預(yù)算才會執(zhí)行,。因此,,系統(tǒng)就能處理高峰需求并使利用率達(dá)到 100%,同時又能繼續(xù)享受資源保證帶來的收益,。
同樣重要的是,,自適應(yīng)分區(qū)還能直接應(yīng)用于先有系統(tǒng),而無需重新設(shè)計(jì)代碼或修改代碼,。例如,在 QNX Neutrino 中,,系統(tǒng)設(shè)計(jì)人員只需啟動分區(qū)內(nèi)已有的基于 POSIX 應(yīng)用程序,,實(shí)時操作系統(tǒng)的調(diào)度程序就會確保每個分區(qū)都會收到分配的預(yù)算。在每個分區(qū)內(nèi),,會繼續(xù)根據(jù)基于優(yōu)先級的搶占式調(diào)度算法對每項(xiàng)任務(wù)進(jìn)行調(diào)度——應(yīng)用程序不必更改其調(diào)度運(yùn)行,。此外,系統(tǒng)設(shè)計(jì)人員還能以動態(tài)方式重新配置分區(qū),,以精確調(diào)節(jié)系統(tǒng)實(shí)現(xiàn)最佳性能,。
圖 3——自適應(yīng)分區(qū)可阻止優(yōu)先級高的任務(wù)消耗超過其分配的規(guī)定比例的 CPU,除非系統(tǒng)包含未使用的 CPU 周期,。例如,,任務(wù) A 和任務(wù) D 可在分配至分區(qū) 3 的時間內(nèi)運(yùn)行,因?yàn)槿蝿?wù) E 和任務(wù) F 不需要剩余的 CPU 周期預(yù)算,。 6
“組合”內(nèi)核
通用操作系統(tǒng)(包括 Linux,、Windows 和各種類型的 Unix 系統(tǒng))通常都缺少我們目前介紹的實(shí)時機(jī)制。但供應(yīng)商已開發(fā)出許多實(shí)時擴(kuò)展組件和補(bǔ)丁,試圖填補(bǔ)這一空白,。例如,,有一種雙內(nèi)核方法,其中的通用操作系統(tǒng)能以任務(wù)的形式在專用實(shí)時內(nèi)核上運(yùn)行(參見圖 4),。任何需要確定性調(diào)度的任務(wù)都會在該內(nèi)核中運(yùn)行,,但其優(yōu)先級要高于通用操作系統(tǒng)的優(yōu)先級。因此,,只要這些任務(wù)需要運(yùn)行,,它們就能搶占 Linux,而且只有在其工作完成后,,才會向 Linux 釋放 CPU,。
遺憾的是,實(shí)時內(nèi)核中運(yùn)行的任務(wù)只能有限地利用通用操作系統(tǒng)中現(xiàn)有的系統(tǒng)服務(wù),,如文件系統(tǒng),、網(wǎng)絡(luò)服務(wù)等。
實(shí)際上,,如果實(shí)時任務(wù)向通用操作系統(tǒng)請求任何服務(wù),,它都會面臨同樣的搶占問題,這會阻止通用操作系統(tǒng)以確定方式運(yùn)行,。因此,,必須針對實(shí)時內(nèi)核創(chuàng)建新的驅(qū)動程序和系統(tǒng)服務(wù),即使通用操作系統(tǒng)中已存在相同的服務(wù),。但是,,多數(shù)通用操作系統(tǒng)為正常的非實(shí)時進(jìn)程提供的受內(nèi)存管理單元 (MMU) 保護(hù)的可靠環(huán)境卻無法惠及在實(shí)時內(nèi)核中運(yùn)行的任務(wù)。相反,,它們會在無保護(hù)的內(nèi)核空間運(yùn)行,。因此,任何含有公共編碼錯誤(如損壞的 C 指針)的實(shí)時任務(wù)都會輕易導(dǎo)致內(nèi)核出現(xiàn)嚴(yán)重故障,。這的確是一個問題,,因?yàn)樾枰獙?shí)時功能的大部分系統(tǒng)同樣需要極高的可靠性。
雙內(nèi)核方法的不同實(shí)現(xiàn)使用不同的應(yīng)用程序接口 (API) 使問題進(jìn)一步復(fù)雜,。在多數(shù)情況下,,為通用操作系統(tǒng)編寫的服務(wù)無法輕易移植到實(shí)時內(nèi)核中,而且針對一個供應(yīng)商的實(shí)時擴(kuò)展組件編寫的任務(wù)未必能在另一個供應(yīng)商的實(shí)時擴(kuò)展組件上運(yùn)行,。
圖 4——在常見的雙內(nèi)核實(shí)現(xiàn)中,,通用操作系統(tǒng)會作為優(yōu)先級最低的任務(wù)在單獨(dú)的實(shí)時內(nèi)核中運(yùn)行。
這種解決方案指出了使通用操作系統(tǒng)支持實(shí)時運(yùn)行的實(shí)際困難和復(fù)雜性,。但這并非是關(guān)于實(shí)時操作系統(tǒng)和通用操作系統(tǒng)孰優(yōu)孰劣的問題,。通用操作系統(tǒng)(如 Linux,、Windows 和各種 Unix 系統(tǒng))都能以臺式機(jī)或服務(wù)器操作系統(tǒng)的形式正常運(yùn)行。但是,,當(dāng)進(jìn)入不符合其設(shè)計(jì)用途的確定運(yùn)行環(huán)境中(如車載遠(yuǎn)程信息處理裝置,、醫(yī)療器械、實(shí)時控制系統(tǒng)和連續(xù)媒體應(yīng)用)時,,它們就會凸顯不足,。 7
令調(diào)試和定制更輕松的源代碼
使用通用操作系統(tǒng)仍有一些好處,例如在 Linux 的開源模式下支持廣泛使用的應(yīng)用程序接口 (API),。利用開源模式,,軟件開發(fā)人員能針對應(yīng)用程序的具體需求定制操作系統(tǒng)組件,從而能節(jié)約大量用于故障排解的時間,。為保持這些優(yōu)勢,,實(shí)時操作系統(tǒng)的供應(yīng)商應(yīng)根據(jù)友好的商業(yè)授權(quán)許可條款,確保其源代碼易于訪問,。
實(shí)時操作系統(tǒng)的架構(gòu)也發(fā)揮了重要作用,。例如,基于微內(nèi)核設(shè)計(jì)的實(shí)時操作系統(tǒng)能從根本上簡化操作系統(tǒng)的定制過程,。在微內(nèi)核實(shí)時操作系統(tǒng)中,,只有少數(shù)核心基本對象(如信號、計(jì)時器,、調(diào)度程序)才會存在于內(nèi)核中,。所有其他組件(驅(qū)動程序、文件系統(tǒng),、協(xié)議棧,、應(yīng)用程序)都會以單獨(dú)的受內(nèi)存保護(hù)的進(jìn)程在內(nèi)核外部運(yùn)行;參見圖 5。因此,,開發(fā)定制的驅(qū)動程序和其他與應(yīng)用程序有關(guān)的操作系統(tǒng)擴(kuò)展組件無需專門的內(nèi)核調(diào)試程序或內(nèi)核專家,。實(shí)際上,作為用戶空間程序,,開發(fā)這種操作系統(tǒng)擴(kuò)展組件和開發(fā)標(biāo)準(zhǔn)應(yīng)用程序一樣容易,因?yàn)殚_發(fā)人員都能使用標(biāo)準(zhǔn),、源代碼級工具對它們進(jìn)行調(diào)試,。
圖 5——在微內(nèi)核實(shí)時操作系統(tǒng)中,系統(tǒng)服務(wù)作為標(biāo)準(zhǔn)的用戶空間進(jìn)程運(yùn)行,,因而簡化了操作系統(tǒng)的定制任務(wù),。
例如,如果設(shè)備驅(qū)動程序試圖訪問其進(jìn)程空間之外的內(nèi)存,,操作系統(tǒng)就能識別相關(guān)進(jìn)程,,指出故障位置并創(chuàng)建可使用源代碼級調(diào)試工具查看的進(jìn)程轉(zhuǎn)儲文件,。轉(zhuǎn)儲文件可包括調(diào)試程序確定導(dǎo)致故障的源代碼行所需的所有信息以及診斷信息(如數(shù)據(jù)項(xiàng)的內(nèi)容和函數(shù)調(diào)用的歷史)。 8
這種架構(gòu)還提供了絕佳的故障隔離和恢復(fù)功能:如果驅(qū)動程序,、協(xié)議?;蚱渌到y(tǒng)服務(wù)出現(xiàn)故障,它可在不影響其他服務(wù)或損壞操作系統(tǒng)內(nèi)核的情況下完成這種操作,。實(shí)際上,,“軟件監(jiān)視程序”會持續(xù)監(jiān)測此類事件,并能以動態(tài)方式重啟出現(xiàn)故障的服務(wù),,無需重啟整個系統(tǒng)或以任何方式干擾用戶,。同樣,驅(qū)動程序和其他服務(wù)都能以動態(tài)方式停止,、啟動或升級,,無需關(guān)閉系統(tǒng)。
絕不可小看這些優(yōu)勢——因?yàn)槠茐膶?shí)時性能的最大威脅就是不定期的系統(tǒng)重啟!甚至軟件更新中包含的以可控制的方式進(jìn)行的預(yù)定重啟都會干擾系統(tǒng)運(yùn)行,。為保證一直滿足最后期限的要求,,軟件開發(fā)人員必須使用即使在出現(xiàn)軟件故障或進(jìn)行服務(wù)升級時,也能保持連續(xù)可用的操作系統(tǒng),。
戰(zhàn)略決策
實(shí)時操作系統(tǒng)能使復(fù)雜的應(yīng)用程序變得可預(yù)測而且可靠;實(shí)際上,,實(shí)時操作系統(tǒng)實(shí)現(xiàn)的精確時間控制,就是通用操作系統(tǒng)無法提供的可靠功能,。(如果基于通用操作系統(tǒng)的系統(tǒng)由于計(jì)時錯誤而無法正常運(yùn)行,,我們可以合理認(rèn)為該系統(tǒng)不可靠。)選擇正確的實(shí)時操作系統(tǒng)本身仍然是一項(xiàng)復(fù)雜的任務(wù),。實(shí)時操作系統(tǒng)的底層架構(gòu)是重要標(biāo)準(zhǔn),,而其他因素也不例外。具體包括:
• 調(diào)度算法的靈活選擇——實(shí)時操作系統(tǒng)支持調(diào)度算法選擇(先入先出 [FIFO] 調(diào)度,、循環(huán)調(diào)度,、偶發(fā)調(diào)度等)嗎?您能根據(jù)每個線程分配這些算法嗎?或者實(shí)時操作系統(tǒng)要求您針對系統(tǒng)中的所有線程分配一種算法嗎?
• 時間分區(qū)——實(shí)時操作系統(tǒng)支持能為進(jìn)程提供有保證的 CPU 周期預(yù)算的時間分區(qū)嗎?這種保證簡化了對多個開發(fā)團(tuán)隊(duì)或供應(yīng)商的子系統(tǒng)進(jìn)行集成的工作。它們還能確保關(guān)鍵任務(wù)在系統(tǒng)遭到拒絕服務(wù) (DoS) 攻擊和其他惡意攻擊時,,保持可用并滿足其最后期限的要求,。
• 支持多核處理器——向多核處理器遷移的功能已成為各種高性能設(shè)計(jì)的基本要求。實(shí)時操作系統(tǒng)是否支持多重處理模式(對稱多重處理,、不對稱多重處理,、混合多重處理)的選擇,并幫助您最大限度地利用多核硬件?允許您診斷和優(yōu)化多核系統(tǒng)性能的系統(tǒng)跟蹤工具支持實(shí)時操作系統(tǒng)嗎?如果沒有能顯示資源競爭,、線程的過度遷移和其他多核設(shè)計(jì)常見問題的工具,,那么對多核系統(tǒng)進(jìn)行優(yōu)化就會變得異常麻煩和費(fèi)時。
• 遠(yuǎn)程診斷工具——由于許多嵌入式系統(tǒng)都不允許有故障時間,,因此實(shí)時操作系統(tǒng)供應(yīng)商應(yīng)提供能在不中斷系統(tǒng)服務(wù)的情況下分析系統(tǒng)運(yùn)行的診斷工具,。尋找能提供運(yùn)行分析工具(用于系統(tǒng)剖析,、應(yīng)用程序剖析和內(nèi)存分析的)的供應(yīng)商。
• 開放的開發(fā)平臺——實(shí)時操作系統(tǒng)供應(yīng)商能否提供基于開放平臺(如 Eclipse)的開發(fā)環(huán)境,,允許您“插入”您最喜歡的第三方工具以便進(jìn)行建模,、版本控制等工作?或者,開發(fā)環(huán)境是基于專有技術(shù)的嗎?
• 圖形用戶界面——實(shí)時操作系統(tǒng)使用基元圖形庫嗎?或者它提供了高級圖形處理功能(如多層界面,、基于 Flash 的人機(jī)界面,、多目標(biāo)顯示、3D 加速渲染和真正的窗口系統(tǒng))嗎?您能輕松地自定義圖形用戶界面的視覺效果嗎?圖形用戶界面能同時顯示和輸入多種語言(中文,、朝鮮語,、日語、英語,、俄語等)嗎?2D(如 Flash)和 3D(如 OpenGL ES)應(yīng)用程序能輕松共享同一屏幕嗎? 9
• 標(biāo)準(zhǔn)應(yīng)用程序接口——實(shí)時操作系統(tǒng)限制您使用專有應(yīng)用程序接口嗎?或者它提供了對標(biāo)準(zhǔn)應(yīng)用程序接口(如 POSIX 和 OpenGL ES)的認(rèn)證支持,,使各種運(yùn)行環(huán)境之間的代碼移植變得更容易?實(shí)時操作系統(tǒng)還提供對應(yīng)用程序接口的綜合支持嗎?還是只支持一小部分已定義接口的子集?
• 源代碼——實(shí)時操作系統(tǒng)供應(yīng)商允許您輕松訪問源代碼以簡化調(diào)試過程,并幫助您根據(jù)具體需求定制實(shí)時操作系統(tǒng)服務(wù)嗎?
• 面向數(shù)字媒體的中間件——對數(shù)字媒體的靈活支持已成為各種嵌入式系統(tǒng)(如車載收音機(jī),、醫(yī)療設(shè)備,、工業(yè)控制系統(tǒng)、媒體服務(wù)器以及消費(fèi)電子產(chǎn)品)的設(shè)計(jì)要求,。系統(tǒng)可能需要處理多種媒體資源(如 USB 閃存,、MP3 播放器、網(wǎng)絡(luò)流媒體,、藍(lán)牙電話等),,分辨多種數(shù)據(jù)格式(如 MP3、WMA,、AAC,、MPEG-2、MPEG-4 等)并支持各種數(shù)字版權(quán)管理 (DRM) 方案,。通過為數(shù)字媒體提供設(shè)計(jì)精密的中間件,,實(shí)時操作系統(tǒng)供應(yīng)商能避免連接多媒體資源、組織數(shù)據(jù)以及初始化適當(dāng)?shù)臄?shù)據(jù)處理路徑所需的大量軟件工作,。另外,,設(shè)計(jì)完善的中間件解決方案還能靈活支持新的數(shù)據(jù)源(如下一代 iPod),無需修改用戶界面或其他軟件組件,。
選擇實(shí)時操作系統(tǒng)是項(xiàng)目團(tuán)隊(duì)的戰(zhàn)略性決策,。如果實(shí)時系統(tǒng)供應(yīng)商針對以上問題給出了清楚的答案,那么您離現(xiàn)在和將來選擇到完全適用的實(shí)時操作系統(tǒng)又近了一步,。