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的信號量,可以提高實時系統中多任務間通信的效率


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章