日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

二进制信号量,互斥信号和计数信号量的区别

發布時間:2023/12/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二进制信号量,互斥信号和计数信号量的区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

VxWorks的信號量機制分析

?

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

總結

以上是生活随笔為你收集整理的二进制信号量,互斥信号和计数信号量的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。