用訊號量程序同步與互斥

2022-06-05 01:27:13 字數 3341 閱讀 4266

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 標準中,訊號量分兩種,一種是無名訊號量,一種是有名訊號量。無名訊號量一般用於執行緒間同步或互斥,而有名訊號量一般用於程序間同步或互斥。它們的區別和管道及命名管道的區別類似,無名訊號量則直接儲存在記憶體中,而有名訊號量要求建立乙個檔案。前面我們學習了無名訊號量的使用 詳情請看 無名訊號...