1.讀者與寫者問題(寫者優(yōu)先方式)
讀者優(yōu)先的關(guān)鍵:
? ????????若讀者先占有互斥信號量馍迄,只有最后一個讀者離開,計數(shù)降為0時才釋放信號量煤禽,導(dǎo)致寫者弱勢键兜。
寫者優(yōu)先同上述方法:
? ????????寫者先占有某信號后,直到最后一個寫者走完才釋放該信號映挂,讀者才能進(jìn)入泽篮。
????????????????增加一個互斥信號量S,讀者和寫者都爭搶該信號柑船;
????????????????對寫者也進(jìn)行計數(shù)咪辱,第1個寫者申請S,其他寫者不需要申請S椎组;最后一個寫者離開時才釋放信號量S.
????????????????一旦寫者先申請到了S油狂,則所有的讀者只能等待寫者都走完才可進(jìn)入共享讀。而多個寫者通過S后寸癌,仍要爭搶wmutex信號以完成互斥的寫入专筷。
用到的變量
????????讀者間起作用:
????????????????Readcount變量,rmutex信號量
????????寫者間起作用:
????????????????writecount變量蒸苇,mutex信號量
????????讀者與寫者間起作用:
????????????????wmutex
? ? ? ? ? ? ? ? S
2.黑白棋子問題
問題描述
? ????????兩個人下棋磷蛹,一方執(zhí)黑棋,一方執(zhí)白棋溪烤。要求雙方輪流下子味咳。給出兩種情況的解決辦法:
? ????????????????1)執(zhí)黑子一方先下
? ? ? ? ? ? ? ? ? 2)雙方都可以先下,誰先搶到棋盤誰先下檬嘀。然后開始輪流下子槽驶。
3.嗜睡的理發(fā)師問題
問題描述
? ????????一個理發(fā)店有N個沙發(fā),1個理發(fā)椅鸳兽;
????????理發(fā)師:
????????????????持續(xù)睡覺掂铐,理發(fā),收錢的動作
????????顧客:
????????????????若有沙發(fā)揍异,進(jìn)入等待全陨;否則離開。
????????????????理發(fā)椅空衷掷,一顧客放棄沙發(fā)辱姨,去喚醒它理發(fā);
????????????????理發(fā)后付費(fèi)戚嗅,付費(fèi)完畢離開理發(fā)椅雨涛,離店碗旅。
?共享變量count的使用需要互斥。
?注意if分支加入后P镜悉、V操作配對核對清楚
4.生產(chǎn)與銷售問題
問題描述
? ????????設(shè)一無限大倉庫。就1個門医瘫,不允許同時入庫侣肄,也不允許邊入庫邊出庫。
????????????1)兩個生產(chǎn)者A,B生產(chǎn)各自的產(chǎn)品入庫醇份;但要求滿足關(guān)系Sa-Sb在限定的[-n,m]差值范圍內(nèi)稼锅。
????????????2)一個銷售者取產(chǎn)品銷售,但對兩種產(chǎn)品的賣出進(jìn)度要把握在Ma-Mb也在[-n,m]范圍內(nèi)僚纷。
同步關(guān)系分析
????????互斥:三人在對倉庫的使用上必須互斥(mutex=1)
????????順序關(guān)系:
????????????????1)生產(chǎn)者AB之間:因為假設(shè)倉庫無限大矩距,不需考慮空的限制〔澜撸控制其能否生產(chǎn)的關(guān)鍵是再生產(chǎn)一個能否滿足Sa-Sb在限定的[-n,m]范圍內(nèi)锥债。
????????????????????????????A、B關(guān)心的都是各自的生產(chǎn)指標(biāo)數(shù)量痊臭,即A關(guān)心x=A-B這個變量的值哮肚,同樣B關(guān)心y=B-A。
????????????????????????????初值:初始若無產(chǎn)品广匙,A最多可生產(chǎn)m個允趟,B最多可生產(chǎn)n個。自己生產(chǎn)一個必然使對方可以多生產(chǎn)一個鸦致。
????????????????2)生產(chǎn)與消費(fèi)之間
????????????????????????????關(guān)心賣出的A潮剪、B間的差值
信號量機(jī)制的不足:
? ? ? ? 信號量的控制分布在多個進(jìn)程中
????????????????正確性分析困難;
????????????????分散的P分唾、V操作:易出錯抗碰,使用不當(dāng)可能導(dǎo)致死鎖。
????????????????修改绽乔、維護(hù)困難:易讀性差改含,任一修改都可能影響全局;測試期間發(fā)現(xiàn)錯誤困難迄汛,即使發(fā)現(xiàn)錯誤也不容易定位出錯位置捍壤。
管程(monitor)機(jī)制
????????1973年,Hoare和Hanson提出管程思想:將共享變量及對共享變量能夠進(jìn)行的所有操作集中在一個模塊中鞍爱。(把信號量及其操作原語“封裝”在一個對象內(nèi)部)
1.管程的組成
????????①一組局部變量
????????②對局部變量操作的一組過程
????????③對局部變量進(jìn)行初始化的語句鹃觉。(聯(lián)想面向?qū)ο笾械念悾?/p>
2.管程特點
????????????任何進(jìn)程只能通過調(diào)用管程提供的過程入口才能進(jìn)入管程訪問共享數(shù)據(jù);
????????????????????就如同使用臨界資源睹逃,就要先通過其信號量的申請盗扇。
????????????任何時刻祷肯,僅允許一個進(jìn)程在管程中執(zhí)行某個內(nèi)部過程。
管程如何實現(xiàn)同步疗隶?
????????對共享變量互斥操作:
????????????????管程的特點直接實現(xiàn)了該要求佑笋,進(jìn)程一次一個進(jìn)入管程調(diào)用內(nèi)部過程操作共享變量。
????????????????管程的互斥訪問完全由編譯程序在編譯時自動添上斑鼻,無須程序員關(guān)心蒋纬,能保證正確。
????????操作的同步控制:
????????????????靠條件變量的操作管理實現(xiàn)坚弱。
????????????????進(jìn)入管程但不能獲取資源操作的過程將阻塞蜀备,并在滿足條件時被喚醒執(zhí)行。
生產(chǎn)者-消費(fèi)者問題的管程解決方法
3.條件變量
????????(主要作用就是進(jìn)程同步的阻塞和喚醒控制)
????????局部于管程的變量有兩種:
????????????????普通變量
????????????????條件變量(用于控制進(jìn)程阻塞和喚醒)
????????????????????????類似信號量變量荒叶,但不取具體值碾阁;相當(dāng)于每個阻塞隊列的隊列指針。
????????????????????????對條件變量的操作需結(jié)合對普通變量的條件判斷些楣,從而控制進(jìn)程狀態(tài)脂凶。
關(guān)于條件變量的操作
????????x.wait將執(zhí)行進(jìn)程掛到x對應(yīng)的等待隊列上;
????????x.signal喚醒x相應(yīng)的等待隊列上的一個進(jìn)程愁茁。
????????????????signal操作艰猬,是重新啟動一個被阻塞的進(jìn)程,但如果沒有進(jìn)程被阻塞埋市,則不產(chǎn)生任何效果
????????????????而信號量機(jī)制中的signal操作冠桃,若沒有需要喚醒的進(jìn)程,必須要做的還有修改信號量變量的值道宅。
管程的優(yōu)點
????????保證進(jìn)程互斥地訪問共享變量食听,并方便地阻塞和喚醒進(jìn)程。管程可以以函數(shù)庫的形式實現(xiàn)污茵。相比之下樱报,管程比信號量好控制。
????????管程可增強(qiáng)模塊的獨(dú)立性:系統(tǒng)按資源管理的觀點分解成若干模塊泞当,用數(shù)據(jù)表示抽象系統(tǒng)資源迹蛤,使同步操作相對集中,從而增加了模塊的相對獨(dú)立性
????????引入管程可提高代碼的可讀性襟士,便于修改和維護(hù)盗飒,正確性易于保證:采用集中式同步機(jī)制。一個操作系統(tǒng)或并發(fā)程序由若干個這樣的模塊所構(gòu)成陋桂,一個模塊通常較短逆趣,模塊之間關(guān)系清晰。
管程的缺點
????????大多數(shù)常用的編程語言中沒有實現(xiàn)管程嗜历,如果某種語言本身不支持管程宣渗,那么加入管程是很困難的抖所。
????????雖然大多數(shù)編程語言也沒有實現(xiàn)信號量,但可將P痕囱、V操作作為一個獨(dú)立的子例程或操作系統(tǒng)的管理程序調(diào)用加入田轧。