九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
互斥量、臨界區(qū)、信號(hào)量、事件標(biāo)志組和消息郵箱

    為了好的理解互斥量、臨界區(qū)、信號(hào)量、事件標(biāo)志組和消息郵箱,下面一些知識(shí)對(duì)初學(xué)者來說很重要:

    為了實(shí)現(xiàn)各任務(wù)之間的合作和無沖突的運(yùn)行,在有關(guān)聯(lián)的任務(wù)之間必須建立一些制約關(guān)系。這些制約關(guān)系主要有兩種:直接制約關(guān)系和間接制約關(guān)系。

    直接制約關(guān)系源于任務(wù)之間的合作。例如,有兩個(gè)任務(wù):任務(wù)1和任務(wù)2,它們需要通過訪問同一個(gè)數(shù)據(jù)緩沖區(qū)合作完成一項(xiàng)工作,任務(wù)1負(fù)責(zé)向緩沖區(qū)寫入數(shù)據(jù),任務(wù)2負(fù)責(zé)從緩沖區(qū)讀取數(shù)據(jù)。顯然任務(wù)1還未向緩沖區(qū)寫入數(shù)據(jù)時(shí)(緩沖區(qū)為空),任務(wù)2因不能從緩沖區(qū)得到有效數(shù)據(jù)而應(yīng)處于等待狀態(tài);只有等任務(wù)1向緩沖區(qū)寫入了數(shù)據(jù)之后,才應(yīng)該通知任務(wù)2去讀取數(shù)據(jù)。相反,當(dāng)緩沖區(qū)的數(shù)據(jù)還未被任務(wù)2讀取時(shí)(緩沖區(qū)為滿時(shí)),任務(wù)1就不能向緩沖區(qū)寫入新的數(shù)據(jù)而應(yīng)處于等待狀態(tài);只有等到任務(wù)2自緩沖區(qū)中讀取數(shù)據(jù)后,才應(yīng)該通知任務(wù)1去寫入數(shù)據(jù)。顯然,如果這兩個(gè)任務(wù)不能如此協(xié)調(diào)工作,將勢(shì)必造成嚴(yán)重的后果。

    間接制約關(guān)系源于對(duì)資源的共享。例如,任務(wù)1和任務(wù)2共享一臺(tái)打印機(jī),如果系統(tǒng)已經(jīng)把打印機(jī)分配給了任務(wù)1,則任務(wù)2因不能獲得打印機(jī)的使用權(quán)而應(yīng)處于等待狀態(tài);只有當(dāng)任務(wù)1把打印機(jī)釋放后,系統(tǒng)才能喚醒任務(wù)2使其獲得打印機(jī)的使用權(quán)。如果這兩個(gè)任務(wù)不這樣做,也會(huì)造成極大的混亂。

    由上可知,在多任務(wù)合作工作的過程中,操作系統(tǒng)應(yīng)解決兩個(gè)問題:一是各任務(wù)間應(yīng)具有一種互斥關(guān)系,即對(duì)于某個(gè)共享資源,如果一個(gè)任務(wù)正在使用,則其他任務(wù)只能等待,等到該任務(wù)釋放該資源后,等待的任務(wù)之一才能使用它;二是相關(guān)的任務(wù)在執(zhí)行上要有先后次序,一個(gè)任務(wù)要等其伙伴發(fā)來通知,或建立了某個(gè)條件后才能繼續(xù)執(zhí)行,否則只能等到。

    任務(wù)之間的這種制約性的合作運(yùn)行機(jī)制叫做任務(wù)間的同步(注意阿,是同步,不是同時(shí)?。。?/font>

 

1 互斥量(mutex)

    1.1 互斥量的定義

    互斥量是一種公共資源,在指定時(shí)刻,它只能被一個(gè)線程占有(也就是所有權(quán)特性),而且占有它的線程可以反復(fù)申請(qǐng)這個(gè)互斥量。

 

    1.2 使用互斥量的目的:適合用來控制線程對(duì)某些特定資源(比如,臨界區(qū)和共享資源)

    ① 保護(hù)臨界區(qū)(Critical Section):臨界區(qū)是一段代碼,在執(zhí)行時(shí)不能被其他線程打斷,如果要保護(hù)它,用互斥量可以實(shí)現(xiàn)。舉例如下:

    status=tx_mutex_get(&my_mutex,TX_WAIT_FOREVER);//申請(qǐng)互斥量

    if(status!=TX_SUCCESS)  break;//判斷是否申請(qǐng)成功

tx_thread_slepp(5);//睡眠5個(gè)時(shí)鐘節(jié)拍

status=tx_mutex_put(&my_mutex);//釋放互斥量

以上代碼就是臨界區(qū)。

② 提供對(duì)共享資源的互斥訪問:如果線程想對(duì)資源進(jìn)行獨(dú)占訪問,就必須為每個(gè)資源提供對(duì)應(yīng)的互斥量。而在訪問資源之前必須為之申請(qǐng)到互斥量,用完之后要把互斥量釋放掉,以便其他線程可以使用它來訪問資源。

 

1.3 使用互斥量需要注意的問題

使用互斥量可能會(huì)帶來死鎖的問題和優(yōu)先級(jí)倒置(反轉(zhuǎn))的問題。

⑴死鎖的問題,比如:進(jìn)程A要調(diào)用M資源,而M資源此刻卻被進(jìn)程B占用,且進(jìn)程B要調(diào)用N資源而N資源此刻被A占用,兩進(jìn)程均向CPU發(fā)出資源申請(qǐng),而不釋放自己占用的資源,所以兩進(jìn)程均處于暫停狀態(tài),這時(shí)死鎖問題。

    如何避免死鎖問題呢?有其中一種方法就是:強(qiáng)制每個(gè)進(jìn)程在同一時(shí)刻只能占有一個(gè)互斥量,如果一定要只有多個(gè)互斥量,可以要求線程必須按相同的順序來申請(qǐng)互斥量,如:如果線程先得到互斥量1,然后才是互斥量2。

    如果線程進(jìn)入了死鎖狀態(tài),怎樣從中恢復(fù)呢?有下面兩種方法:

    ① 在調(diào)用tx_mutex_get()函數(shù)申請(qǐng)互斥量時(shí),使用超時(shí)屬性。

    ② 使用tx_thread_wait_abort()中止陷入死鎖的線程的掛起狀態(tài)。

 

    ⑵優(yōu)先級(jí)倒置(反轉(zhuǎn))的問題,比如:一個(gè)低優(yōu)先級(jí)的線程3某一時(shí)刻已經(jīng)占有互斥量,而此時(shí)一個(gè)高優(yōu)先級(jí)線程1申請(qǐng)此互斥量,此時(shí)級(jí)線程1就只能等待,這時(shí)如果有一個(gè)中優(yōu)先級(jí)線程2已經(jīng)就緒,那線程2就會(huì)中斷線程3,從而就會(huì)出現(xiàn)線程2先于線程1而執(zhí)行,這種現(xiàn)象就是優(yōu)先級(jí)倒置問題。

    如何避免優(yōu)先級(jí)倒置?可以讓線程3申請(qǐng)的互斥量使用優(yōu)先級(jí)繼承的選項(xiàng)來解決這個(gè)問題。而優(yōu)先級(jí)繼承就是:當(dāng)出現(xiàn)這種情況(一個(gè)低優(yōu)先級(jí)的線程3某一時(shí)刻已經(jīng)占有互斥量,而此時(shí)一個(gè)高優(yōu)先級(jí)線程1申請(qǐng)此互斥量,此時(shí)級(jí)線程1就只能等待)時(shí),低優(yōu)先級(jí)線程3就繼承高優(yōu)先級(jí)線程的優(yōu)先級(jí),直到線程3釋放互斥量后才恢復(fù)其優(yōu)先級(jí),這樣就可以避免優(yōu)先級(jí)倒置的問題。

    1.4 互斥量的一大特性:所有權(quán)特性。

 

2 臨界區(qū)(Critical Section) 

1.1臨界區(qū)的定義

通過對(duì)多線程的串行化來訪問公共資源或一段代碼,速度快,適合控制數(shù)據(jù)

訪問。 

1.2 使用臨界區(qū)的目的

同步同進(jìn)程中的線程,保證在某一時(shí)刻只有一個(gè)線程能訪問數(shù)據(jù)的簡(jiǎn)便方法

,在任意時(shí)刻只允許一個(gè)線程對(duì)共享資源進(jìn)行訪問。如果有多個(gè)線程試圖同時(shí)訪問臨界區(qū),那么在有一個(gè)進(jìn)程進(jìn)入后期他所有試圖訪問此臨界區(qū)的線程將被掛起,并一直等到已經(jīng)進(jìn)入此臨界區(qū)的線程離開。

 

    1.3 互斥量和臨界區(qū)同步線程的區(qū)別

    雖然臨界區(qū)同步速度很快,但卻只能用來同步本進(jìn)程內(nèi)的線程,而不可用來同步多個(gè)進(jìn)程中的線程。而互斥量比臨界區(qū)復(fù)雜。因?yàn)槭褂没コ獠粌H僅能夠在同一應(yīng)用程序不同線程中實(shí)現(xiàn)資源的安全共享,而且可以在不同應(yīng)用程序的線程之間實(shí)現(xiàn)對(duì)資源的安全共享。

 

