馮 英
摘要為了理解RTOS如何通過系統(tǒng)調(diào)度策略實(shí)現(xiàn)實(shí)時性要求,本文介紹了搶占式調(diào)度、可搶占的內(nèi)核等概念。
關(guān)鍵詞操作系統(tǒng)實(shí)時性能策略
中圖分類號:TP3文獻(xiàn)標(biāo)識碼:A
一個好的RTOS支持開發(fā)人員控制系統(tǒng)執(zhí)行任何任務(wù)或?qū)θ魏沃匾录龀龇磻?yīng)的時間,并且能夠以一種可以預(yù)測并且完全一致的形式滿足任務(wù)執(zhí)行的最終期限要求。但是,如果RTOS崩潰,這些最終期限就不能被滿足。因此,RTOS必須提供高度的可靠性。特別是它必須提供在不需要重啟的情況下,從軟件故障中快速并智能恢復(fù)的機(jī)制。
1 搶占式調(diào)度
在像Linux這樣的通用操作系統(tǒng)中,在對線程和進(jìn)程的CPU占用上采用了“公平”調(diào)度策略。這樣的策略能夠提供良好的整體表現(xiàn),但是不能保證高優(yōu)先級、對時間要求嚴(yán)格的線程將優(yōu)先于低優(yōu)先級的線程執(zhí)行。事實(shí)上,操作系統(tǒng)有時甚至?xí)袛喔邇?yōu)先級的線程來為低優(yōu)先級線程提供CPU時間。其結(jié)果可能造成對時間要求嚴(yán)格的線程很容易地錯過它們的最終期限,甚至在一個高速的高端處理器上運(yùn)行時也會出現(xiàn)這種情況。優(yōu)先級控制能夠使很多應(yīng)用受益,包括像前面提到的媒體播放器(MP3、WAV、MPEG2等格式)。媒體播放器需要實(shí)現(xiàn)正常播放所要求的速率(例如44kHz的音頻、30fps的視頻)。在這種限制之下,一個讀線程和一個顯示線程可以被設(shè)計(jì)成依靠一個可編程的定時器來喚醒,緩沖或顯示一幀后進(jìn)入睡眠狀態(tài),直到下一個定時觸發(fā)。這提供了一種調(diào)整機(jī)制,支持高于正常用戶活動而又低于關(guān)鍵系統(tǒng)功能的優(yōu)先級設(shè)置。換句話說,如果沒有更重要的任務(wù)準(zhǔn)備運(yùn)行,媒體播放將始終以給定的媒體速率執(zhí)行。
2 最壞情形
搶占式調(diào)度僅在高優(yōu)先級的線程在一個短的、有限時間段內(nèi)搶占低優(yōu)先級線程的情況下有效。否則,系統(tǒng)將不可能預(yù)測要花費(fèi)多長時間來執(zhí)行一個給定的操作。因此,任何銷售進(jìn)程模式的RTOS的供應(yīng)商都必須提供針對下面兩種時間間隔提供最壞情形:線程切換時間,即當(dāng)兩個線程處于同一進(jìn)程的情況下,從執(zhí)行一個線程的最后一條指令到執(zhí)行下一個被調(diào)度線程的第一條指令所經(jīng)過的時間;前后關(guān)系切換(contextswitch)時間,其定義同上,但僅針對兩個線程處于不同進(jìn)程的情況。將所有的線程放在幾個大的進(jìn)程中將是錯誤的,因?yàn)榫€程提供的切換速度更快。雖然線程能實(shí)現(xiàn)并行處理優(yōu)勢因而適合于某些設(shè)計(jì),但將一個應(yīng)用分成多個內(nèi)存保護(hù)的進(jìn)程使得代碼更容易調(diào)試,提供
了更好的錯誤隔離和恢復(fù)能力,并允許系統(tǒng)進(jìn)行新功能的動態(tài)升級。
3 可搶占的內(nèi)核
在大部分通用操作系統(tǒng)中,操作系統(tǒng)的內(nèi)核是不可搶占的。其結(jié)果是,一個高優(yōu)先級的進(jìn)程不可能搶占一個內(nèi)核調(diào)用,而是必須等待整個調(diào)用完成,即使這個調(diào)用是由系統(tǒng)中的低優(yōu)先級進(jìn)程發(fā)起的。另外,當(dāng)經(jīng)常在內(nèi)核調(diào)用中執(zhí)行的驅(qū)動程序或其它系統(tǒng)服務(wù)代表一個客戶線程執(zhí)行的時候,所有的優(yōu)先級信息常常會丟失,這導(dǎo)致了不可預(yù)測的延遲并阻止了關(guān)鍵活動的準(zhǔn)時完成。為了實(shí)現(xiàn)這個目標(biāo),操作系統(tǒng)內(nèi)核必須盡可能簡潔,只有具有較短執(zhí)行路徑的服務(wù)才被包含在內(nèi)核中,任何需要大量工作(如進(jìn)程加載)的操作必須被安排到外部進(jìn)程或線程。這種方法有助于通過內(nèi)核確保最長的不可搶占代碼路徑具有一個時間上限。
4 如何提高可靠性
我們已經(jīng)明白怎樣使RTOS具有可以預(yù)測性,但是如何實(shí)現(xiàn)其可靠性呢?答案在很大程度上取決于RTOS的架構(gòu)。采用微內(nèi)核(mricokernel)架構(gòu)來提供更精確的故障隔離,像QNXNeutrino這樣的操作系統(tǒng)都基于微內(nèi)核架構(gòu)。微內(nèi)核有兩個明確的特征:(1)在操作系統(tǒng)內(nèi)核中只實(shí)現(xiàn)了一個包含了基本OS服務(wù)的小內(nèi)核(如信號量、定時器、任務(wù)調(diào)度等)。包括驅(qū)動程序、文件系統(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)核之前被終止并重啟。(2)所有的組件能夠通過消息傳遞進(jìn)行通信,一個定義良好的通信機(jī)制保障了程序在保持彼此安全隔離的前提下進(jìn)行數(shù)據(jù)交換。適當(dāng)實(shí)現(xiàn)的消息傳遞也可以作為一個虛擬的“軟件總線”,允許幾乎任何的軟件組件,甚至是一個設(shè)備驅(qū)動程序被動態(tài)地加入或替換,對于必須提供連續(xù)服務(wù)的系統(tǒng)而言這是一項(xiàng)關(guān)鍵要求。
和傳統(tǒng)的操作系統(tǒng)架構(gòu)相比,微內(nèi)核支持嵌入式設(shè)備贏得明顯更快的平均修復(fù)時間(MTTR)。例如,如果一個設(shè)備驅(qū)動程序失敗將可能出現(xiàn)以下情況:操作系統(tǒng)可以終止該驅(qū)動程序,回收其正在使用的資源,并對其進(jìn)行重新啟動,這個過程通常這只需要幾個毫秒時間。盡管和傳統(tǒng)的操作系統(tǒng)相比,基于消息傳遞的微內(nèi)核RTOS通常提供了更好的容錯性和動態(tài)升級能力,也有一些觀點(diǎn)認(rèn)為消息傳遞增加了開銷。在實(shí)際應(yīng)用中,如果實(shí)現(xiàn)正確,消息傳遞的性能可以接近底層硬件的內(nèi)存帶寬。例如,一個微內(nèi)核RTOS可以采用多段式(multipart)消息和線程到線程的消息數(shù)據(jù)直接拷貝等各種技術(shù),來確保系統(tǒng)性能可以達(dá)到傳統(tǒng)的進(jìn)程間通信(IPC)方法的水平。由一些組織如DedicatedSystems等進(jìn)行的獨(dú)立測試證實(shí),和傳統(tǒng)的RTOS相比,微內(nèi)核RTOS在一系列的實(shí)時指標(biāo)方面表現(xiàn)良好,在很多情況下甚至有更好的表現(xiàn)。