VXWORKS內核分析
1. 實(shí)時(shí)操作系統的結構
在計算的早期開(kāi)發(fā)的操作系統的最原始的結構形式是一個(gè)統一的實(shí)體(monolithic)。在這樣的系統中,提供的不同功能的模塊,如處理器管理、內存管理、輸入輸出等,通常是獨立的。然而他們在執行過(guò)程中并不考慮其他正在使用中的模塊,各個(gè)模塊都以相同的時(shí)間粒度運行。
由于現代實(shí)時(shí)環(huán)境需要許多不同的功能,以及在這樣的環(huán)境中存在的并發(fā)活動(dòng)所引起的異步性和非確定性,操作系統變得更加復雜。所以早期操作系統的統一結構的組織已經(jīng)被更加精確的內部結構所淘汰。層次結構的起點(diǎn)----內核
操作系統的最好的內部結構模型是一個(gè)層次性的結構,最低層是內核。這些層次可以看成為一個(gè)倒置的金字塔,每一層都建立在較低層的功能之上。 內核僅包含一個(gè)操作系統執行的最重要的低層功能。正象一個(gè)統一結構的操作系統,內核提供了在高層軟件與下層硬件之間的抽象層。然而,內核僅提供了構造操作系統其他部分所需的最小操作集。
對一個(gè)實(shí)時(shí)內核的要求
一個(gè)實(shí)時(shí)操作系統內核需滿(mǎn)足許多特定的實(shí)時(shí)環(huán)境所提出的基本要求,這些包括: 多任務(wù):由于真實(shí)世界的事件的異步性,能夠運行許多并發(fā)進(jìn)程或任務(wù)是很重要的。多任務(wù)提供了一個(gè)較好的對真實(shí)世界的匹配,因為它允許對應于許多外部事件的多線(xiàn)程執行。系統內核分配CPU給這些任務(wù)來(lái)獲得并發(fā)性。
搶占調度:真實(shí)世界的事件具有繼承的優(yōu)先級,在分配CPU的時(shí)候要注意到這些優(yōu)先級?;趦?yōu)先級的搶占調度,任務(wù)都被指定了優(yōu)先級, 在能夠執行的任務(wù)(沒(méi)有被掛起或正在等待資源)中,優(yōu)先級最高的任務(wù)被分配CPU資源。換句話(huà)說(shuō),當一個(gè)高優(yōu)先級的任務(wù)變?yōu)榭蓤绦袘B(tài),它會(huì )立即搶占當前正在運行的較低優(yōu)先級的任務(wù)。
快速靈活的任務(wù)間的通信與同步:在一個(gè)實(shí)時(shí)系統中,可能有許多任務(wù)作為一個(gè)應用的一部分執行。系統必須提供這些任務(wù)間的快速且功能強大的通信機制。內核也要提供為了有效地共享不可搶占的資源或臨界區所需的同步機制。
方便的任務(wù)與中斷之間的通信:盡管真實(shí)世界的事件通常作為中斷方式到來(lái),但為了提供有效的排隊、優(yōu)先化和減少中斷延時(shí),我們通常希望在任務(wù)級處理相應的工作。所以需要雜任務(wù)級和中斷級之間存在通信。
性能邊界:一個(gè)實(shí)時(shí)內核必須提供最壞情況的性能優(yōu)化,而非針對吞吐量的性能優(yōu)化。我們更期望一個(gè)系統能夠始終以50微妙執行一個(gè)函數,而不期望系統平均以10微妙執行該函數,但偶爾會(huì )以75微妙執行它。
特殊考慮:由于對實(shí)時(shí)內核的要求的增加,必須考慮對內核支持不斷增加的復雜功能的要求。這包括多進(jìn)程處理,Ada和對更新的、功能更強的處理器結構如RISC的支持。
擁有其它名字的內核
許多商用化的內核支持的功能遠強于上面所列的要求。在這方面,他們不是真正的內核,而更象一個(gè)小的統一結構的操作系統。因為他們包含簡(jiǎn)單的內存分配、時(shí)鐘管理、甚至一些輸入輸出系統調用的功能。
這種分類(lèi)不僅僅是在語(yǔ)義上的爭論,在這篇文章的后面章節將說(shuō)明限制內核功能和油畫(huà)這些功能的重要性。
2. VxWorks內核:Wind
VxWorks操作系統是一種功能最全的現在可以獲得的獨立于處理器的實(shí)時(shí)系統。然而,VxWorks是帶有一個(gè)相當小的真正微內核的層次結構。內核僅提供多任務(wù)環(huán)境、進(jìn)程間通信和同步功能。這些功能模塊足夠支持VxWorks在較高層次所提供的豐富的性能的要求。 通常內核操作對于用戶(hù)是不可見(jiàn)的。應用程序為了實(shí)現需要內核參與的任務(wù)管理和同步使用一些系統調用,但這些調用的處理對于調用任務(wù)是不可見(jiàn)的。應用程序僅鏈接恰當的VxWorks例程(通常使用VxWorks的動(dòng)態(tài)鏈接功能),就象調用子程序一樣發(fā)出系統調用。這種接口不象有些系統需要一個(gè)笨拙的跳轉表接口,用戶(hù)需要通過(guò)一個(gè)整數來(lái)指定一個(gè)內核功能調用。
多任務(wù)
內核的基本功能是提供一個(gè)多任務(wù)環(huán)境。多任務(wù)使得許多程序在表面上表現為并發(fā)執行,而事實(shí)上內核是根據基本的調度算法使他們分段執行。每個(gè)明顯獨立的程序被成為一個(gè)任務(wù)。每個(gè)任務(wù)擁有自己的上下文,其中包含在內核調度使該任務(wù)執行的時(shí)候它所看到的CPU環(huán)境和系統資源。
任務(wù)狀態(tài)
內核維護系統中的每個(gè)任務(wù)的當前狀態(tài)。狀態(tài)遷移發(fā)生在應用程序調用內核功能服務(wù)的時(shí)候。下面定義了wind內核狀態(tài):
就緒態(tài)----一個(gè)任務(wù)當前除了CPU不等待任何資源
阻塞態(tài)----一個(gè)任務(wù)由于某些資源不可獲得而被阻塞
延遲態(tài)----一個(gè)任務(wù)睡眠一段時(shí)間
掛起態(tài)----主要用于調試的一個(gè)輔助狀態(tài),掛起禁止任務(wù)的執行
任務(wù)被創(chuàng )建以后進(jìn)入掛起態(tài),需要通過(guò)特定的操作使被創(chuàng )建的任務(wù)進(jìn)入就緒態(tài),這一操作執行速度很快,使應用程序能夠提前創(chuàng )建任務(wù),并以一種快捷的方式激活該任務(wù)。
調度控制
多任務(wù)需要一個(gè)調度算法分配CPU給就緒的任務(wù)。在VxWorks中默認的調度算法是基于優(yōu)先級的搶占調度,但應用程序也可以選擇使用時(shí)間片輪轉調度。
基于優(yōu)先級搶占調度:基于優(yōu)先級的搶占調度,每個(gè)任務(wù)被指定一個(gè)優(yōu)先級,內核分配CPU給處于就緒態(tài)的優(yōu)先級最高的任務(wù)。調度采用搶占的方式,是因為當一個(gè)優(yōu)先級高于當前任務(wù)的任務(wù)變?yōu)榫途w態(tài)時(shí),內核將立即保存當前任務(wù)的上文,并切換到高優(yōu)先級任務(wù)的上文。VxWorks有從0到255共256個(gè)優(yōu)先級。在創(chuàng )建的時(shí)候任務(wù)被指定一個(gè)優(yōu)先級,在任務(wù)運行的過(guò)程中可以動(dòng)態(tài)地修改優(yōu)先級以便跟蹤真實(shí)世界的事件優(yōu)先級。外部
中斷被指定優(yōu)先于任何任務(wù)的優(yōu)先級,這樣能夠在任何時(shí)候搶占一個(gè)任務(wù)。
時(shí)間片輪轉:基于優(yōu)先級搶占調度可以擴充時(shí)間片輪轉調度。時(shí)間片輪轉調度允許在相同優(yōu)先級的處于就緒態(tài)的任務(wù)公平地共享CPU。沒(méi)有時(shí)間片輪轉調度,當有多個(gè)任務(wù)在同一優(yōu)先級共享處理器時(shí),一個(gè)任務(wù)可能獨占CPU,不會(huì )被阻塞直到被一個(gè)更高優(yōu)先級的任務(wù)搶占,而不給同一優(yōu)先級的其他任務(wù)運行的機會(huì )。如果時(shí)間片輪轉被使能,執行任務(wù)的時(shí)間計數器在每個(gè)時(shí)鐘滴答遞增。當指定的時(shí)間片耗盡,計數器會(huì )被清零,該任
務(wù)被放在同一優(yōu)先級任務(wù)隊列的隊尾。加入特定優(yōu)先級組的新任務(wù)被放在該組任務(wù)的隊尾,并將運行計數器初始化為零。
基本的任務(wù)函數
用于狀態(tài)控制的基本任務(wù)函數包括一個(gè)任務(wù)的創(chuàng )建、刪除、掛起和喚醒。一個(gè)任務(wù)也可以使自己睡眠一個(gè)特定的時(shí)間間隔不去運行。許多其他任務(wù)例程提供由任務(wù)上下文獲得的狀態(tài)信息。這些例程包括訪(fǎng)問(wèn)一個(gè)任務(wù)當前處理器寄存器控制。
任務(wù)刪除問(wèn)題
wind內核提供防止任務(wù)被意外刪除的機制。通常,一個(gè)執行在臨界區或訪(fǎng)問(wèn)臨界資源的任務(wù)要被特別保護。我們設想下面的情況:一個(gè)任務(wù)獲得一些數據結構的互斥訪(fǎng)問(wèn)權,當它正在臨界區內執行時(shí)被另一個(gè)任務(wù)刪除。由于任務(wù)無(wú)法完成對臨界區的操作,該數據結構可能還處于被破壞或不一致的狀態(tài)。而且,假想任務(wù)沒(méi)有機會(huì )釋放該資源,那麼現在其他任何任務(wù)現在就不能獲得該資源,資源被凍結了。
任何要刪除或終止一個(gè)設定了刪除保護的任務(wù)的任務(wù)將被阻塞。當被保護的任務(wù)完成臨界區操作以后,它將取消刪除保護以使自己可以被刪除,從而解阻塞刪除任務(wù)
。
正如上面所展示的,任務(wù)刪除保護通常伴有互斥操作。
這樣,為了方便性和效率,互斥信號量包含了刪除保護選項。(參見(jiàn)"互斥信號量")
任務(wù)間通信
為了提供完整的多任務(wù)系統的功能,wind內核提供了一套豐富的任務(wù)間通信與同步的機制。這些通信功能使一個(gè)應用中各個(gè)獨立的任務(wù)協(xié)調他們的活動(dòng)。
共享地址空間
wind內核的任務(wù)間通信機制的基礎是所有任務(wù)所在的共享地址空間。通過(guò)共享地址空間,任務(wù)能夠使用共享數據結構的指針自由地通信。管道不需要映射一塊內存區到兩個(gè)互相通信任務(wù)的尋址空間。
不幸的是,共享地址空間具有上述優(yōu)點(diǎn)的同時(shí),帶來(lái)了未被保護內存的重入訪(fǎng)問(wèn)的危險。UNIX操作系統通過(guò)隔離進(jìn)程提供這樣的保護,但同時(shí)帶來(lái)了對于實(shí)時(shí)操作系統來(lái)說(shuō)巨大的性能損失。
互斥操作
當一個(gè)共享地址空間簡(jiǎn)化了數據交換,通過(guò)互斥訪(fǎng)問(wèn)避免資源競爭就變?yōu)楸匾牧?。用?lái)獲得一個(gè)資源的互斥訪(fǎng)問(wèn)的許多機制僅在這些互斥所作用的范圍上存在差別。實(shí)現互斥的方法包括禁止中斷、禁止任務(wù)搶占和通過(guò)信號量進(jìn)行資源鎖定。
中斷禁止:最強的互斥方法是屏蔽中斷。這樣的鎖定保證了對CPU的互斥訪(fǎng)問(wèn)。這種方法當然能夠解決互斥的問(wèn)題,但它對于實(shí)時(shí)是不恰當的,因為它在鎖定期間阻止系統響應外部事件。長(cháng)的中斷延時(shí)對于要求有確定的響應時(shí)間的應用來(lái)說(shuō)是不可接受的。
搶占禁止:禁止搶占提供了強制性較弱的互斥方式。 當前任務(wù)運行的過(guò)程中不允許其他任務(wù)搶占,而中斷服務(wù)程序可以執行。這也可能引起較差的實(shí)時(shí)響應,就象被禁止中斷一樣,被阻塞的任務(wù)會(huì )有相當長(cháng)時(shí)間的搶占延時(shí),就緒態(tài)的高優(yōu)先級的任務(wù)可能會(huì )在能夠執行前被強制等待一段不可接受的時(shí)間。為避免這種情況,在可能的情況下盡量使用信號量實(shí)現互斥。
互斥信號量:信號量是用于鎖定共享資源訪(fǎng)問(wèn)的基本方式。不象禁止中斷或搶占,信號量限制了互斥操作僅作用于相關(guān)的資源。一個(gè)信號量被創(chuàng )建來(lái)保護資源。VxWorks的信號量遵循Dijkstra的P()和V()操作模式。
當一個(gè)任務(wù)請求信號量,P(), 根據在發(fā)出調用時(shí)信號量的置位或清零的狀態(tài), 會(huì )發(fā)生兩種情況。如果信號量處于置位態(tài), 信號量會(huì )被清零,并且任務(wù)立即繼續執行。如果信號量處于清零態(tài),任務(wù)會(huì )被阻塞來(lái)等待信號量。
當一個(gè)任務(wù)釋放信號量,V(),會(huì )發(fā)生幾種情況。如果信號量已經(jīng)處于置位態(tài),釋放信號量不會(huì )產(chǎn)生任何影響。如果信號量處于清零態(tài)且沒(méi)有任務(wù)等待該信號量,信號量只是被簡(jiǎn)單地置位。如果信號量處于清零態(tài)且有一個(gè)或多個(gè)任務(wù)等待該信號量,最高優(yōu)先級的任務(wù)被解阻塞,信號量仍為清零態(tài)。
通過(guò)將一些資源與信號量關(guān)聯(lián),能夠實(shí)現互斥操作。當一個(gè)任務(wù)要操作資源,它必須首先獲得信號量。只要任務(wù)擁有信號量,所有其他的任務(wù)由于請求該信號量而被阻塞。當一個(gè)任務(wù)使用完該資源,它釋放信號量,允許等待該信號量的另一個(gè)任務(wù)訪(fǎng)問(wèn)該資源。
Wind內核提供了二值信號量來(lái)解決互斥操作所引起的問(wèn)題。 這些問(wèn)題包括資源擁有者的刪除保護,由資源競爭引起的優(yōu)先級逆轉。
刪除保護----互斥引起的一個(gè)問(wèn)題會(huì )涉及到任務(wù)刪除。在由信號量保護的臨界區中,需要防止執行任務(wù)被意外地刪除。刪除一個(gè)在臨界區執行的任務(wù)是災難性的。資源會(huì )被破壞,保護資源的信號量會(huì )變?yōu)椴豢色@得,從而該資源不可被訪(fǎng)問(wèn)。通常刪除保護是與互斥操作共同提供的。由于這個(gè)原因,互斥信號量通常提供選項來(lái)隱含地提供前面提到的任務(wù)刪除保護的機制。
優(yōu)先級逆轉/優(yōu)先級繼承----優(yōu)先級逆轉發(fā)生在一個(gè)高優(yōu)先級的任務(wù)被強制等待一段不確定的時(shí)間以便一個(gè)較低優(yōu)先級的任務(wù)完成執行??紤]下面的假設:
T1,T2和T3分別是高、中、低優(yōu)先級的任務(wù)。T3通過(guò)擁有信號量而獲得相關(guān)的資源。當T1搶占T3,為競爭使用該資源而請求相同的信號量的時(shí)候,它被阻塞。如果我們假設T1僅被阻塞到T3使用完該資源為止,情況并不是很糟。畢竟資源是不可被搶占的。然而,低優(yōu)先級的任務(wù)并不能避免被中優(yōu)先級的任務(wù)搶占,一個(gè)搶占的任務(wù)如T2將阻止T3完成對資源的操作。這種情況可能會(huì )持續阻塞T1等待一段不可確定的時(shí)間。這種情況成為優(yōu)先級逆轉,因為盡管系統是基于優(yōu)先級的調度,但卻使一個(gè)高優(yōu)先級的任務(wù)等待一個(gè)低優(yōu)先級的任務(wù)完成執行。
互斥信號量有一個(gè)選項允許實(shí)現優(yōu)先級繼承的算法。優(yōu)先級繼承通過(guò)在T1被阻塞期間提升T3的優(yōu)先級到T1解決了優(yōu)先級逆轉引起的問(wèn)題。這防止了T3,間接地防止T1,被T2搶占。通俗地說(shuō),優(yōu)先級繼承協(xié)議使一個(gè)擁有資源的任務(wù)以等待該資源的任務(wù)中優(yōu)先級最高的任務(wù)的優(yōu)先級執行。當執行完成,任務(wù)釋放該資源并返回到它正常的或標準的優(yōu)先級。因此,繼承優(yōu)先級的任務(wù)避免了被任何中間優(yōu)先級的任務(wù)搶占。
同步
信號量另一種通常的用法是用于任務(wù)間的同步機制。在這種情況下,信號量代表一個(gè)任務(wù)所等待的條件或事件。最初,信號量是在清零態(tài)。一個(gè)任務(wù)或中斷通過(guò)置位該信號量來(lái)指示一個(gè)事件的發(fā)生。等待該信號量的任務(wù)將被阻塞直到事件發(fā)生、該信號量被置位。一旦被解阻塞,任務(wù)就執行恰當的事件處理程序。信號量在任務(wù)同步中的應用對于將中斷服務(wù)程序從冗長(cháng)的事件處理中解放出來(lái)以縮短中斷響應時(shí)間是很有用的。
消息隊列
消息隊列提供了在任務(wù)與中斷服務(wù)程序或其他任務(wù)間交換變長(cháng)消息的一種較低層的機制。這種機制在功能上類(lèi)似于管道,但有較少的開(kāi)銷(xiāo)。
管道、套接字、遠程過(guò)程調用和更多
許多高層的VxWorks機制提供任務(wù)間通信的更高層的抽象,包括管道、TCP/IP套接字、遠程過(guò)程調用和更多。為了保持裁減內核為僅包含足夠支持高層功能的一個(gè)最小函數集的設計目標,這些特性都是基于上面描述的內核同步方式的。
3. 內核設計的優(yōu)點(diǎn)
wind內核的一個(gè)重要的設計特性是最小的搶占延時(shí)。其他的主要設計的優(yōu)點(diǎn)包括史無(wú)前例的可配置性,對不可預見(jiàn)的應用需求的可擴展性,在各種微處理器應用開(kāi)發(fā)中的移植性。
最小的搶占延時(shí)
正如前面所討論的,禁止搶占是獲得代碼臨界資源互斥操作的通常手段。這種技巧的不期望的負面影響是高的搶占延時(shí),這可以通過(guò)盡量使用信號量實(shí)現互斥和保持臨界區盡量緊湊被減小。但即使廣泛地使用信號量也不能解決所有的可能導致?lián)屨佳訒r(shí)的根源。內核本身就是一個(gè)導致?lián)屨佳訒r(shí)的根源。為了理解其原因,我們必須更好地理解內核所需的互斥操作。
內核級和任務(wù)級
在任何多任務(wù)系統中,大量的應用是發(fā)生在一個(gè)或多個(gè)任務(wù)的上下文。然而,有些CPU時(shí)間片不在任何任務(wù)的上下文。這些時(shí)間片發(fā)生在內核改變內部隊列或決定任務(wù)調度。在這些時(shí)間片中,CPU在內核級執行,而非任務(wù)級。
為了內核安全地操作它的內部的數據結構,必須有互斥操作。內核級沒(méi)有相關(guān)的任務(wù)上下文,內核不能使用信號量保護內部鏈表。內核使用工作延期作為實(shí)現互斥的方式。當有內核參與時(shí),中斷服務(wù)程序調用的函數不是被直接激活,而是被放在內核的工作
隊列中。內核完成這些請求的執行而清空內核工作隊列。
當內核正在執行已經(jīng)被請求服務(wù)時(shí)系統將不響應到達內核的函數調用??梢院?jiǎn)單地認為內核狀態(tài)類(lèi)似于禁止搶占。如前面所討論的,搶占延時(shí)在實(shí)時(shí)系統中是不期望有的,因為它增加了對于會(huì )引起應用任務(wù)重新調度的事件的響應時(shí)間.
管操作系統在內核級(此時(shí)禁止搶占)完全避免消耗時(shí)間是不可能的,但減少這些時(shí)間是很重要的。這是減少由內核執行的函數的數量的主要原因, 也是不采用統一結構的系統設計方式的原因。例如,有一種流行的實(shí)時(shí)操作系統的每個(gè)函數都是在內核級執行。這意味著(zhù)當一個(gè)低優(yōu)先級的任務(wù)在執行分配內存、獲得任務(wù)信息的函數時(shí)所有高優(yōu)先級的任務(wù)被禁止搶占。
一個(gè)最小的內核
已經(jīng)說(shuō)明了一個(gè)最小內核的優(yōu)點(diǎn)和構造高層操作系統功能的必要功能,我們使用這些操作原語(yǔ)來(lái)執行一個(gè)傳統的內核級功能,而在VxWorks中作為任務(wù)級功能執行,內存管理。 在這個(gè)例子中,考慮用戶(hù)可調用的子例程malloc, 用于分配所請求大小的內存區并返回一個(gè)指向該內存區的指針。假定空閑內存區是通過(guò)搜索一個(gè)空閑內存塊的隊列找到的,一個(gè)信號量必須被用來(lái)保護這個(gè)非搶占多用戶(hù)資源。分配內存的操作如下:
獲得互斥信號量
搜索空閑內存塊鏈表
釋放互斥信號量
值得注意的是搜索一個(gè)足夠大的空閑內存塊的可能的冗長(cháng)的時(shí)間是發(fā)生在調用任務(wù)的上下文中。這是可以被高優(yōu)先級的任務(wù)搶占的(除了信號量調用的這段執行時(shí)間)。
在一個(gè)標準的統一結構的實(shí)時(shí)內核中,內存分配例程操作如下:
進(jìn)入內核
搜索空閑內存塊鏈表
退出內核
整個(gè)內存分配發(fā)生在內核級,任務(wù)搶占被禁止如果高優(yōu)先級的任務(wù)在此時(shí)變?yōu)榫途w態(tài),它必須等待直到內核為低優(yōu)先級的任務(wù)完成內存分配。有些操作系統甚至在這段市時(shí)間禁止中斷。
任務(wù)級操作系統服務(wù)
Wind River System的實(shí)時(shí)操作系統,VxWorks,顯示了這樣設計的一個(gè)最小內核是能夠滿(mǎn)足需求的。VxWorks是現在能夠獲得的獨立于任何處理器的、擁有相當小內核的、功能完全的層次結構的實(shí)時(shí)操作系統。
VxWorks在內核之上提供了大量的功能。它包括內存管理,一個(gè)完整的BSD4.3網(wǎng)絡(luò )包,TCP/IP,網(wǎng)絡(luò )文件系統(NFS),遠程過(guò)程調用(RPC),UNIX兼容的鏈接加載模塊,C語(yǔ)言的解釋界面,各種類(lèi)型的定時(shí)器,性能監測組件,調試工具,額外的通信工具如管道、信號和套接字,I/O和文件系統,和許多功能例程。這些都不是運行在內核級,所以不會(huì )禁止中斷或任務(wù)搶占。
可配置性
實(shí)時(shí)應用有多種內核需求。沒(méi)有哪個(gè)內核有一個(gè)用來(lái)滿(mǎn)足每種需求的很好的設計折衷。然而,一個(gè)內核可以通過(guò)配置來(lái)調整特定的性能特性,裁減實(shí)時(shí)系統來(lái)最好地適應一個(gè)應用的要求。不可預見(jiàn)的內核配置性以用戶(hù)可選擇的內核排隊算法的形式提供給應用。
排隊策略
VxWorks中的排隊庫是獨立于使用他們的內核隊列功能而執行的,這樣提供了將來(lái)增加新的排隊方式的靈活性。
在VxWorks中有各種內核隊列。就緒隊列是一個(gè)按優(yōu)先級索引的所有等待調度的任務(wù)隊列。滴答隊列用于定時(shí)功能。信號量是一個(gè)等待信號量的被阻塞任務(wù)的鏈表?;顒?dòng)隊列是一個(gè)系統中所有任務(wù)的一個(gè)先進(jìn)先出(FIFO)的鏈表。這些隊列中的每個(gè)隊列都需要一個(gè)不同的排隊算法。這些算法不是被內嵌在內核中,而是被抽取到一個(gè)自治的、可轉換的排隊庫中。這種靈活的組織形式是滿(mǎn)足特殊的配置需求的基礎。
可擴展性
支持不可預見(jiàn)的內核擴展的能力與以有功能的可配置性是同樣重要的。簡(jiǎn)單的內核接口和互斥方法使內核級功能擴展相當容易; 在某些情況下,應用可以?xún)H利用內核鉤子函數來(lái)實(shí)現特定的擴展。
內部鉤子函數
為了不修改內核而能夠向系統增加額外的任務(wù)相關(guān)的功能,VxWorks提供了任務(wù)創(chuàng )建、切換和刪除的鉤子函數。這些允許在任務(wù)被創(chuàng )建、 上下文切換和任務(wù)被刪除的時(shí)候額外的例程被調用執行。這些鉤子函數可以利用任務(wù)上下文中的空閑區創(chuàng )建wind內核的任務(wù)特性。
未來(lái)考慮
有許多系統函數現在變得越來(lái)越重要,而且會(huì )影響到內核設計時(shí)的搶占延時(shí)。盡管涉及這些問(wèn)題一個(gè)完整的討論超出了本文的范圍,但值得簡(jiǎn)單地提一下。
RISC/CISC
設計一個(gè)獨立于CPU的操作系統一直是一個(gè)挑戰。隨著(zhù)新的RSIC(精簡(jiǎn)指令集)處理器變得很流行,這些難度也加大了。為了在RISC環(huán)境下有效地執行,內核和操作系統需要有執行不同策略的靈活性。
例如,考慮在任務(wù)切換時(shí)內核執行的例程。在CISC(復雜指令集,如680x0或80x86)CPU,內核為每個(gè)任務(wù)存儲一套完整的寄存器,在運行任務(wù)的時(shí)候將這些寄存器換入換出。在一個(gè)RISC機器上,這樣是不合理的,因為涉及到太多的寄存器。所以?xún)群诵枰粋€(gè)更精密復雜的策略,如為任務(wù)緩存寄存器,允許應用指定一些寄存器給特殊的任務(wù)。
移植性
為了使wind內核在他們出現的結構上能夠運行,需要有一個(gè)可移植的內核版本。這使移植是可行的,但不是最優(yōu)化的。
多處理
支持緊耦合的多處理需求要求實(shí)時(shí)內核的內部功能包含,在理想情況下,在遠端請求內核調用,如從一個(gè)處理器到另一個(gè)處理器。這就要涉及到信號量調用(為處理器間同步)和任務(wù)調用(為了控制另一個(gè)CPU上的任務(wù))。這種復雜性無(wú)疑會(huì )增加內核級功能調用的開(kāi)銷(xiāo),但是許多服務(wù)如對象標識可以在任務(wù)級執行。在多處理系統中保持一個(gè)最小內核的優(yōu)點(diǎn)是處理器之間的互鎖可以有較好的時(shí)間粒度。大的內核將在內核級消耗額外的時(shí)間,僅能獲得粗糙的互鎖時(shí)間粒度。
Ada
Ada語(yǔ)言為實(shí)時(shí)系統設計者提供了象聚會(huì )機制這樣的任務(wù)原語(yǔ)。異常處理、任務(wù)終止、終止替換和聚會(huì )都將潛在地影響內核設計。這些操作可以由前面討論的任務(wù)和同步機制構造,為了保持減小搶占延時(shí)的設計目標,許多工作能夠在任務(wù)級執行。
4. 實(shí)時(shí)內核的重要尺度
許多性能特性被用來(lái)比較以有的實(shí)時(shí)內核,這些包括:
快速的任務(wù)上下文切換----由于實(shí)時(shí)系統的多任務(wù)的特性,系統能夠快速地從一個(gè)任務(wù)切換到另一個(gè)任務(wù)是很重要的。在分時(shí)系統中,如UNIX,上下文切換是在ms級。Wind內核執行原始上下文切換只用17us。
最小的同步開(kāi)銷(xiāo)----因為同步是實(shí)現資源互斥訪(fǎng)問(wèn)的基本方法,這些操作所引起的開(kāi)銷(xiāo)最小化是很重要的。在VxWorks中,請求和釋放二值信號量?jì)H用8us。
最小的中斷延時(shí)----因為外部世界來(lái)的事件通常以中斷的形式到來(lái),操作系統快速的處理這些中斷是很重要的。內核在操作一些臨界數據結構的時(shí)候必須禁止中斷。為了減小中斷延時(shí),必須使這些時(shí)間最小化。Wind內核的中斷延時(shí)小于10us。
搶占延時(shí)對性能指標的影響
當許多的實(shí)時(shí)解決方案被提交給應用工程師時(shí), 性能指標對于評估供應商的產(chǎn)品變得越來(lái)越重要。不象上下文切換和中斷延時(shí),搶占延時(shí)很難測量。所以它很少在說(shuō)明中被提及。但是考慮到當內核通常禁止上下文切換會(huì )長(cháng)達數百微妙,而聲稱(chēng)一個(gè)50us的固定長(cháng)度(與任務(wù)個(gè)數無(wú)關(guān))的上下文切換時(shí)間是毫無(wú)意義的。除了很難測量外,搶占延時(shí)可能會(huì )削弱許多性能指標的有效性。
Wind內核通過(guò)減小內核的大小來(lái)盡量減小搶占延時(shí)。 包含繁多功能的內核必將引起長(cháng)的搶占延時(shí)。
5. 結論
為了滿(mǎn)足對實(shí)時(shí)內核日益增加的要求,如新的調度算法、多處理、Ada和RISC結構,wind內核始終以靈活性和可配置性為設計目標。它所提供的優(yōu)秀的運行性能將成為實(shí)時(shí)應用需求新標準。
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)
評論