由三個程序get,copy和put以及兩個緩衝區buffer1和buffer2完成一項輸入/輸出操作。程序get的功能是把一張卡片上的資訊從讀卡機上讀進buffer1;程序copy的功能是把buffer1中的資訊複製到buffer2;程序put的功能是取出buffer2中的資訊並從印表機上列印輸出。試用p、v操作完成這三個程序間的盡可能併發正確執行的關係(用程式或框圖表示),並指明訊號量的作用和初值。
分析:可設定6個訊號量mutex1,mutex2,empty1,empty2,full1,full2。
mutex1和mutex2是互斥訊號量,初值為1,分別用於對buffer1和buffer2的互斥訪問;
empty1和empty2為同步訊號量,初值為1,分別表示buffer1和buffer2是否空閒,1表示空閒,0表示不空閒;
full1和full2為同步訊號量,初值為0,分別表示buffer1和buffer2中是否有可取用的資訊,1表示有可取用的資訊,0表示無可取用的資訊。
semaphore mutex1, mutex2, empty1, empty2, full1, full2 ;
mutex1=mutex2=1;
//互斥訊號量
empty1=empty2=1;
//生產者程序的同步訊號量
full1=full2=0;
//消費者程序的同步訊號量
parbegin
process get()
//讀程序(生產者程序)}
process copy()
//複製程序(既是消費者又是生產者程序)}
process put()
}parend
若乙隻盤子一次只能放乙個水果,a只往盤中放蘋果,b只往盤中放梨子,c只從盤中取蘋果,d只從盤中取梨子。試用:(1) 訊號量和p、v操作;(2) 管程,寫出同步演算法。
採用p、v操作的同步演算法如下:
semaphore sab=1;
//a、b的資源訊號量,同時又是它們的互斥訊號量
semaphore sc=0;
//c的資源訊號量(用於與a同步)
semaphore sd=0;
//d的資源訊號量(用於與b同步)
begin
parbegin
process a:
//程序a的演算法描述
} process c:
} process b:
//程序b的演算法描述
} process d:
} parend
end
採用管程的同步演算法如下:
首先定義管程mpc,該管程可描述如下:
type mpc=monitor
var flag: integer;
//flag=0:盤中無水果;=1盤中有蘋果;=2盤中有梨子
empty: condition;
//用於a或b等待空盤子
w: array[
1..2
] of condition //w[1]用於等待蘋果,w[2]用於等待梨子
procedure entry put
(integer k)
begin
if flag>
0 then empty.wait;
//生產者a或b程序阻塞
flag=k;
放一k號水果入盤中;
//設1號水果為蘋果,2號水果為梨子
if w[k]
.queue then full.signal;
//若有等待k號水果者,則喚醒之
endprocedure entry get
(integer k)
begin
if flag.wait;
//消費者c或d程序阻塞
從盤中取k號水果;
flag :=0
;if empty.queue then empty.signal;
//若等待佇列非空,則喚醒隊首的乙個生產者程序
endbegin
flag :=0
;//初始化內部資料
enda、b、c、d四個程序的同步演算法可描述如下:
parbegin
process a
begin
任取乙個蘋果;
mpc.
put(1)
; end
process b
begin
任取乙個梨子;
mpc.
put(2)
; end
process c
begin
mpc.
get(1)
; 吃蘋果;
endprocess d
begin
mpc.
get(2)
; 吃梨子;
endparend
設自行車生產車間有兩個貨架,貨架a可以存放8個車架,貨架b可以存放20個車輪;又設有4個工人,他們的活動是重複勞動,分別為:工人1 加工乙個車架放入貨架a中;工人2、3分別加工車輪放入貨架b中(每人每次放入1個車輪);工人4從貨架a中取乙個車架,再從貨架b中取兩個車輪,組裝成一輛自行車。試用pv操作實現四個工人的合作。
分析:訊號量aempty表示貨架a的空位數,其初值為8;訊號量afull表示貨架a上存放的車架數,其初值為0;訊號量bempty表示貨架b的空位數,其初值為20;訊號量bfull表示貨架b上存放的車輪數,其初值為0;訊號量mutex用於互斥(初值為1)
begin
semaphore aempty,bempty,afull,bfull,mutex;
aempty :=
8;bempty :=
20;afull :=
0;bfull :=
0;mutex :=
1;parbegin
worker1:begin
l1:生產1個車架;
p(aempty); //測試貨架a是否有空位置
p(mutex); //互斥使用貨架a
車架放到貨架a;
v(afull); //貨架a上的車架數增1,必要時喚醒等待的程序
v(mutex);
goto l1;
endworker2、3:begin
l2:生產1個車輪;
p(bempty); //測試貨架b是否有空位置
p(mutex); //互斥使用貨架b
車輪放到貨架b;
v(bfull); //貨架b上的車輪數增1,必要時喚醒等待的程序
v(mutex);
goto l2;
endworker4:begin
l3:p(afull); //測試貨架a上是否有車架
p(bfull);p(bfull); //測試貨架b上是否有2個車輪
p(mutex);
取1個車架;取2個車輪;
v(aempty); //貨架a空位置增1
v(bempty);v(bempty);//貨架b空位置增2
v(mutex);
組裝成一輛自行車;
goto l3;
endparend
end
程序同步問題
有讀者和寫者兩組併發程序,共享乙個檔案,當兩個或以上的讀程序同時訪問共享資料時不會產生 但若某個寫程序和其他程序 讀程序或寫程序 同時訪問共享資料時則可能導致資料不一致的錯誤。因此要求 允許多個讀者可以同時對檔案執行讀操作 只允許乙個寫者往檔案中寫資訊 任一寫者在完成寫操作之前不允許其他讀者或寫者工...
經典程序同步問題
文章出處 http heikediguo2005.blog.163.com blog static 2211971200910254235533 依據訊號量與程序的關係,我們可把程序中使訊號量分成私用訊號量和公用訊號量。私有訊號量是指只與制約程序和被制約程序有關的訊號量 公用訊號量是指與一組併發程序...
執行緒 程序同步問題
計算機網路課程實驗要做乙個c s模型的檔案傳遞程式。本來socket程式設計我還是比較熟悉的,因為以前用vc mfc編過乙個網路遊戲 網路五子棋,並通過設定nat與新加坡的同學對戰了一把。這次的程式本來更簡單,但是老師要用純windows api來寫,不准用其他的類庫,於是工作的重點就轉移到了怎樣構...