3 信號(hào)量(semaphore)

    3.1 信號(hào)量的定義

    每個(gè)信號(hào)量都是公共資源,其值是一個(gè)32位計(jì)數(shù)。信號(hào)量的數(shù)據(jù)結(jié)構(gòu)為一個(gè)值和一個(gè)指針,指針指向等待該信號(hào)量的下一個(gè)進(jìn)程。

信號(hào)量的值與相應(yīng)資源的使用情況有關(guān)。當(dāng)它的值大于0時(shí),表示當(dāng)前可用資源的數(shù)量;當(dāng)它的值小于0時(shí),其絕對(duì)值表示等待使用該資源的進(jìn)程個(gè)數(shù)。注意,信號(hào)量的值僅能由PV操作來改變。

實(shí)現(xiàn)的P,V操作算法描述:

P操作:while s>0

        s=s-1

V操作:s=s+1

P表示申請(qǐng)一個(gè)資源,如果條件滿足(即右可以分配的資源),則把資源分配給提出申請(qǐng)的進(jìn)程,并且時(shí)資源數(shù)目s減1。V表示資源使用哪完畢之后,要把占有的資源釋放,并且資源數(shù)目s加1 。

 

3.2 使用信號(hào)的場(chǎng)合

⑴ 互斥訪問,和互斥量類似,兩者的區(qū)要區(qū)別是:信號(hào)量不支持所有權(quán),而所有權(quán)是互斥量的核心。當(dāng)信號(hào)量提供互斥訪問時(shí),信號(hào)量的值代表它允許多少個(gè)線程同時(shí)訪問與之相聯(lián)系的資源。大多數(shù)情況下,提供互斥量的信號(hào)量的初值為1,這意味著在任何時(shí)刻只有一個(gè)線程可以訪問相關(guān)資源,其值只可能為1或0的信號(hào)量一般稱為二進(jìn)制信號(hào)量。

