1盏求、進程的相互作用
(1)① 獨占式競爭 —— 所競爭的資源通常需要獨占抖锥,eg:CPU、打印機碎罚。
② 協(xié)作式競爭 —— 進程間對共享對象使用權(quán)的競爭磅废,能夠遺失到對方的存在。
必須限制對共享對象的使用荆烈,保證對a拯勉、b修改的原子性。
③ 協(xié)作 —— 知道對方的存在憔购,且通過相互通信來交換信息宫峦、協(xié)調(diào)工作
④ 組合式作用 —— 有協(xié)作、有通信玫鸟、有共享导绷、有競爭。
(2)歸納:進程間的作用 —— 互斥(獨占屎飘、競爭) 妥曲、同步(協(xié)作)
① 互斥:需保證獨愛獨占式資源的互斥使用。保護資源钦购,需封閉檐盟,用鎖
② 具有同步關(guān)系的進程在執(zhí)行時間上有明確要求的順序。合作押桃,需開放葵萎,用信號量。
生產(chǎn)者和消費者問題唱凯。
(3)臨界資源(互斥資源):一次只允許一個進程使用的資源羡忘。
臨界區(qū):進程中訪問臨界資源的程序片段。
2波丰、純軟件實現(xiàn)(略壳坪,見ppt)
五個例子。
為保證對臨界資源的互斥訪問掰烟,在進入臨界區(qū)前需:檢查(是否有別的進程在臨界區(qū))、設(shè)置(自己即將進入臨界區(qū))
這兩個操作應(yīng)該是原子的沐批。 --> ①關(guān)中斷 纫骑; ② 在一條指令中完成檢測與設(shè)置操作 ?(均需硬件支持)
3、硬件輔助實現(xiàn)
(1)關(guān)中斷
異常無法關(guān)閉九孩,可盡量避免先馆;陷入是進程自己請求的,不存在插入其他指令的問題躺彬;主要關(guān)外部中斷煤墙。
進臨界區(qū)時保存中斷狀態(tài)梅惯,然后關(guān)中斷;出臨界區(qū)時恢復(fù)中斷狀態(tài)仿野。
(2)特殊指令
4铣减、鎖??
鎖是一種最簡潔的互斥手段,通常用于保護時間很短的臨界資源脚作。
用簡單的忙等測試實現(xiàn)的鎖叫自旋鎖
臨界區(qū)不應(yīng)允許中斷葫哗,不應(yīng)出現(xiàn)進程切換、自旋鎖不能嵌套使用球涛。
5劣针、信號量/燈(分析實例見 ppt,只記錄一點知識點)
(1)鎖保護的臨界區(qū)必須很小亿扁,針對因資源競爭造成的長等待問題 --> 信號量
為臨界資源建立狀態(tài)標識和等待隊列捺典;為臨界區(qū)建立入口P操作和出口V操作。
對信號量和等待隊列的修改也需要保護(因為也是臨街資源)从祝,一般用鎖
(2)P 中辣苏,count 代表資源區(qū)剩的位置;V 中哄褒,count代表臨界區(qū)中有的進程數(shù)稀蟋。
若將信號量初值設(shè)為1,可以實現(xiàn)互斥:(P1進去呐赡,P2退客、P3等待,P1出链嘀,V 操作加1萌狂,count 為負,就換一個進去)
一個信號量可以保護多個臨界資源怀泊,將信號量的初值設(shè)為臨界資源的個數(shù)茫藏。若信號量為 n,則前 n 個 P 操作會成功霹琼,后面的P 操作會將進程掛起务傲,直到被其他 V 操作喚醒。
(3)進程同步:控制兩個進程的執(zhí)行順序枣申,確保只有一個進程完成動作 A 之后售葡,另一個進程才開始動作 B。
將信號量初值設(shè)為0忠藤,V 執(zhí)行了挟伙,加過了,P2中進行 P 操作模孩,減之后仍>=0尖阔,可以執(zhí)行(P1執(zhí)行后 P2可以執(zhí)行)贮缅。若 P2先執(zhí)行了 P 操作,S2進入等待介却,等 P1中S1做完后進行 V 操作外构,加了计贰,P2中的 P 就可以成功了漠酿。(P2之前必須 P1)赫粥。
初值 n(n>0),也可以進程同步胃夏,動作 A 最多比動作 B 多做 n次轴或。
(4)總結(jié):
互斥使用時,P仰禀、V 操作在同一個進程中照雁;同步使用時,P答恶、V 在不同進程匯總饺蚊。
信號量——初值1,可以實現(xiàn)互斥悬嗓;初值為0污呼,尅實現(xiàn)同步;初值大于1包竹,可以實現(xiàn)進程間的計數(shù)同步燕酷。
信號 量規(guī)定了可以超前完成的動作數(shù)或者同時使用資源的進程數(shù)。
信號量 ?>0周瞎,表示當(dāng)前可用的資源個數(shù)苗缩;<0,絕對值表示等待資源的進程數(shù)声诸;=0酱讶,表示無可用資源,也無等待資源的進程彼乌。
PPT 上一堆例子??
信號量 ucore 實現(xiàn)泻肯。
信號量題型方法:
首先分析幾個生產(chǎn)者(進程),幾個消費者(進程)囤攀,幾個緩沖區(qū)软免,幾個信號量。
首先解決互斥問題 --> 設(shè)疑個信號量初值為1焚挠,然后兩個進程均為 P -> S -> V 的結(jié)構(gòu)。然后解決同步問題漓骚,幾個P 和 V 子啊兩個進程中分別放一個蝌衔,且 V 在下面榛泛,P在上面,都在互斥的 PV 外面噩斟,找準信號量設(shè)成多少曹锨。把 V 到 P 的箭頭畫出來進行分析。
信號量 為 n —— 進程計數(shù)同步剃允,A 比 B 最多多做 n 次沛简。
6、睡眠與喚醒
sleep( )將進程設(shè)置為睡眠狀態(tài)斥废,請求調(diào)度椒楣,讓出 CPU,可以帶一個參數(shù)牡肉,指定最長睡眠時間捧灰,到時間進程會自動醒來。
wakeup( )喚醒一個正在睡眠的進程统锤,可以帶一個參數(shù)指出要喚醒的進程毛俏。
若將等待隊列與睡眠條件包裝在一起,就形成了一種新的同步機制 --> 條件變量