進(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)給售票員,然后售票員才能開門。

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

引出信號(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)的是喚醒和睡眠。

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


習(xí)題

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

生產(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)回滾都比較麻煩。

死鎖忽略的方法


死鎖
多個(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



