




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
3.3信號量與PV操作同步與同步機制記錄型信號量與PV操作用記錄型信號量實現(xiàn)互斥記錄型信號量解決生產(chǎn)者-消費者問題記錄型信號量解決讀者-寫者問題記錄型信號量解決理發(fā)師問題3.3.1同步和同步機制著名的生產(chǎn)者--消費者問題是計算機操作系統(tǒng)中并發(fā)進程內(nèi)在關(guān)系的一種抽象,是典型的進程同步問題。在操作系統(tǒng)中,生產(chǎn)者進程可以是計算進程、發(fā)送進程;而消費者進程可以是打印進程、接收進程等等。解決好生產(chǎn)者--消費者問題就解決好了一類并發(fā)進程的同步問題。生產(chǎn)者--消費者問題表述有界緩沖問題有n個生產(chǎn)者和m個消費者,連
接在一個有k個單位緩沖區(qū)的有界緩沖上。其中,pi和cj都是并發(fā)進程,只要緩沖區(qū)未滿,生產(chǎn)者pi生產(chǎn)的產(chǎn)品就可投入緩沖區(qū);只要緩沖區(qū)不空,消費者進程cj就可從緩沖區(qū)取走并消耗產(chǎn)品。生產(chǎn)者-消費者問題算法描述(1)var
k:integer;nextp,nextc:
item;buffer:array[0..k-1]
of
item;in,out:integer:=0;coumter:integer:=0;生產(chǎn)者-消費者問題算法描述(2)process
producer/*
將一個產(chǎn)品放入緩沖區(qū)*//*指針推進*//*緩沖內(nèi)產(chǎn)品數(shù)加1*/beginwhile(TRUE)
/*無限循環(huán)*/produce
an
item
in
nextp;/*生產(chǎn)一個產(chǎn)品*/if(counter==k)sleep();/*
緩沖滿時,生產(chǎn)者睡眠*/buffer[in]:=nextp;in:=(in+1)
mod
k;counter:=counter+1;
if(counter==1)wakeup(consumer);/*
緩沖空了,加進一件產(chǎn)品并喚醒消費者*/end生產(chǎn)者-消費者問題算法描述(3)process
consumer/*取一個產(chǎn)品到nextc*//*指針推進*//*
取走一個產(chǎn)品,計數(shù)減1*/beginwhile(TRUE)
/*無限循環(huán)*/if(counter==0)sleep();/*
緩沖區(qū)空消費者睡眠*/nextc:=buffer[out];out:=(out+1)
mod
k;counter:=counter-1;
if(counter==k-1)wakeup(producer);/*
緩沖滿了,取走一件產(chǎn)品并喚醒生產(chǎn)者*/consume
thr
item
in
nextc;/*消耗產(chǎn)品*/end生產(chǎn)者-消費者問題的算法描述(4)生產(chǎn)者和消費者進程對counter的交替執(zhí)行會使其結(jié)果不唯一生產(chǎn)者和消費者進程的交替執(zhí)行會導(dǎo)致進程永遠等待記錄型信號量與PV操作(1)
前節(jié)種種方法解決臨界區(qū)調(diào)度問題的缺點:
1)對不能進入臨界區(qū)的進程,采用忙式等待測試法,浪費CPU時間。2)將測試能否進入臨界區(qū)的責(zé)任推給各個競爭的進程會削弱系統(tǒng)的可靠性,加重了用戶編程負擔(dān)。1965年E.W.Dijkstra提出了新的同步工具--信號量和P、V操作。記錄型信號量與PV操作(2)信號量:一種軟件資源原語:內(nèi)核中執(zhí)行時不可被中斷的過程P操作原語和V操作原語一個進程在某一特殊點上被迫停止執(zhí)行直到接收到一個對應(yīng)的特殊變量值,這種特殊變量就是信號量(semaphore),復(fù)雜的進程合作需求都可以通過適當(dāng)?shù)男盘柦Y(jié)構(gòu)得到滿足。記錄型信號量與PV操作(3)操作系統(tǒng)中,信號量表示物理資源的實體,它是一個與隊列有關(guān)的整型變量。實現(xiàn)時,信號量是一種記錄型數(shù)據(jù)結(jié)構(gòu),有兩個分量:一個是信號量的值,另一
個是信號量隊列的隊列指針。信號量的值(-2)信號量隊列指針信號量分類信號量按其用途分為公用信號量:私有信號量:信號量按其取值分為二元信號量:一般信號量:整型信號量設(shè)s為一個整形量,除初始化外,僅能通過P、V操作訪問,P和V操作原語定義:P(s):while
s≤0
do
null
operations:=s-1;V(s):
s:=s+1;記錄型信號量(1)設(shè)s為一個記錄型數(shù)據(jù)結(jié)構(gòu),一個分量為整形量value,另一個為信號量隊列queue,P和V操作原語定義:
P(s);將信號量s減去l,若結(jié)果小于
0,則調(diào)用P(s)的進程被置成等待信號量s的狀態(tài)。
V(s):將信號量s加1,若結(jié)果不大于0,則釋放一個等待信號量s的進程。記錄型信號量(2)type
semaphore
=
recordvalue:integer;queue:
list
of
process;Endprocedure
P(var
s:semaphore);begins
:=
s
–
1;if
s
<
0
then
W(s);/*把信號量減去1
*//*若信號量小于0,則調(diào)用P(s)的進程被置成等待信號量s的狀態(tài)*/end;procedure
V(var
s:semaphore);begins
:=
s
+
1;/*把信號量加1
*/if
s<=0
then
R(s);
/*若信號量小于等于0,則釋放一個等待信號量s的進程*/end;記錄型信號量(3)推論1:若信號量s為正值,則該值等于在封鎖進程之前對信號量s可施行的P操作數(shù)、亦等于s所代表的實際還可以使用的物理資源數(shù)推論2:若信號量s為負值,則其絕對值等于登記排列在該信號量s隊列之中等待的進程個數(shù)、亦即恰好等于對信號量s實施P操作而被封鎖起來并進入信號量s隊列的進程數(shù)推論3:通常,P操作意味著請求一個資源,
V操作意味著釋放一個資源。在一定條件下,
P操作代表掛起進程操作,而V操作代表喚醒被掛起進程的操作二元信號量(1)設(shè)s為一個記錄型數(shù)據(jù)結(jié)構(gòu),一個分量為value,它僅能取值0和1,另一個分量為信號量隊列queue,把二元信號量上的P、V操作記為BP和BV,BP和BV操作原語的定義如下:二元信號量(2)type
binary
semaphore=record???value(0,1);queue:
list
of
processend;procedure
BP(vars:semaphore);
procedureBV(var
s:semaphore);beginif
s.queue
is
empty;beginif
s.value=1;??then
s.value=0;else
beginthen
s.value=1;else
begin?W(s.queue);R(s.queue);?end;end;endend3.3.3記錄型信號量解決進程互斥問題s
:
semaphore;s
:=
1;cobegin……process
Pibegin……P(s);臨界區(qū);
V(s);……end;……coend;記錄型信號量和PV操作解決機票問題(1)Var
A
:
ARRAY[1..m]
OF
integer;mutex
:
semaphore;mutex:=
1;cobeginprocess
Pivar
Xi:integer;beginL1:按旅客定票要求找到A[j];P(mutex)Xi
:=
A[j];if
Xi>=1then
beginXi:=Xi-1;
A[j]:=Xi;V(mutex);輸出一張票;end;else
beginV(mutex);輸出票已售完;end;goto
L1;end;??記錄型信號量和PV操作解決機票問題(2)Var
A
:
ARRAY[1..m]
OF
integer;s
:
ARRAY[1..m]
OF
semaphore;
s[j]
:=
1;cobeginprocess
Pivar
Xi:integer;beginL1:按旅客定票要求找到A[j];P(s[j])Xi
:=
A[j];if
Xi>=1then
beginXi:=Xi-1;
A[j]:=Xi;V(s[j]);輸出一張票;end;else
beginV(s[j]);輸出票已售完;end;goto
L1;end;coend;?哲學(xué)家吃通心面問題(1)有五個哲學(xué)家圍坐在一圓桌旁,桌中央有一盤通心面,每人面前有一只空盤于,每兩人之間放一把叉子。每個哲學(xué)家思考、饑餓、然后吃通心面。為了吃面,每個哲學(xué)家必須獲得兩把叉子,且每人只能直接從自己左邊或右邊去取叉子哲學(xué)家吃通心面問題(2)哲學(xué)家吃通心面問題(3)var
forki
:array[0..4]
of
semaphore;forki
:=
1;cobegin//
i=0,1,2,3,4,process
PibeginL1:思考;P(fork[i]);P(fork[(i+1)mod
5]);吃通心面;V(fork[i]);V(fork[(i+1)mod
5]);goto
L1;end;coend;有若干種辦法可避免這類死鎖上述解法可能出現(xiàn)永遠等待,有若干種辦法可避免死鎖:至多允許四個哲學(xué)家同時吃;奇數(shù)號先取左手邊的叉子,偶數(shù)號先 取右手邊的叉子;每個哲學(xué)家取到手邊的兩把叉子才吃, 否則一把叉子也不取。哲學(xué)家吃通心面問題的—種正確解var
forki
:array[0..4]
of
semaphore;forki
:=
1;cobegin/*
i=0,1,2,3
*/processPibeginL1:思考;P(fork[i]);/*i=4,P(fork[0])*/P(fork[i+1]
mod5)
/*i=4,P(fork[4])*/吃通心面;V(fork[i]);V(fork([i+1]mod
5);goto
L1;end;coend;生產(chǎn)者消費者問題①一個生產(chǎn)者、一個消費者共享一個緩沖區(qū)②一個生產(chǎn)者、一個消費者共享多個緩沖區(qū)③多個生產(chǎn)者、多個消費者共享多個緩沖區(qū)④多個生產(chǎn)者、多個消費者共享一個緩沖區(qū)⑤多個生產(chǎn)者、一個消費者共享多個緩沖區(qū)⑥一個生產(chǎn)者、多個消費者共享多個緩沖區(qū)一個生產(chǎn)者、一個消費者共享一個緩沖區(qū)的解/*可以使用的空緩沖區(qū)數(shù)*//*緩沖區(qū)內(nèi)可以使用的產(chǎn)品數(shù)*//*緩沖區(qū)內(nèi)允許放入一件產(chǎn)品*//*緩沖區(qū)內(nèi)沒有產(chǎn)品*/Produce
a
product;P(empty);B
:=
product;V(full);Goto
L1;process
consumerbeginL2:P(full);Product:=
B;;V(empty);Consume
a
product;Goto
L2;var
B
:
integer;empty:semaphore;full:semaphore;empty
:=
1;full
:=
0;cobeginProcess
producerbeginL1:?????end;end;coend多個生產(chǎn)者、多個消費者、共享多個緩沖區(qū)的解/*可以使用的空緩沖區(qū)數(shù)*//*緩沖區(qū)內(nèi)可以使用的產(chǎn)品數(shù)*//*放入/取出緩沖區(qū)指針*/L1:produce
a
product;P(empty);P(mutex);B[in]
:=
product;in:=(in+1)
mod
k;V(mutex);V(full);Goto
L1;process
consumer_jbeginL2:P(full);P(mutex);Product:=
B[out];out:=(out+1)
mod
k;V(mutex);V(empty);Consume
a
product;Goto
L2;end;
end;var
B
:
array[0..k-1]
of
item;empty:semaphore:=k;full:semaphore:=0;mutex:semaphore:=1;in
,
out:integer:=
0;cobeginprocess
producer_iBegin?????????coend?蘋果桔子問題桌上有一只盤子,每次只能放入一只水果;爸爸專向盤子中放蘋果(apple),媽媽專向盤子中放桔于(orange),一個兒子專等吃盤子中的桔子,一個女兒專等吃盤子里的蘋果記錄型信號量解決蘋果桔子問題plate
:
integer;sp:semaphore;sg1:semaphore;sg2:semaphore;sp
:=
1;Sg1,
:=
0;sg2
:=
0;cobeginprocess
fatherbeginL1:削一個蘋果;P(sp);把蘋果放入plate;V(sg2);goto
L1;end;process
motherbeginend;/*盤子里可以放幾個水果*//*盤子里有桔子*//*盤子里有蘋果*//*盤子里允許放一個水果*//*盤子里沒有桔子*//*盤子里沒有蘋果*/process
sonbeginL3:P(sg1);從plate中取桔子;V(sp);吃桔子;goto
L3;end;process
daughterbeginL4:P(sg2);L2:剝一個桔子;從plate中取蘋果;P(sp);V(sp);把桔子放入plate;吃蘋果;V(sg1);goto
L4;goto
L2;end;coend讀者寫者問題有兩組并發(fā)進程:讀者和寫者,共享一個文件F,要求:允許多個讀者同時執(zhí)行讀操作任一寫者在完成寫操作之前不允許其它讀者或?qū)懻吖ぷ鲗懻邎?zhí)行寫操作前,應(yīng)讓已有的寫者和讀者全部退出記錄型信號量解決讀者寫者問題(1)var
rc
:
integer:=0;W,R:
semaphore;Rc:=0;/*讀進程計數(shù)*/W
:=
1;R
:=
1;記錄型信號量解決讀者寫者問題(2)procedure
write;beginP(W);寫文件;
V(W);end;procedure
read;beginP(R);rc
:=
rc
+
1;if
rc=1
then
P(W);V(R);讀文件;P(R);rc
:=
rc
-
1;if
rc
=
0
then
V(W);V(R);end;理發(fā)師問題理發(fā)店理有一位理發(fā)師、一把理發(fā)椅和n把供等候理發(fā)的顧客坐的椅子如果沒有顧客,理發(fā)師便在理發(fā)椅上睡覺一個顧客到來時,它必須叫醒理
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廢礦石廢礦產(chǎn)品綜合利用項目經(jīng)濟效益和社會效益分析報告
- 精密導(dǎo)體新材料產(chǎn)業(yè)園項目技術(shù)方案
- 礦熱爐尾氣發(fā)電項目技術(shù)方案
- 鈑金件生產(chǎn)基地項目技術(shù)方案
- 2025年山東省建設(shè)工程專業(yè)技術(shù)資格考試(建筑學(xué))測試題及答案
- 2025年“5.29”有獎健康知識競賽問答題庫及答案
- 青桐鳴大聯(lián)考2025-2026學(xué)年高一上學(xué)期10月月考地理試題(含答案)
- 項目進度管理與工期縮短措施
- 電纜選型與載流量專業(yè)手冊
- 2025年經(jīng)濟師考試備考 經(jīng)濟基礎(chǔ)知識歷2025年真題沖刺押題試卷
- 腦腫瘤的癥狀和早期診斷方法
- 中級注冊安全工程師-其他安全歷年真題
- 小學(xué)生自己修改作文能力的培養(yǎng)研究課題結(jié)題報告.文檔
- CREO基礎(chǔ)培訓(xùn)教程
- GA/T 2012-2023竊照專用器材鑒定技術(shù)規(guī)范
- 詩化小說示范課
- (17)-第三節(jié) 反抗外國武裝侵略的斗爭
- 04質(zhì)量獎(現(xiàn)場)評審報告
- GB/T 9728-2007化學(xué)試劑硫酸鹽測定通用方法
- 全身式安全帶定期檢查表
- 《中藥商品學(xué)》考試復(fù)習(xí)題庫(含答案)
評論
0/150
提交評論