程序同步問題總結

2021-10-10 03:07:54 字數 3615 閱讀 1788

由三個程序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來寫,不准用其他的類庫,於是工作的重點就轉移到了怎樣構...