1.理解生產者和消費者問題
(1)沒有引入訊號量時的生產者和消費者程序,什麼情況下會出現結果不唯一?什麼情況下會出現永遠等待?
結果不唯一:假如當前的產品數為8,如果生產者生產一件產品投入快取區,擬執行產品數加一操作;同時消費者取走一樣產品,擬執行產品數減一操作;假如兩者交替執行加一或減一操作,取決於其執行速度,產品數為9或7,但正確為8.
永遠等待:假如消費者讀取產品數為0時,排程程式暫停消費者程序,讓生產者程序執行,生產者加入乙個產品,將產品數加一,它便呼叫wakeup()函式來喚醒消費者;但是消費者未睡眠,則喚醒訊號丟失,當消費者下次執行時,因已檢測到產品數為0,於是去睡眠,當生產者將緩衝區填滿後也去睡眠,這就會造成永遠等待。
(2)用訊號解決生產者和消費者的同步與互斥,要求能自己寫出來。
int k;
typedef anyitem item;
item buffer[k];
int i=0,out=0,counter=0;
process producer(void);
if(counter==k)
sleep(producer);
buffer[in]=nextp;
in=(in+10)%k;
counter++;
if(counter==1)
wakeup9consumer);} }
processconsumer(void) ; } }
2.哲學家吃麵問題
semaphore fork[5];
for(int i=0; i<5;i++)
fork[i]=1;
cobegin
process philosopher_i( )
}coend
3.讀寫檔案問題
int readcount=0;
semaphore writeblock=1,mutex=1;
cobegin
process reader_i()
coend
4.理髮師問題
int waiting=0, chairs=n;
semaphore customers=0,barbers=0,mutex=1;
cobegin
process barbers() }
process customer_i()
else
v(mutex);
}coend
5.在一間酒吧裡有三個**愛好者佇列,第一隊的**愛好者只有隨身聽,第二隊只有**磁帶,第三隊只有電池。而要聽**就必須隨身聽、**磁帶和電池這三種物品俱全。酒吧老闆一次**這三種物品中的任意兩種。當一名**愛好者得到這三種物品並聽完一首樂曲後,酒吧老闆才能再一次**這三種物品中的任意兩種。於是第二名**愛好者得到這三種物品,並開始聽樂曲。全部買賣就這樣進行下去。試用p,v操作正確解決這一買賣。
semaphore mutex=1,p=1, p1=0, p2=0, p3=0;
process p() }
process p1() }
process p2() }
process p3() }
6.某銀行有人民幣儲蓄業務,由n個儲蓄員負責。每個顧客進入銀行後先取乙個號,並且等著叫號。當乙個儲蓄人員空閒下來,就叫下乙個號。請用p,v操作正確編寫儲蓄人員和顧客程序的程式。
semaphore customers=0,clerk=0,mutex=n;
int waiting=0;
cobegin
process clerk() }
process customer_i()
coend
7.下面是兩個併發執行的程序。它們能正確執行嗎?若不能請舉例說明,並改正之。(5分)
parbegin
var x:integer;
process p1 process p2
var y,z:integer: var t,u:integer;
begin begin
x:=1; x:=0:
y:=0: t=0;
if x≥l then y:=y十1; if x≤l then t:=t+2;
z:=y; u:=t;
end; end;
parend.
不能正確執行,因為會導致結果的不確定性,例如:若先執行完p1再執行p2結果是:x=0y=1z=1t=2u=2。 若先執行p1到x:=1;然後乙個中斷去執行完p2再乙個中斷回來執行完p1結果是:x=0y=0z=0t=2u=2。
改正:parbegin
var x:integer; var s:semaphore:=1;
process p1 process p2
var y,z:integer ; var ,tu:integer ;
begin begin
p(s); p(s);
x:=1; x:=0;
y:=0; t:=0;
if x>=1 then y:=y+1; if x<=1 then t:=t+2
v(s); v(s);
z:=y; u:=t;
end end
parend
8.九、在乙個盒子裡,混裝了相等數量的黑棋子和白棋子,現要用自動分揀系統把黑棋子和白棋子分開,該系統由兩個併發執行的程序p1和p2組成,其中程序p1專門揀黑子,程序p2專門揀白子。規定兩個程序輪流揀子且每個程序每次只揀乙個子。當乙個程序在揀子時不允許另乙個程序去揀子,並設p1先揀。請用p,v操作管理這兩個併發程序,使其能正確實現上述功能。
semaphore s1=1,s2=0;
cobegin
coend
用訊號量程序同步與互斥
1.理解生產者和消費者問題 沒有引入訊號量時的生產者和消費者程序,什麼情況下會出現結果不唯一?什麼情況下會出現永遠等待?用訊號解決生產者和消費者的同步與互斥,要求能自己寫出來。結果不唯一 假如當前的產品數為8,如果生產者生產一件產品投入快取區,擬執行產品數加一操作 同時消費者取走一樣產品,擬執行產品...
用訊號量程序同步與互斥
1.理解生產者和消費者問題 沒有引入訊號量時的生產者和消費者程序,什麼情況下會出現結果不唯一?什麼情況下會出現永遠等待?出現結果不唯一 假如當前的產品數為8,如果生產者生產一件產品投入快取區,擬執行產品數加一操作 同時消費者取走一樣產品,擬執行產品數減一操作 假如兩者交替執行加一或減一操作,取決於其...
程序同步與互斥 POSIX有名訊號量
在 posix 標準中,訊號量分兩種,一種是無名訊號量,一種是有名訊號量。無名訊號量一般用於執行緒間同步或互斥,而有名訊號量一般用於程序間同步或互斥。它們的區別和管道及命名管道的區別類似,無名訊號量則直接儲存在記憶體中,而有名訊號量要求建立乙個檔案。前面我們學習了無名訊號量的使用 詳情請看 無名訊號...