?? 00000015.htm
字號:
務完成臨界區操作以后,它將取消刪除保護以使自己可以被刪除,從而解阻塞刪除任務 <br />。 <br /> 正如上面所展示的,任務刪除保護通常伴有互斥操作。 <br /> 這樣,為了方便性和效率,互斥信號量包含了刪除保護選項。(參見"互斥信號量" <br />) <br />任務間通信 <br /> 為了提供完整的多任務系統的功能,wind內核提供了一套豐富的任務間通信與同步 <br />的機制。這些通信功能使一個應用中各個獨立的任務協調他們的活動。 <br />共享地址空間 <br /> wind內核的任務間通信機制的基礎是所有任務所在的共享地址空間。通過共享地址 <br />空間,任務能夠使用共享數據結構的指針自由地通信。管道不需要映射一塊內存區到兩 <br />個互相通信任務的尋址空間。 <br /> 不幸的是,共享地址空間具有上述優點的同時,帶來了未被保護內存的重入訪 <br />問的危險。UNIX操作系統通過隔離進程提供這樣的保護,但同時帶來了對于實時操作系 <br />統來說巨大的性能損失。 <br />互斥操作 <br /> 當一個共享地址空間簡化了數據交換,通過互斥訪問避免資源競爭就變為必要的了 <br />。用來獲得一個資源的互斥訪問的許多機制僅在這些互斥所作用的范圍上存在差別。實 <br />現互斥的方法包括禁止中斷、禁止任務搶占和通過信號量進行資源鎖定。 <br /> 中斷禁止:最強的互斥方法是屏蔽中斷。這樣的鎖定保證了對CPU的互斥訪問。這種 <br />方法當然能夠解決互斥的問題,但它對于實時是不恰當的,因為它在鎖定期間阻止系統 <br />響應外部事件。長的中斷延時對于要求有確定的響應時間的應用來說是不可接受的。 <br /> 搶占禁止:禁止搶占提供了強制性較弱的互斥方式。 當前任務運行的過程中不允許 <br />其他任務搶占,而中斷服務程序可以執行。這也可能引起較差的實時響應,就象被禁止 <br />中斷一樣,被阻塞的任務會有相當長時間的搶占延時,就緒態的高優先級的任務可能會 <br />在能夠執行前被強制等待一段不可接受的時間。為避免這種情況,在可能的情況下盡量 <br />使用信號量實現互斥。 <br /> 互斥信號量:信號量是用于鎖定共享資源訪問的基本方式。不象禁止中斷或搶占, <br />信號量限制了互斥操作僅作用于相關的資源。一個信號量被創建來保護資源。VxWorks的 <br />信號量遵循Dijkstra的P()和V()操作模式。 <br /> 當一個任務請求信號量,P(), 根據在發出調用時信號量的置位或清零的狀態, 會 <br />發生兩種情況。如果信號量處于置位態, 信號量會被清零,并且任務立即繼續執行。如 <br />果信號量處于清零態,任務會被阻塞來等待信號量。 <br /> 當一個任務釋放信號量,V(),會發生幾種情況。如果信號量已經處于置位態,釋放 <br />信號量不會產生任何影響。如果信號量處于清零態且沒有任務等待該信號量,信號量只 <br />是被簡單地置位。如果信號量處于清零態且有一個或多個任務等待該信號量,最高優先 <br />級的任務被解阻塞,信號量仍為清零態。 <br /> 通過將一些資源與信號量關聯,能夠實現互斥操作。當一個任務要操作資源,它必 <br />須首先獲得信號量。只要任務擁有信號量,所有其他的任務由于請求該信號量而被阻塞 <br />。當一個任務使用完該資源,它釋放信號量,允許等待該信號量的另一個任務訪問該資 <br />源。 <br /> Wind內核提供了二值信號量來解決互斥操作所引起的問題。 這些問題包括資源擁有 <br />者的刪除保護,由資源競爭引起的優先級逆轉。 <br /> 刪除保護----互斥引起的一個問題會涉及到任務刪除。在由信號量保護的臨界區中 <br />,需要防止執行任務被意外地刪除。刪除一個在臨界區執行的任務是災難性的。資源會 <br />被破壞,保護資源的信號量會變為不可獲得,從而該資源不可被訪問。通常刪除保護是 <br />與互斥操作共同提供的。由于這個原因,互斥信號量通常提供選項來隱含地提供前面提 <br />到的任務刪除保護的機制。 <br /> 優先級逆轉/優先級繼承----優先級逆轉發生在一個高優先級的任務被強制等待一段 <br />不確定的時間以便一個較低優先級的任務完成執行。考慮下面的假設: <br /> T1,T2和T3分別是高、中、低優先級的任務。T3通過擁有信號量而獲得相關的資源 <br />。當T1搶占T3,為競爭使用該資源而請求相同的信號量的時候,它被阻塞。如果我們假 <br />設T1僅被阻塞到T3使用完該資源為止,情況并不是很糟。畢竟資源是不可被搶占的。然 <br />而,低優先級的任務并不能避免被中優先級的任務搶占,一個搶占的任務如T2將阻止T3 <br />完成對資源的操作。這種情況可能會持續阻塞T1等待一段不可確定的時間。這種情況成 <br />為優先級逆轉,因為盡管系統是基于優先級的調度,但卻使一個高優先級的任務等待一 <br />個低優先級的任務完成執行。 <br /> 互斥信號量有一個選項允許實現優先級繼承的算法。優先級繼承通過在T1被阻塞期 <br />間提升T3的優先級到T1解決了優先級逆轉引起的問題。這防止了T3,間接地防止T1,被 <br />T2搶占。通俗地說,優先級繼承協議使一個擁有資源的任務以等待該資源的任務中優先 <br />級最高的任務的優先級執行。當執行完成,任務釋放該資源并返回到它正常的或標準的 <br />優先級。因此,繼承優先級的任務避免了被任何中間優先級的任務搶占。 <br /> 同步 <br /> 信號量另一種通常的用法是用于任務間的同步機制。在這種情況下,信號量代表一 <br />個任務所等待的條件或事件。最初,信號量是在清零態。一個任務或中斷通過置位該信 <br />號量來指示一個事件的發生。等待該信號量的任務將被阻塞直到事件發生、該信號量被 <br />置位。一旦被解阻塞,任務就執行恰當的事件處理程序。信號量在任務同步中的應用對 <br />于將中斷服務程序從冗長的事件處理中解放出來以縮短中斷響應時間是很有用的。 <br />消息隊列 <br /> 消息隊列提供了在任務與中斷服務程序或其他任務間交換變長消息的一種較低層的 <br />機制。這種機制在功能上類似于管道,但有較少的開銷。 <br />管道、套接字、遠程過程調用和更多 <br /> 許多高層的VxWorks機制提供任務間通信的更高層的抽象,包括管道、TCP/IP套接字 <br />、遠程過程調用和更多。為了保持裁減內核為僅包含足夠支持高層功能的一個最小函數 <br />集的設計目標,這些特性都是基于上面描述的內核同步方式的。 <br />3. 內核設計的優點 <br /> wind內核的一個重要的設計特性是最小的搶占延時。其他的主要設計的優點包括史 <br />無前例的可配置性,對不可預見的應用需求的可擴展性,在各種微處理器應用開發中的 <br />移植性。 <br />最小的搶占延時 <br /> 正如前面所討論的,禁止搶占是獲得代碼臨界資源互斥操作的通常手段。這種技巧 <br />的不期望的負面影響是高的搶占延時,這可以通過盡量使用信號量實現互斥和保持臨界 <br />區盡量緊湊被減小。但即使廣泛地使用信號量也不能解決所有的可能導致搶占延時的根 <br />源。內核本身就是一個導致搶占延時的根源。為了理解其原因,我們必須更好地理解內 <br />核所需的互斥操作。 <br />內核級和任務級 <br /> 在任何多任務系統中,大量的應用是發生在一個或多個任務的上下文。然而,有些 <br />CPU時間片不在任何任務的上下文。這些時間片發生在內核改變內部隊列或決定任務調度 <br />。在這些時間片中,CPU在內核級執行,而非任務級。 <br /> 為了內核安全地操作它的內部的數據結構,必須有互斥操作。內核級沒有相關的任 <br />務上下文,內核不能使用信號量保護內部鏈表。內核使用工作延期作為實現互斥的方式 <br />。當有內核參與時,中斷服務程序調用的函數不是被直接激活,而是被放在內核的工作 <br />隊列中。內核完成這些請求的執行而清空內核工作隊列。 <br /> 當內核正在執行已經被請求服務時系統將不響應到達內核的函數調用。可以簡單地 <br />認為內核狀態類似于禁止搶占。如前面所討論的,搶占延時在實時系統中是不期望有的 <br />,因為它增加了對于會引起應用任務重新調度的事件的響應時間. <br /> 管操作系統在內核級(此時禁止搶占)完全避免消耗時間是不可能的,但減少這些 <br />時間是很重要的。這是減少由內核執行的函數的數量的主要原因, 也是不采用統一結構 <br />的系統設計方式的原因。例如,有一種流行的實時操作系統的每個函數都是在內核級執 <br />行。這意味著當一個低優先級的任務在執行分配內存、獲得任務信息的函數時所有高優 <br />先級的任務被禁止搶占。 <br />一個最小的內核 <br /> 已經說明了一個最小內核的優點和構造高層操作系統功能的必要功能,我們使用這 <br />些操作原語來執行一個傳統的內核級功能,而在VxWorks中作為任務級功能執行,內存管 <br />理。 在這個例子中,考慮用戶可調用的子例程malloc, 用于分配所請求大小的內存區 <br />并返回一個指向該內存區的指針。假定空閑內存區是通過搜索一個空閑內存塊的隊列找 <br />到的,一個信號量必須被用來保護這個非搶占多用戶資源。分配內存的操作如下: <br />
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -