L16 & L17 進(jìn)程同步與信號(hào)量 & 信號(hào)量臨界區(qū)保護(hù)

進(jìn)程推進(jìn)的合理有序同步——信號(hào)量
等待是進(jìn)程同步的核心
信號(hào)量的出現(xiàn)是對(duì)于如果有多個(gè)P的時(shí)候,只有信號(hào)是不能喚醒所有生產(chǎn)者的,只能喚醒一個(gè)生產(chǎn)者

  • 信號(hào)只能喚醒一個(gè)生產(chǎn)者

信號(hào)量小于0對(duì)應(yīng)的是有多少個(gè)進(jìn)程睡眠了

  • 要學(xué)會(huì)等待(觀察信號(hào)量是否為負(fù),如果是負(fù)數(shù)就需要等待)

是很重要的


  • 用臨界區(qū)來保護(hù)信號(hào)量
  • 用信號(hào)量來支持進(jìn)程的同步

信號(hào)量(整型變量)

互斥


讓進(jìn)程之間的合作變得合理有序
實(shí)現(xiàn)這個(gè)的依據(jù)是信號(hào)量
想象一個(gè)司機(jī)售票員的例子,司機(jī)要啟動(dòng)車輛,這個(gè)時(shí)候應(yīng)該讓售票員先關(guān)門,然后發(fā)一個(gè)信號(hào),然后司機(jī)可以啟動(dòng)車輛,我們說司機(jī)是在等待一個(gè)信號(hào)。
同理,司機(jī)停車了,就需要發(fā)送一個(gè)信號(hào)給售票員,然后售票員才能開門。

圖片.png

等待就是阻塞,這個(gè)也是進(jìn)程同步的核心。

比如說生產(chǎn)者--消費(fèi)者模型,當(dāng)緩沖區(qū)滿的時(shí)候,就要停下來,不然會(huì)溢出。如果緩沖區(qū)空了,就不敢再消費(fèi)了,已經(jīng)沒有東西可以消費(fèi)了。

圖片.png


引出信號(hào)量

之前的信號(hào)在程序里面的體現(xiàn)是counter,信號(hào)表示的只是,它只能喚醒一個(gè)進(jìn)程,然后就無效了,如果有n個(gè)進(jìn)程,那么剩下的n - 1個(gè)進(jìn)程就會(huì)一直sleep下去。所以我們需要一個(gè)量——信號(hào)量來表示有多少個(gè)進(jìn)程在睡眠,喚醒的時(shí)候需要喚醒多少個(gè)進(jìn)程。

信號(hào)量——記錄有多少個(gè)進(jìn)程睡眠了

如果只有信號(hào)的話,只能是發(fā)信號(hào)還有等信號(hào),對(duì)應(yīng)的是喚醒睡眠。

圖片.png

如果有了信號(hào)量的話,我們用sem來表示,根據(jù)sem是多少來決定是喚醒還是睡眠,如果sem已經(jīng)小于0了,那就睡眠,然后消費(fèi)者進(jìn)程看到sem小于0了,就會(huì)去喚醒。

這樣子就實(shí)現(xiàn)了進(jìn)程的走走停停

圖片.png
圖片.png

習(xí)題

圖片.png

P操作和V操作

  • P操作對(duì)應(yīng)的是消費(fèi)者
  • V操作對(duì)應(yīng)的是生產(chǎn)者
    睡眠和喚醒對(duì)應(yīng)的是都是信號(hào)量是否會(huì)小于0

P和V的2段代碼

圖片.png

生產(chǎn)者在共享緩沖區(qū)的時(shí)候,消費(fèi)者不能進(jìn)去
消費(fèi)者在共享緩沖區(qū)的時(shí)候,生產(chǎn)者不能進(jìn)去

實(shí)現(xiàn)這一點(diǎn)是需要靠互斥信號(hào)量來實(shí)現(xiàn)

為什么要保護(hù)信號(hào)量

因?yàn)槎鄠€(gè)進(jìn)程會(huì)共同修改信號(hào)量,這樣會(huì)導(dǎo)致信號(hào)量的語義錯(cuò)誤。這種錯(cuò)誤就稱為——

調(diào)度有關(guān)的共享數(shù)據(jù)語義錯(cuò)誤

什么是臨界區(qū)?

假如A進(jìn)程有段代碼,B進(jìn)程有段代碼,他們倆都有一個(gè)小部分的代碼涉及到了相同的信號(hào)量,那么這一小部分就是臨界區(qū),臨界區(qū)的執(zhí)行是一個(gè)原子操作——一個(gè)進(jìn)程進(jìn)去后修改完才能解鎖。

臨界區(qū)是成對(duì)or成組出現(xiàn)的

互斥——不能同時(shí)進(jìn)入

死鎖預(yù)防就是2個(gè)方法

  • 一次性申請(qǐng)所有資源
  • 按序等待

死鎖避免

找到一個(gè)安全序列(通過銀行家算法

圖片.png

死鎖避免的代價(jià)太大了

因?yàn)槊恳粋€(gè)進(jìn)程Pi每次申請(qǐng)的時(shí)候,都要進(jìn)行一次銀行家算法,看是否會(huì)引起死鎖,時(shí)間復(fù)雜度太高

圖片.png

圖片.png

死鎖檢測(cè)和恢復(fù)

發(fā)現(xiàn)問題,檢測(cè)到問題用的還是銀行家算法,不過執(zhí)行的次數(shù)少了一些了。
恢復(fù)的時(shí)候采用的是進(jìn)程回滾,回滾到一定程度了看看是否還會(huì)死鎖。

但是選擇誰回滾,和實(shí)現(xiàn)回滾都比較麻煩。

圖片.png

死鎖忽略的方法

圖片.png

圖片.png

死鎖

多個(gè)進(jìn)程由于互相等待對(duì)方持有的資源,從而導(dǎo)致任何一個(gè)進(jìn)程都無法執(zhí)行的情況。

死鎖的成因

  • 互斥——一個(gè)資源被A進(jìn)程占用后,其他進(jìn)程無法使用
  • A進(jìn)程占有了資源后,不釋放,還要去申請(qǐng)其他的資源

好比已經(jīng)占有了一條路,還要繼續(xù)前進(jìn)到其他的道路

  • 環(huán)路等待——每個(gè)進(jìn)程占有的資源和想要申請(qǐng)的資源形成了一個(gè)環(huán)路

相當(dāng)于每輛公交車已經(jīng)有了自己的車道,還想要去占別人的車道,但是別人不讓,所以就僵持住了。

死鎖的4個(gè)必要條件

  • 互斥使用
  • 不可搶占——資源只能進(jìn)程自己放棄,比如公交車自己開走

上面2點(diǎn)都是資源的固有屬性

  • 請(qǐng)求和保持——進(jìn)程已經(jīng)有了一個(gè)資源還不釋放,同時(shí)去申請(qǐng)其他的資源
  • 循環(huán)等待


    圖片.png

死鎖本身的出現(xiàn)就是一個(gè)小概率事件

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容