溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Task中二進(jìn)制信號(hào)量怎么用

發(fā)布時(shí)間:2021-12-22 10:34:00 來(lái)源:億速云 閱讀:163 作者:小新 欄目:互聯(lián)網(wǎng)科技

小編給大家分享一下Task中二進(jìn)制信號(hào)量怎么用,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

在計(jì)算機(jī)系統(tǒng)里,經(jīng)常遇到一種場(chǎng)景: 任務(wù)同步問(wèn)題(Synchronization)。例如任務(wù)在使用系統(tǒng)資源(例如某個(gè)數(shù)據(jù))之前,先要向系統(tǒng)申請(qǐng)。這個(gè)申請(qǐng)過(guò)程,就是一種同步,代碼大致如下

Task中二進(jìn)制信號(hào)量怎么用

先是request data,如果data在當(dāng)前時(shí)刻無(wú)效,則這個(gè)任務(wù)就需要wait。這樣的話,OS就需要提供一種機(jī)制,在data有效后,及時(shí)地發(fā)送事件,通知這個(gè)任務(wù)。

二進(jìn)制信號(hào)量就是這樣一種機(jī)制: 它能夠改變?nèi)蝿?wù)的狀態(tài),讓任務(wù)訪問(wèn)無(wú)效資源時(shí)進(jìn)入阻塞狀態(tài),當(dāng)資源有效時(shí),讓阻塞的任務(wù)回到就緒狀態(tài)。

我們來(lái)看看二進(jìn)制信號(hào)量的使用,首先是創(chuàng)建

Task中二進(jìn)制信號(hào)量怎么用

semBCreate()創(chuàng)建成功后,返回信號(hào)量的ID。因?yàn)槌踔抵荒苁?或1,所以叫二進(jìn)制信號(hào)量。當(dāng)然了,二進(jìn)制信號(hào)量(binary semaphore)只是一種翻譯名稱,有人也把它叫做二值信號(hào)量。0的含義是資源無(wú)效、數(shù)據(jù)無(wú)效、事件未發(fā)生等,1的含義是資源有效、數(shù)據(jù)有效、事件發(fā)生等。排隊(duì)方式表示有多個(gè)任務(wù)阻塞在同一個(gè)信號(hào)量時(shí),資源有效后,哪個(gè)任務(wù)解除阻塞。

這種創(chuàng)建是一種動(dòng)態(tài)行為,創(chuàng)建時(shí)才給信號(hào)量分配內(nèi)存。還有一種靜態(tài)實(shí)例化的方法

Task中二進(jìn)制信號(hào)量怎么用

pSem指向之前分配(例如編譯時(shí))的空間,這樣可以加快信號(hào)量的創(chuàng)建速度,還可以滿足某些禁止動(dòng)態(tài)內(nèi)存的系統(tǒng)

創(chuàng)建信號(hào)量之后,就可以使用它了。使用信號(hào)量,主要有兩個(gè)函數(shù)

Task中二進(jìn)制信號(hào)量怎么用

semTake()用來(lái)申請(qǐng)信號(hào)量,信號(hào)量無(wú)效時(shí),引起阻塞,因此不能在ISR中使用

Task中二進(jìn)制信號(hào)量怎么用


semGive()用來(lái)釋放信號(hào)量,在任務(wù)或ISR中都可以調(diào)用

Task中二進(jìn)制信號(hào)量怎么用

信號(hào)量如果不用了,動(dòng)態(tài)申請(qǐng)的信號(hào)量可以被semDelete()刪除,靜態(tài)實(shí)例化的信號(hào)量可以被semTerminate()停止。如果這時(shí)候還有任務(wù)阻塞在信號(hào)量上,則這些任務(wù)直接解除阻塞,不過(guò)它的semTake()返回ERROR

Task中二進(jìn)制信號(hào)量怎么用

跑個(gè)例子看看吧

Task中二進(jìn)制信號(hào)量怎么用

啟動(dòng)兩個(gè)任務(wù)來(lái)申請(qǐng)信號(hào)量,其中第二個(gè)任務(wù)的優(yōu)先級(jí)高一些

Task中二進(jìn)制信號(hào)量怎么用

在Shell里可以用show()命令來(lái)查看Kernel的對(duì)象

Task中二進(jìn)制信號(hào)量怎么用

可以看到這個(gè)信號(hào)量上阻塞了兩個(gè)任務(wù)

Task中二進(jìn)制信號(hào)量怎么用

反過(guò)來(lái),用w()或tw()命令,可以看到任務(wù)阻塞的信號(hào)量

Task中二進(jìn)制信號(hào)量怎么用

我們直接在Shell里釋放一次信號(hào)量

Task中二進(jìn)制信號(hào)量怎么用

可以看到t1申請(qǐng)成功了,盡管它的優(yōu)先級(jí)低一些,因?yàn)槲覀兪褂玫呐抨?duì)方式是SEM_Q_FIFO。

然后可以再釋放一次,t2才能申請(qǐng)成功?;蛘?,我們直接試試刪除

Task中二進(jìn)制信號(hào)量怎么用

可以看到t2也解除阻塞了,只不過(guò)semTake()返回了ERROR,因?yàn)镾_objLib_OBJ_DELETED

剛剛這個(gè)例子,就是Shell這個(gè)任務(wù)分別與t1和t2分別進(jìn)行了同步。不過(guò)這都是兩個(gè)任務(wù)之間的同步,其實(shí)二進(jìn)制信號(hào)量還支持多任務(wù)的同步

Task中二進(jìn)制信號(hào)量怎么用

用semFlush()代替semGive()后,所有阻塞在該信號(hào)量上的任務(wù)都會(huì)解除阻塞,而不管當(dāng)初創(chuàng)建信號(hào)量時(shí),排隊(duì)方式是什么了。

Task中二進(jìn)制信號(hào)量怎么用

可以看到t1和t2都解除阻塞了。不過(guò)t2的優(yōu)先級(jí)高一些,所以它先執(zhí)行了。這種同步,就叫多任務(wù)同步。

看完了這篇文章,相信你對(duì)“Task中二進(jìn)制信號(hào)量怎么用”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI