- 相關(guān)推薦
提高實(shí)時(shí)操作系統(tǒng)的實(shí)時(shí)性能和可靠性策略
對(duì)很多嵌入式系統(tǒng)來(lái)說(shuō),一個(gè)設(shè)計(jì)良好的實(shí)時(shí)操作系統(tǒng)(RTOS)可以讓開發(fā)工程師掌握系統(tǒng)執(zhí)行任何任務(wù)或響應(yīng)任何關(guān)鍵事件的時(shí)間,滿足系統(tǒng)實(shí)時(shí)性要求。為了理解RTOS如何通過(guò)系統(tǒng)調(diào)度策略實(shí)現(xiàn)實(shí)時(shí)性要求,本文介紹了搶占式調(diào)度、可搶占的內(nèi)核、優(yōu)先級(jí)繼承和中斷處理等概念。
在設(shè)計(jì)工業(yè)控制系統(tǒng)或醫(yī)療設(shè)備時(shí),大部分工程師和系統(tǒng)設(shè)計(jì)工程師會(huì)認(rèn)為采用RTOS是必需的。然而,網(wǎng)際路由器、車載娛樂(lè)系統(tǒng)和多媒體設(shè)備等普通應(yīng)用還需要采用RTOS嗎?像Linux或Windows這樣的通用操作系統(tǒng)是否就能勝任呢?通常,這些產(chǎn)品需要采用RTOS,但是這個(gè)問(wèn)題常常直到設(shè)計(jì)階段的后期才能意識(shí)到。
RTOS對(duì)于很多嵌入式系統(tǒng)來(lái)說(shuō)不但是有益的,而且也是必要的,認(rèn)識(shí)到這一點(diǎn)很重要。例如,一個(gè)播放如MPEG格式電影的設(shè)備,如果依靠軟件來(lái)實(shí)現(xiàn)其整個(gè)內(nèi)容傳輸,可能會(huì)出現(xiàn)用戶難以接受的高丟幀率。然而,通過(guò)使用RTOS,系統(tǒng)設(shè)計(jì)工程師能夠準(zhǔn)確地控制軟件過(guò)程的執(zhí)行順序,從而保證按照給定的媒體速率進(jìn)行播放。上述大部分情況適用于用戶希望對(duì)輸入做出立即響應(yīng)的系統(tǒng)。通過(guò)RTOS,開發(fā)人員能夠保證由用戶的操作總能得到及時(shí)的響應(yīng),除非一個(gè)更重要的操作(如一項(xiàng)有助于保障用戶安全的操作)必須首先執(zhí)行。
總之,一個(gè)好的RTOS支持開發(fā)人員控制系統(tǒng)執(zhí)行任何任務(wù)或?qū)θ魏沃匾录龀龇磻?yīng)的時(shí)間,并且能夠以一種可以預(yù)測(cè)并且完全一致的形式滿足任務(wù)執(zhí)行的最終期限要求。但是,如果RTOS崩潰,這些最終期限就不能被滿足。因此,RTOS必須提供高度的可靠性。特別是它必須提供在不需要重啟的情況下,從軟件故障中快速并智能恢復(fù)的機(jī)制。
搶占式調(diào)度
在像Linux這樣的通用操作系統(tǒng)中,在對(duì)線程和進(jìn)程的CPU占用上采用了“公平”調(diào)度策略。這樣的策略能夠提供良好的整體表現(xiàn),但是不能保證高優(yōu)先級(jí)、對(duì)時(shí)間要求嚴(yán)格的線程將優(yōu)先于低優(yōu)先級(jí)的線程執(zhí)行。事實(shí)上,操作系統(tǒng)有時(shí)甚至?xí)袛喔邇?yōu)先級(jí)的線程來(lái)為低優(yōu)先級(jí)線程提供CPU時(shí)間。其結(jié)果可能造成對(duì)時(shí)間要求嚴(yán)格的線程很容易地錯(cuò)過(guò)它們的最終期限,甚至在一個(gè)高速的高端處理器上運(yùn)行時(shí)也會(huì)出現(xiàn)這種情況。
而在RTOS中,線程按照其優(yōu)先級(jí)順序執(zhí)行。如果一個(gè)高優(yōu)先級(jí)的線程準(zhǔn)備運(yùn)行時(shí),它將在一個(gè)短的、有限時(shí)間間隔內(nèi)從任何可能正在運(yùn)行的低優(yōu)先級(jí)進(jìn)程接管CPU。另外,高優(yōu)先級(jí)的線程能夠不被中斷地運(yùn)行,直到它已經(jīng)完成了需要做的事情-當(dāng)然是在不被更高優(yōu)先級(jí)進(jìn)程搶占的前提下。這種方法就是搶占式調(diào)度,保證了高優(yōu)先級(jí)線程始終滿足其最終期限,而不管有多少其它線程正在競(jìng)爭(zhēng)CPU時(shí)間。
通過(guò)合理地控制線程優(yōu)先級(jí),開發(fā)者能顯著地提高很多對(duì)用戶非常重要的應(yīng)用響應(yīng)速度。然而,控制優(yōu)先級(jí)可能是一把雙刃劍,當(dāng)使用不當(dāng)時(shí)它可能會(huì)潛在地導(dǎo)致低優(yōu)先級(jí)的進(jìn)程不能得到CPU時(shí)間。保證高優(yōu)先級(jí)的進(jìn)程和線程的同時(shí)確保不會(huì)使其它進(jìn)程處于“饑餓”狀態(tài)的關(guān)鍵是要對(duì)它們的執(zhí)行進(jìn)行限制,通過(guò)對(duì)執(zhí)行進(jìn)行調(diào)整或在響應(yīng)加載的過(guò)程中進(jìn)行控制,開發(fā)人員能夠限制這些活動(dòng)消耗的CPU時(shí)間比例,并支持低優(yōu)先級(jí)進(jìn)程獲得對(duì)CPU的共享。
優(yōu)先級(jí)控制能夠使很多應(yīng)用受益,包括像前面提到的媒體播放器(MP3、WAV、MPEG2等格式)。媒體播放器需要實(shí)現(xiàn)正常播放所要求的速率(例如44kHz的音頻、30fps的視頻)。在這種限制之下,一個(gè)讀線程和一個(gè)顯示線程可以被設(shè)計(jì)成依靠一個(gè)可編程的定時(shí)器來(lái)喚醒,緩沖或顯示一幀后進(jìn)入睡眠狀態(tài),直到下一個(gè)定時(shí)觸發(fā)。這提供了一種調(diào)整機(jī)制,支持高于正常用戶活動(dòng)而又低于關(guān)鍵系統(tǒng)功能的優(yōu)先級(jí)設(shè)置。換句話說(shuō),如果沒(méi)有更重要的任務(wù)準(zhǔn)備運(yùn)行,媒體播放將始終以給定的媒體速率執(zhí)行。
最壞情形
搶占式調(diào)度僅在高優(yōu)先級(jí)的線程在一個(gè)短的、有限時(shí)間段內(nèi)搶占低優(yōu)先級(jí)線程的情況下有效。否則,系統(tǒng)將不可能預(yù)測(cè)要花費(fèi)多長(zhǎng)時(shí)間來(lái)執(zhí)行一個(gè)給定的操作。因此,任何銷售進(jìn)程模式的RTOS的供應(yīng)商都必須提供針對(duì)下面兩種時(shí)間間隔提供最壞情形:線程切換時(shí)間,即當(dāng)兩個(gè)線程處于同一進(jìn)程的情況下,從執(zhí)行一個(gè)線程的最后一條指令到執(zhí)行下一個(gè)被調(diào)度線程的第一條指令所經(jīng)過(guò)的時(shí)間;前后關(guān)系切換(context switch)時(shí)間,其定義同上,但僅針對(duì)兩個(gè)線程處于不同進(jìn)程的情況。
可以將線程看作是最小的“執(zhí)行單元”,而將進(jìn)程看作是一個(gè)或多個(gè)線程的“容器”,進(jìn)程定義了線程將要在其中執(zhí)行的地址空間。顯然,最壞情形的前后關(guān)系切換時(shí)間將比最壞情形的線程切換時(shí)間要慢,盡管在一個(gè)好的RTOS設(shè)計(jì)中差別可能是微不足道的。
將所有的線程放在幾個(gè)大的進(jìn)程中將是錯(cuò)誤的,因?yàn)榫程提供的切換速度更快。雖然線程能實(shí)現(xiàn)并行處理優(yōu)勢(shì)因而適合于某些設(shè)計(jì),但將一個(gè)應(yīng)用分成多個(gè)內(nèi)存保護(hù)的進(jìn)程使得代碼更容易調(diào)試,提供了更好的錯(cuò)誤隔離和恢復(fù)能力,并允許系統(tǒng)進(jìn)行新功能的動(dòng)態(tài)升級(jí)。
可搶占的內(nèi)核
在大部分通用操作系統(tǒng)中,操作系統(tǒng)的內(nèi)核是不可搶占的。其結(jié)果是,一個(gè)高優(yōu)先級(jí)的進(jìn)程不可能搶占一個(gè)內(nèi)核調(diào)用,而是必須等待整個(gè)調(diào)用完成,即使這個(gè)調(diào)用是由系統(tǒng)中的低優(yōu)先級(jí)進(jìn)程發(fā)起的。另外,當(dāng)經(jīng)常在內(nèi)核調(diào)用中執(zhí)行的驅(qū)動(dòng)程序或其它系統(tǒng)服務(wù)代表一個(gè)客戶線程執(zhí)行的時(shí)候,所有的優(yōu)先級(jí)信息常常會(huì)丟失,這導(dǎo)致了不可預(yù)測(cè)的延遲并阻止了關(guān)鍵活動(dòng)的準(zhǔn)時(shí)完成。
而在RTOS中,內(nèi)核操作是可搶占的。盡管仍然會(huì)存在一些時(shí)間窗口,在這些時(shí)間窗口中可能沒(méi)有搶占,但是這些時(shí)間間隔應(yīng)該是相當(dāng)短暫的,通常在幾百納秒。另外,必須有一個(gè)關(guān)于搶占被推遲或中斷被禁止的時(shí)間上限,這樣開發(fā)者可以確定最壞情形下的等待時(shí)間。
為了實(shí)現(xiàn)這個(gè)目標(biāo),操作系統(tǒng)內(nèi)核必須盡可能簡(jiǎn)潔,只有具有較短執(zhí)行路徑的服務(wù)才被包含在內(nèi)核中,任何需要大量工作(如進(jìn)程加載)的操作必須被安排到外部進(jìn)程或線程。這種方法有助于通過(guò)內(nèi)核確保最長(zhǎng)的不可搶占代碼路徑具有一個(gè)時(shí)間上限。
優(yōu)先級(jí)繼承
然而,為一個(gè)進(jìn)程設(shè)定一個(gè)高優(yōu)先級(jí)并不總能保證該進(jìn)程能夠搶占低優(yōu)先級(jí)的進(jìn)程。有時(shí)候,系統(tǒng)會(huì)出現(xiàn)一種稱為優(yōu)先級(jí)倒置(priority inversion)的狀態(tài),在這種狀態(tài)下,低優(yōu)先級(jí)的進(jìn)程將在“無(wú)意中”阻止較高優(yōu)先級(jí)進(jìn)程占用CPU。優(yōu)先級(jí)倒置可能會(huì)表現(xiàn)為幾種形式,為了防止發(fā)生這種情況,RTOS必須提供一種稱為優(yōu)先級(jí)繼承的功能。