使用二進(jìn)制信號(hào)量時(shí),使用者必須避免已經(jīng)控制了信號(hào)量的線程再次調(diào)用tx_semaphore_get()來向信號(hào)量申請(qǐng)一個(gè)實(shí)例,如果調(diào)用了此項(xiàng)服務(wù),這此調(diào)用失敗,并將永久性掛起該線程,同時(shí)令資源永遠(yuǎn)不可用。

 

⑵ 事件通知:比如可以在生產(chǎn)者—消費(fèi)者模式的程序中提供事件通知。在這種程序中,消費(fèi)者在消費(fèi)資源(例如隊(duì)列中的數(shù)據(jù))前試圖獲取信號(hào)量,生產(chǎn)者一旦生產(chǎn)了資源就增加信號(hào)量的值,也就可以理解為生產(chǎn)者把實(shí)例交給了信號(hào)量,而消費(fèi)者把實(shí)例從信號(hào)量中拿走了。這類信號(hào)量通常初值為0,其值直到生產(chǎn)者生產(chǎn)了資源才會(huì)增加。

上面這個(gè)例子說明了:生產(chǎn)者與消費(fèi)者通過信號(hào)量通信,生產(chǎn)者通過向信號(hào)量放入實(shí)例產(chǎn)生事件通知(通過信號(hào)量的值變化來產(chǎn)生事件通知的作用),而消費(fèi)者通過申請(qǐng)信號(hào)量實(shí)例來等待事件通知。

⑶ 線程同步:除了使用臨界區(qū)與互斥量可以完成線程間的同步外,還可以使用信號(hào)量,其信號(hào)允許多個(gè)線程同時(shí)使用共享資源,它指出了同時(shí)訪問共享資源的線程最大數(shù)目。在信號(hào)量?jī)?nèi)部有一個(gè)計(jì)數(shù)器,當(dāng)有線程訪問共享資源時(shí),計(jì)數(shù)器將自動(dòng)遞減,當(dāng)它為0時(shí),不再允許其他線程對(duì)共享資的訪問,直到有一個(gè)線程釋放共享資源,從而完成對(duì)共享資源的保護(hù)。

多個(gè)線程競(jìng)爭(zhēng)n個(gè)資源(n>0),比如有4個(gè)資源,那么就初始化量為4,每當(dāng)線程各自請(qǐng)求信號(hào)量的時(shí)候,如果信號(hào)量為0,則表示沒有可用的資源,請(qǐng)求的線程要等它其他占用者釋放信號(hào)量,如果信號(hào)量大于0,則線程的請(qǐng)求被允許,信號(hào)量被遞減,然后線程可以按約定訪問資源,當(dāng)線程使用資源完畢,應(yīng)該釋放信號(hào)量,以便其他線程需要時(shí)使用

 

