1. 程式人生 > >VxWorks 二進位制訊號量,互斥訊號和計數訊號量的區別

VxWorks 二進位制訊號量,互斥訊號和計數訊號量的區別

URL: http://blog.csdn.net/hxg130435477/article/details/5998006

VxWorks訊號量是提供任務間通訊、同步和互斥的最優選擇,提供任務間最快速的通訊。也是提供任務間同步和互斥的主要手段。VxWorks提供3種訊號量來解決不同的問題。

二進位制訊號量:最快的最常用的訊號量,可用於同步或互斥。

互斥訊號量:為了解決內在的互斥問題如優先順序繼承、刪除安全和遞迴等情況而最優化的特殊的二進位制訊號量。

計數訊號量:類似於二進位制訊號量,但是隨訊號量釋放的次數改變而改變。

二進位制訊號量

二進位制訊號量能夠滿足任務間的互斥和同步,需要的系統開銷最小,因此也稱快速訊號量。二進位制訊號量可以看成一個標誌,對應資源是可用還是不可用。當一個任務呼叫semTake ()請求一個訊號量時,如果此時訊號量可用,訊號量會被清零,並且任務立即繼續執行;如果訊號量不可用,任務會被阻塞來等待訊號量。

當一個任務呼叫semGive ()釋放一個二進位制訊號量時。如果訊號量已經可用,釋放訊號量不會產生任何影響;如果訊號量不可用並且沒有任務等待使用該訊號量,訊號量只是被簡單地置為可用;如果訊號量不可用並且有一個或多個任務等待該訊號量,最高優先順序的任務被解阻塞,訊號量仍為不可用。

互斥

當兩個以上的任務共享使用同一塊記憶體緩衝區或同一個I/O裝置之類的資源時,可能會發生競爭狀態。

二進位制訊號量可以通過對共享資源上鎖,實現高效的互斥訪問,不象禁止中斷或禁止搶佔,二進位制訊號量將互斥僅僅限於對與之聯絡的資源的訪問,並且比禁止中斷和禁止搶佔提供更精確的互斥粒度。使用時建立用於保護資源的二進位制訊號量,初始時訊號量可用。

當任務需要訪問這個資源時,首先取得這個訊號量,所有其它想要訪問這個資源的任務將被阻塞。當任務完成了對該資源的訪問時,釋放該訊號量,允許其他任務使用該資源。因此所有對一個需要互斥訪問資源的操作由semTake ()和semGive ()對一起來實現。

semTake(semMutex,WAIT FOREVER)

臨界區,某一時刻僅被一個任務訪問

semGive (semMutex)

同步

訊號量另一種通常的用法是用於任務間的同步機制。在這種情況下,訊號量代表一個任務所等待的條件或事件。最初,訊號量是不可用的。一個任務或中斷處理程式釋放該訊號量來通知這個事件的發生。等待該訊號量的任務將被阻塞直到事件發生、該訊號量可用。一旦被解阻塞,任務就執行恰當的事件處理程式。訊號量在任務同步中的應用對於將中斷服務程式從冗長的事件處理中解放出來以縮短中斷響應時間是很有用的。

互斥訊號量

互斥訊號量是一種特殊的二進位制訊號量,用於解決具有內在的互斥問題:優先順序繼承、刪除安全和對資源的遞迴訪問等情況。

對於一般的作業系統,一般互斥訊號量就是二值訊號靚量,但VxWoks中有非同尋常的意義。另外一個典型就是,Linux核心也單獨設立了互斥訊號量。

互斥訊號量與二進位制不同點在於:

①定義一個互斥訊號量時,其已經初始化完畢為可用,它僅用於互斥;

②僅能由取(semTake ())它的任務釋放,即由同一個任務申請然後使用完畢後釋放;

③因為semTake和semGive是成對出現的,因此不能在ISR 中釋放(semGive ())。

優先順序繼承

優先順序倒置發生在一個高優先順序的任務被迫等待一段不確定時間,等待一個低優先順序任務完成。VxWorks允許使用優先順序繼承演算法,在互斥訊號量中使用選項SEM-INVERSION-SAFE ,將使能優先順序繼承演算法,優先順序繼承協議確保擁有資源的任務以阻塞在該資源上的所有任務中優先順序最高的任務的優先順序執行,直到它釋放所擁有的所有訊號量,然後該任務返回到正常狀態。因此這個“繼承的高優先順序”任務受到不會被任何中間優先順序任務搶佔的保護。

刪除安全

另一個互斥問題涉及到任務刪除。在一個受訊號量保護的臨界區,經常需要保護在臨界區執行的任務不會被意外地刪除。刪除一個在臨界區執行的任務可能引起意想不到的後果,造成保護資源的訊號量不可用,可能導致資源處於破壞狀態,也就導致了其他要訪問該資源的所有任務無法得到滿足。

原語taskSafe()和taskUnsafe ()提供了防止任務被意外刪除的一種方法。同時互斥訊號量提供了選項SEM-DELETE-SAFE ,使用這個選項,每次呼叫semTake ( )時隱含地使能了taskSafe(),當每次呼叫semGive ()時隱含地使能了taskUnsafe ()這種方式,任務得到訊號量時得到不會被刪除的保護。

遞迴資源訪問

互斥訊號量能夠被遞迴地獲得。這意味著訊號量能夠被一個擁有該訊號量的任務在該訊號量最終被釋放之前多次獲取。遞迴對於滿足一些子程式即要求能夠相互呼叫但是也要求互斥訪問一個資源非常有用。這種情形是可能的,因為系統需要跟蹤哪一個任務當前擁有訊號量。

計數器訊號量

計數器訊號量是實現任務同步和互斥的另一種手段,在具體實現上有點差異。計數器訊號量除了像二進位制訊號量那樣工作外,還保持對訊號量釋放次數的跟蹤。與二進位制訊號量不同的時,計數型訊號量每次釋放,計數器加一;每次獲取,計數器減一,當訊號量減到0 時,試圖獲取該訊號量的任務被阻塞。

正如二進位制訊號量,當計數訊號量釋放時,如果有任務阻塞在該訊號量阻塞佇列上,那麼任務解除阻塞;但是如果訊號量釋放時,沒有任務阻塞在該訊號量阻塞佇列上,那麼計數器加一。

結 論

通過對嵌入式作業系統VxWorks的多工之間的通訊機制的分析可以看出,訊號量在實現多工間的通訊、同步和互斥中發揮著重要的作用。因此,深入理解和正確使用VxWorks的訊號量,可以提高實時系統中多工間通訊的效率