操作系统-进程同步与互斥易混点
解惑1:
為使多個進程能互斥的訪問某臨界資源,只須為該資源設置
?? 一個互斥信號量 mutex,初值為 1(代表臨界資源只有一個)
mutex初值為1.取值范圍為[-1,0,1]
當mutex=1時,表示兩個進程皆未進入需要互斥訪問的臨界區;
當mutex=0時,表示有一個進程進入臨界區運行,另一個必須等待,掛入阻塞隊列;
當mutex=-1時,表示有一個進程正在臨界區運行,而另一個進程因等待而阻塞在信號量隊列中,需要被當前已在臨界區運行的進程在退出時喚醒。
mutex為0和為1的區別是:為0的時候等待的進程沒有申請該資源,為-1的時候申請了,即進行了P操作,所以阻塞了。
解惑2:
信號量的初值表示系統中資源的數目。
解惑3:
empty代表空閑緩沖區的數量;full代表產品的數量。
根據進程同步的前V后P。
緩沖區沒滿,生產者才可以生產
緩沖區沒空,消費者才可消費。設置同步信號量:full=0,empty=N。
從而畫出下面的圖:
?
?消費者消費產品,非空閑緩沖區個數減一,所以針對full是P操作??臻e緩沖區加一,所以針對empty是V操作。
生產者生產產品,使用一個空閑緩沖區,所以空閑緩沖區減一,所以針對empty是P操作,但是非空閑緩沖區個數加一,所以針對full是V操作。
那么,為什么生產者消費者問題,為什么不能用一個信號量實現同步?
解釋一:
如果緩沖區滿,生產者是不能生產的,所以生產者進程受到消費者進程的制約;
如果緩沖區空,消費者是不能消費的,所以消費者進程受到生產者進程的制約
所以 需要兩個同步信號量
解釋二:
首先,假設只有一個同步信號量empty=5,也就是緩沖區有5個空位;
生產者每次生產就申請一個空位,即p(empty)。
假設5次生產之后,滿了,臨界區滿了=生產者不生產了,現在生產者被阻塞,cpu切換到消費者;
消費者在每次消費成功后,執行v(buffer),但是在消費前并沒有受到任何制約!這時候的效果就是,消費者可以無限消費,然后empty的值會無限增加,消費者已經消費了剛才生產的5個產品之后都還可以繼續消費。
或者假設現在有另一個同步信號量full=0,也就是,緩沖區有0個產品,但是不知道緩沖區有多大的限制?,F在每次生產都在生產之后執行v(full),也就是full++,然而full可以一直增加,因為沒有上限,也就是消費者被制約但是生產者沒被制約。
2個信號量,一個限制生產者,一個限制消費者;1個信號量無法同事限制他們2個。
解惑4
實現寫優先代碼:
?
當順序為:讀者1-寫者1-讀者2時:
讀者進程在讀文件時,發生進程調度,寫者進程執行,此時,寫者進程阻塞在P(rw)中,當再有讀者進程2執行時,會阻塞到P(W)中,此時,讀者進程釋放rw后,寫者進程最先被喚醒,然后執行,實現了先來先服務。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的操作系统-进程同步与互斥易混点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL安装之没有配置向导
- 下一篇: 练习ddt-file_data时,报错U