1、進(jìn)程的相互作用
(1)① 獨(dú)占式競爭 —— 所競爭的資源通常需要獨(dú)占,eg:CPU、打印機(jī)。
② 協(xié)作式競爭 —— 進(jìn)程間對(duì)共享對(duì)象使用權(quán)的競爭,能夠遺失到對(duì)方的存在。
必須限制對(duì)共享對(duì)象的使用,保證對(duì)a、b修改的原子性。
③ 協(xié)作 —— 知道對(duì)方的存在,且通過相互通信來交換信息、協(xié)調(diào)工作
④ 組合式作用 —— 有協(xié)作、有通信、有共享、有競爭。
(2)歸納:進(jìn)程間的作用 —— 互斥(獨(dú)占、競爭) 、同步(協(xié)作)
① 互斥:需保證獨(dú)愛獨(dú)占式資源的互斥使用。保護(hù)資源,需封閉,用鎖
② 具有同步關(guān)系的進(jìn)程在執(zhí)行時(shí)間上有明確要求的順序。合作,需開放,用信號(hào)量。
生產(chǎn)者和消費(fèi)者問題。
(3)臨界資源(互斥資源):一次只允許一個(gè)進(jìn)程使用的資源。
臨界區(qū):進(jìn)程中訪問臨界資源的程序片段。
2、純軟件實(shí)現(xiàn)(略,見ppt)
五個(gè)例子。
為保證對(duì)臨界資源的互斥訪問,在進(jìn)入臨界區(qū)前需:檢查(是否有別的進(jìn)程在臨界區(qū))、設(shè)置(自己即將進(jìn)入臨界區(qū))
這兩個(gè)操作應(yīng)該是原子的。 --> ①關(guān)中斷 ; ② 在一條指令中完成檢測與設(shè)置操作 ?(均需硬件支持)
3、硬件輔助實(shí)現(xiàn)
(1)關(guān)中斷
異常無法關(guān)閉,可盡量避免;陷入是進(jìn)程自己請求的,不存在插入其他指令的問題;主要關(guān)外部中斷。
進(jìn)臨界區(qū)時(shí)保存中斷狀態(tài),然后關(guān)中斷;出臨界區(qū)時(shí)恢復(fù)中斷狀態(tài)。
(2)特殊指令
4、鎖??
鎖是一種最簡潔的互斥手段,通常用于保護(hù)時(shí)間很短的臨界資源。
用簡單的忙等測試實(shí)現(xiàn)的鎖叫自旋鎖
臨界區(qū)不應(yīng)允許中斷,不應(yīng)出現(xiàn)進(jìn)程切換、自旋鎖不能嵌套使用。
5、信號(hào)量/燈(分析實(shí)例見 ppt,只記錄一點(diǎn)知識(shí)點(diǎn))
(1)鎖保護(hù)的臨界區(qū)必須很小,針對(duì)因資源競爭造成的長等待問題 --> 信號(hào)量
為臨界資源建立狀態(tài)標(biāo)識(shí)和等待隊(duì)列;為臨界區(qū)建立入口P操作和出口V操作。
對(duì)信號(hào)量和等待隊(duì)列的修改也需要保護(hù)(因?yàn)橐彩桥R街資源),一般用鎖
(2)P 中,count 代表資源區(qū)剩的位置;V 中,count代表臨界區(qū)中有的進(jìn)程數(shù)。
若將信號(hào)量初值設(shè)為1,可以實(shí)現(xiàn)互斥:(P1進(jìn)去,P2、P3等待,P1出,V 操作加1,count 為負(fù),就換一個(gè)進(jìn)去)
一個(gè)信號(hào)量可以保護(hù)多個(gè)臨界資源,將信號(hào)量的初值設(shè)為臨界資源的個(gè)數(shù)。若信號(hào)量為 n,則前 n 個(gè) P 操作會(huì)成功,后面的P 操作會(huì)將進(jìn)程掛起,直到被其他 V 操作喚醒。
(3)進(jìn)程同步:控制兩個(gè)進(jìn)程的執(zhí)行順序,確保只有一個(gè)進(jìn)程完成動(dòng)作 A 之后,另一個(gè)進(jìn)程才開始動(dòng)作 B。
將信號(hào)量初值設(shè)為0,V 執(zhí)行了,加過了,P2中進(jìn)行 P 操作,減之后仍>=0,可以執(zhí)行(P1執(zhí)行后 P2可以執(zhí)行)。若 P2先執(zhí)行了 P 操作,S2進(jìn)入等待,等 P1中S1做完后進(jìn)行 V 操作,加了,P2中的 P 就可以成功了。(P2之前必須 P1)。
初值 n(n>0),也可以進(jìn)程同步,動(dòng)作 A 最多比動(dòng)作 B 多做 n次。
(4)總結(jié):
互斥使用時(shí),P、V 操作在同一個(gè)進(jìn)程中;同步使用時(shí),P、V 在不同進(jìn)程匯總。
信號(hào)量——初值1,可以實(shí)現(xiàn)互斥;初值為0,尅實(shí)現(xiàn)同步;初值大于1,可以實(shí)現(xiàn)進(jìn)程間的計(jì)數(shù)同步。
信號(hào) 量規(guī)定了可以超前完成的動(dòng)作數(shù)或者同時(shí)使用資源的進(jìn)程數(shù)。
信號(hào)量 ?>0,表示當(dāng)前可用的資源個(gè)數(shù);<0,絕對(duì)值表示等待資源的進(jìn)程數(shù);=0,表示無可用資源,也無等待資源的進(jìn)程。
PPT 上一堆例子??
信號(hào)量 ucore 實(shí)現(xiàn)。
信號(hào)量題型方法:
首先分析幾個(gè)生產(chǎn)者(進(jìn)程),幾個(gè)消費(fèi)者(進(jìn)程),幾個(gè)緩沖區(qū),幾個(gè)信號(hào)量。
首先解決互斥問題 --> 設(shè)疑個(gè)信號(hào)量初值為1,然后兩個(gè)進(jìn)程均為 P -> S -> V 的結(jié)構(gòu)。然后解決同步問題,幾個(gè)P 和 V 子啊兩個(gè)進(jìn)程中分別放一個(gè),且 V 在下面,P在上面,都在互斥的 PV 外面,找準(zhǔn)信號(hào)量設(shè)成多少。把 V 到 P 的箭頭畫出來進(jìn)行分析。
信號(hào)量 為 n —— 進(jìn)程計(jì)數(shù)同步,A 比 B 最多多做 n 次。
6、睡眠與喚醒
sleep( )將進(jìn)程設(shè)置為睡眠狀態(tài),請求調(diào)度,讓出 CPU,可以帶一個(gè)參數(shù),指定最長睡眠時(shí)間,到時(shí)間進(jìn)程會(huì)自動(dòng)醒來。
wakeup( )喚醒一個(gè)正在睡眠的進(jìn)程,可以帶一個(gè)參數(shù)指出要喚醒的進(jìn)程。
若將等待隊(duì)列與睡眠條件包裝在一起,就形成了一種新的同步機(jī)制 --> 條件變量