3.3 互斥量和信號(hào)量的區(qū)別

如果互斥對(duì)程序很關(guān)鍵,那么就該使用互斥量;如果互斥不是程序中的主要因素,那么就使用信號(hào)量,因?yàn)樗然コ饬可钥?,使用系統(tǒng)資源比較少。

 

3.4 信號(hào)量的事件通知和線程同步的區(qū)別

信號(hào)量的事件通知是用于兩個(gè)線程之間(比如生產(chǎn)者—消費(fèi)者問題),而信號(hào)量的線程同步時(shí)用于多線程之間(比如一個(gè)可以多人打電話的電話亭問題)。

 

4 事件標(biāo)志組

    4.1 事件標(biāo)志組的理解

事件標(biāo)志可以被任何線程置位和復(fù)位,也可以被任何程序查看,線程可以因?yàn)榈却唤M事件標(biāo)志被置位而掛起。每個(gè)事件標(biāo)志由一個(gè)位代表,每32個(gè)事件標(biāo)志被安排在一組。

    將事件標(biāo)志置位或復(fù)位是通過把當(dāng)前事件標(biāo)志組和新的標(biāo)志組進(jìn)行邏輯“與”或“邏輯或”;為了得到事件標(biāo)志,也要做類似的邏輯操作。一旦事件標(biāo)志組中有標(biāo)志被置位,系統(tǒng)就會(huì)檢查相應(yīng)組的掛起隊(duì)列,如果能滿足掛起線程,則該線程就被恢復(fù)。

    4.2 事件標(biāo)志組的使用場(chǎng)合

    應(yīng)為一個(gè)事件標(biāo)志組中包括32個(gè)1位的標(biāo)志,可以有非常多的組合方式,所有它比較適合于同步很多線程的場(chǎng)合。

5 消息隊(duì)列

    5.1 如何理解消息隊(duì)列

    首先它是一種隊(duì)列,所以它是一種數(shù)據(jù)結(jié)構(gòu),但它又是“消息隊(duì)列”

,所以它是一種可以傳遞多個(gè)消息(消息也就是數(shù)據(jù),實(shí)際上傳遞得是消息的指針)的數(shù)據(jù)結(jié)構(gòu)。

 

    5.2 消息隊(duì)列的使用

    如果線程與線程之間要傳遞很多消息(數(shù)據(jù)),那么為了適應(yīng)不同數(shù)據(jù)的需要,最好是在存儲(chǔ)器中建立多個(gè)數(shù)據(jù)緩沖區(qū),把要傳遞的數(shù)據(jù)放在緩沖區(qū)中,其中在消息隊(duì)列中分別存放消息的緩沖區(qū)的地址,這樣就可實(shí)現(xiàn)線程間的數(shù)據(jù)通信。適合于線程間傳遞很多數(shù)據(jù)的場(chǎng)合

 

    5.3 消息隊(duì)列的線程間通信和信號(hào)量的線程同步的區(qū)別

    消息隊(duì)列的線程間通信是用于傳遞數(shù)據(jù),而信號(hào)量的線程同步側(cè)重的是信號(hào)量的指示作用。

 

 

互斥量和二進(jìn)制信號(hào)量的一個(gè)應(yīng)用:

一個(gè)一次只允許一個(gè)用戶使用的電話亭,為了防止用戶發(fā)生沖突,電話亭的門上就應(yīng)該有這樣一個(gè)標(biāo)志,并用它來表示電話亭的被只有情況。例如,用一個(gè)可以變換兩種顏色的牌子,用紅色表示“有人”,用綠色表示“沒人”。這樣,人們見到牌子上的顏色是綠色時(shí)(線程通過查詢知道信號(hào)量的值為1),就可以進(jìn)去打電話(表示一個(gè)進(jìn)程可以占用此資源(電話亭));如果是紅色,那么就只好等待;如果又陸續(xù)來了很多人,那么就排隊(duì)等待。其中,電話亭上的這個(gè)牌子就是信號(hào)量或互斥量。

 

信號(hào)量同步線程的一個(gè)例子:

一個(gè)電話亭可以允許多人(線程)打電話,電話亭門上的計(jì)數(shù)器在每進(jìn)入一個(gè)人時(shí)自動(dòng)減1,而每出去一個(gè)人時(shí)會(huì)自動(dòng)加1。計(jì)數(shù)器上的初值就是電話亭的最多能容納打電話的人數(shù),那么來人只要見到計(jì)數(shù)器的值大于0,就可以進(jìn)去打電話;否則只能等待。其中這個(gè)計(jì)數(shù)器就是用于同步線程的信號(hào)量。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服