提高實(shí)時(shí)操作系統(tǒng)的實(shí)時(shí)性能和可靠性策略
可搶占的內(nèi)核
在大部分通用操作系統(tǒng)中,操作系統(tǒng)的內(nèi)核是不可搶占的。其結(jié)果是,一個(gè)高優(yōu)先級的進(jìn)程不可能搶占一個(gè)內(nèi)核調(diào)用,而是必須等待整個(gè)調(diào)用完成,即使這個(gè)調(diào)用是由系統(tǒng)中的低優(yōu)先級進(jìn)程發(fā)起的。另外,當(dāng)經(jīng)常在內(nèi)核調(diào)用中執(zhí)行的驅(qū)動(dòng)程序或其它系統(tǒng)服務(wù)代表一個(gè)客戶線程執(zhí)行的時(shí)候,所有的優(yōu)先級信息經(jīng)常會(huì)丟失,這導(dǎo)致了不可猜測的延遲并阻止了關(guān)鍵活動(dòng)的準(zhǔn)時(shí)完成。
而在RTOS中,內(nèi)核操作是可搶占的。盡管仍然會(huì)存在一些時(shí)間窗口,在這些時(shí)間窗口中可能沒有搶占,但是這些時(shí)間間隔應(yīng)該是相當(dāng)短暫的,通常在幾百納秒。另外,必須有一個(gè)關(guān)于搶占被推遲或中斷被禁止的時(shí)間上限,這樣開發(fā)者可以確定最壞情形下的等待時(shí)間。
為了實(shí)現(xiàn)這個(gè)目標(biāo),操作系統(tǒng)內(nèi)核必須盡可能簡潔,只有具有較短執(zhí)行路徑的服務(wù)才被包含在內(nèi)核中,任何需要大量工作的操作必須被安排到外部進(jìn)程或線程。這種方法有助于通過內(nèi)核確保最長的不可搶占代碼路徑具有一個(gè)時(shí)間上限。
優(yōu)先級繼續(xù)
然而,為一個(gè)進(jìn)程設(shè)定一個(gè)高優(yōu)先級并不總能保證該進(jìn)程能夠搶占低優(yōu)先級的進(jìn)程。有時(shí)候,系統(tǒng)會(huì)出現(xiàn)一種稱為優(yōu)先級倒置的狀態(tài),在這種狀態(tài)下,低優(yōu)先級的進(jìn)程將在“無意中”阻止較高優(yōu)先級進(jìn)程占用CPU。優(yōu)先級倒置可能會(huì)表現(xiàn)為幾種形式,為了防止發(fā)生這種情況,RTOS必須提供一種稱為優(yōu)先級繼續(xù)的功能。
假定系統(tǒng)有三個(gè)進(jìn)程:A,B,Z。這里Z是一個(gè)為A和B提供服務(wù)的“服務(wù)器”進(jìn)程。
現(xiàn)在假定A已經(jīng)請求Z來執(zhí)行一個(gè)計(jì)算,而在這期間,忽然B需要Z的服務(wù)。因?yàn)锽擁有比A更高的優(yōu)先級,一般會(huì)認(rèn)為Z將立即掛起A的請求并將轉(zhuǎn)向?yàn)锽服務(wù)。但是實(shí)際情況并非如此,因?yàn)閆比B具有更高的優(yōu)先級。其結(jié)果是,B不能阻止Z完成它當(dāng)前的工作,即對A做出響應(yīng)。
從效果上看,低優(yōu)先級的進(jìn)程A占用了更高優(yōu)先級進(jìn)程B的CPU時(shí)間,這是引入優(yōu)先級繼續(xù)的原因。通過使用RTOS提供的優(yōu)先級繼續(xù)機(jī)制,系統(tǒng)可以在A發(fā)出請求的情況下,讓Z繼續(xù)A的低優(yōu)先級。通過這種方式,B能夠在任何時(shí)候搶占A的請求。
假如一個(gè)應(yīng)用程序分布于幾個(gè)通過網(wǎng)絡(luò)連接的處理器,那么RTOS也應(yīng)該支持分布式優(yōu)先級繼續(xù),這樣可以按照優(yōu)先級的順序處理來自多個(gè)處理器的請求。假如沒有優(yōu)先級繼續(xù),一個(gè)多處理器系統(tǒng)可能會(huì)落入無限的優(yōu)先級倒置和死鎖中。
中斷處理
為了獲得對外部事件的及時(shí)響應(yīng),最小化硬件中斷發(fā)生到執(zhí)行該中斷的第一條代碼的時(shí)間很重要。這個(gè)時(shí)間間隔稱為中斷延遲,為了保證中斷延遲盡可能小,一個(gè)好的RTOS應(yīng)該在幾乎所有時(shí)間內(nèi)都支持產(chǎn)生中斷。正如在關(guān)于內(nèi)核搶占部分提到的那樣,一些重要的代碼段的確需要暫時(shí)屏蔽中斷。這種最大的屏蔽時(shí)間通常被定義為最大的中斷延遲。
在某些情況下,硬件中斷處理器必須調(diào)度并運(yùn)行一個(gè)更高優(yōu)先級的線程。在這樣的情況下,中斷處理器將返回并指示一個(gè)事件將被處理。這樣的處理將引入了第二種形式的延遲-調(diào)度延遲,這個(gè)延時(shí)必須在設(shè)計(jì)中加以考慮。調(diào)度延遲是介于用戶的中斷處理器的最后一條指令和驅(qū)動(dòng)程序線程第一條指令的執(zhí)行之間的時(shí)間。
在一個(gè)嵌入式系統(tǒng)中可能會(huì)同時(shí)出現(xiàn)多個(gè)硬件中斷。例如,在一個(gè)病人監(jiān)護(hù)系統(tǒng)中,當(dāng)一個(gè)傳感器記錄了病人心跳的一次變化并且網(wǎng)卡接收到網(wǎng)絡(luò)傳來的數(shù)據(jù)的同時(shí),護(hù)士按了觸摸屏。很明顯,一些中斷應(yīng)該立即得到處理,而其他的則可以延緩。通過提供對嵌套中斷的支持,RTOS支持嵌入式系統(tǒng)優(yōu)先處理更高優(yōu)先級的中斷。
如何提高可靠性
我們已經(jīng)明白怎樣使RTOS具有可以猜測性,但是如何實(shí)現(xiàn)其可靠性呢?答案在很大程度上取決于RTOS的架構(gòu)。
例如在實(shí)時(shí)執(zhí)行模式架構(gòu)中,大部分或所有軟件組件都在一個(gè)單一的內(nèi)存地址空間中運(yùn)行,包括操作系統(tǒng)內(nèi)核、網(wǎng)絡(luò)協(xié)議棧、設(shè)備驅(qū)動(dòng)程序、應(yīng)用程序等。雖然很有效率,但這種架構(gòu)有兩個(gè)明顯的缺陷:在任何組件中的一個(gè)指針錯(cuò)誤,不論這個(gè)錯(cuò)誤多么細(xì)微,都可能破壞操作系統(tǒng)內(nèi)核或任何其它組件,導(dǎo)致不可猜測的行為和整個(gè)系統(tǒng)的崩潰;很難動(dòng)態(tài)修復(fù)或替換任何有故障的組件。在大多數(shù)情況下,出現(xiàn)這些問題時(shí)系統(tǒng)復(fù)位是唯一的選擇。
一些RTOS,也像Linux一樣,試圖通過使用單內(nèi)核架構(gòu)來解決這個(gè)問題。在這種架構(gòu)中,用戶的應(yīng)用程序在隔離的、受保護(hù)內(nèi)存地址空間中運(yùn)行。假如一個(gè)應(yīng)用程序試圖訪問其地址空間之外的數(shù)據(jù),內(nèi)存治理單元將通知操作系統(tǒng),操作系統(tǒng)可能會(huì)采取保護(hù)措施,例如終止出錯(cuò)進(jìn)程。然而,這樣的操作系統(tǒng)需要將大多數(shù)或所有驅(qū)動(dòng)程序、文件系統(tǒng)和其它系統(tǒng)服務(wù)綁定到內(nèi)核中。因此,任何組件中的一個(gè)錯(cuò)誤都可能帶來災(zāi)難性的內(nèi)核故障。
第三種方法是采用微內(nèi)核架構(gòu)來提供更精確的故障隔離,像QNXNeutrino這樣的操作系統(tǒng)都基于微內(nèi)核架構(gòu)。微內(nèi)核有兩個(gè)明確的特征:
在操作系統(tǒng)內(nèi)核中只實(shí)現(xiàn)了一個(gè)包含了基本OS服務(wù)的小內(nèi)核。包括驅(qū)動(dòng)程序、文件系統(tǒng)、協(xié)議棧和用戶應(yīng)用程序在內(nèi)的所有其它的組件在內(nèi)核外部分離的、保護(hù)內(nèi)存的進(jìn)程中運(yùn)行。有問題的系統(tǒng)服務(wù)不再作為孤立的故障點(diǎn),而是在它破壞其它服務(wù)或操作系統(tǒng)內(nèi)核之前被終止并重啟。
所有的組件能夠通過消息傳遞進(jìn)行通信,一個(gè)定義良好的通信機(jī)制保障了程序在保持彼此安全隔離的前提下進(jìn)行數(shù)據(jù)交換。適當(dāng)實(shí)現(xiàn)的消息傳遞也可以作為一個(gè)虛擬的“軟件總線”,答應(yīng)幾乎任何的軟件組件,甚至是一個(gè)設(shè)備驅(qū)動(dòng)程序被動(dòng)態(tài)地加入或替換,對于必須提供連續(xù)服務(wù)的系統(tǒng)而言這是一項(xiàng)關(guān)鍵要求。
和傳統(tǒng)的操作系統(tǒng)架構(gòu)相比,微內(nèi)核支持嵌入式設(shè)備贏得明顯更快的平均修復(fù)時(shí)間。例如,假如一個(gè)設(shè)備驅(qū)動(dòng)程序失敗將可能出現(xiàn)以下情況:操作系統(tǒng)可以終止該驅(qū)動(dòng)程序,回收其正在使用的資源,并對其進(jìn)行重新啟動(dòng),這個(gè)過程通常這只需要幾個(gè)毫秒時(shí)間。
盡管和傳統(tǒng)的操作系統(tǒng)相比,基于消息傳遞的微內(nèi)核RTOS通常提供了更好的容錯(cuò)性和動(dòng)態(tài)升級能力,也有一些觀點(diǎn)認(rèn)為消息傳遞增加了開銷。在實(shí)際應(yīng)用中,假如實(shí)現(xiàn)正確,消息傳遞的性能可以接近底層硬件的內(nèi)存帶寬。例如,一個(gè)微內(nèi)核RTOS可以采用多段式消息和線程到線程的消息數(shù)據(jù)直接拷貝等各種技術(shù),來確保系統(tǒng)性能可以達(dá)到傳統(tǒng)的進(jìn)程間通信方法的水平。由一些組織如DedicatedSystems等進(jìn)行的獨(dú)立測試證實(shí),和傳統(tǒng)的RTOS相比,微內(nèi)核RTOS在一系列的實(shí)時(shí)指標(biāo)方面表現(xiàn)良好,在很多情況下甚至有更好的表現(xiàn)。
評論