用訊號量程序同步與互斥

2022-06-05 01:09:14 字數 3445 閱讀 9983

1.理解生產者和消費者問題

沒有引入訊號量時的生產者和消費者程序,什麼情況下會出現結果不唯一?什麼情況下會出現永遠等待?

出現結果不唯一:假如當前的產品數為8,如果生產者生產一件產品投入快取區,擬執行產品數加一操作;同時消費者取走一樣產品,擬執行產品數減一操作;假如兩者交替執行加一或減一操作,取決於其執行速度,產品數為9或7,但正確為8.

出現永遠等待:假如消費者讀取產品數為0時,排程程式暫停消費者程序,讓生產者程序執行,生產者加入乙個產品,將產品數加一,它便呼叫wakeup()函式來喚醒消費者;但是消費者未睡眠,則喚醒訊號丟失,當消費者下次執行時,因已檢測到產品數為0,於是去睡眠,當生產者將緩衝區填滿後也去睡眠,這就會造成永遠等待。

用訊號解決生產者和消費者的同步與互斥,要求能自己寫出來。

2.哲學家吃麵問題

semaphore fork[5];

for(int i=0; i<5;i++)

fork[i]=1;

cobegin

process philosopher_i( )

coend

4.理髮師問題

int waiting=0, chairs=n;

semaphore customers=0,barbers=0,mutex=1;

cobegin

process barbers() }

process customer_i() {

p(mutex);

if(waitingwaiting++;

v(customers);

v(mutex);

p(barbers):

get_haircut();

else

v(mutex);

coend

5.在一間酒吧裡有三個**愛好者佇列,第一隊的**愛好者只有隨身聽,第二隊只有**磁帶,第三隊只有電池。而要聽**就必須隨身聽、**磁帶和電池這三種物品俱全。酒吧老闆一次**這三種物品中的任意兩種。當一名**愛好者得到這三種物品並聽完一首樂曲後,酒吧老闆才能再一次**這三種物品中的任意兩種。於是第二名**愛好者得到這三種物品,並開始聽樂曲。全部買賣就這樣進行下去。試用p,v操作正確解決這一買賣。

semaphore muext=1;

cobegin

process boss(){

p(muext);

/*老闆任意**兩種*/

v(muext);

process musiclovers_i() {

while(ture){

p(muext);

listening();

v(muext);

coend

6.某銀行有人民幣儲蓄業務,由n個儲蓄員負責。每個顧客進入銀行後先取乙個號,並且等著叫號。當乙個儲蓄人員空閒下來,就叫下乙個號。請用p,v操作正確編寫儲蓄人員和顧客程序的程式。

semaphore customers=0,clerk=0,mutex=n;

int waiting=0;

cobegin

process clerk() {

while(ture){

p(customers);

p(mutex);

waiting--;

v(clerk);

v(mutex);

service();

process customer_i() {

p(mutex);

waiting++;

v(customers);

v(mutex);

p(clerk):

get_service();

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.

解答:不能

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 {

process p1

begin

repeat

p(s1);

揀黑子;

v(s2);

until false;

endprocess p2

begin

repeat

p(s2);

揀白子;

v(s1);

until false;

endcoend

用訊號量程序同步與互斥

1.理解生產者和消費者問題 沒有引入訊號量時的生產者和消費者程序,什麼情況下會出現結果不唯一?什麼情況下會出現永遠等待?用訊號解決生產者和消費者的同步與互斥,要求能自己寫出來。結果不唯一 假如當前的產品數為8,如果生產者生產一件產品投入快取區,擬執行產品數加一操作 同時消費者取走一樣產品,擬執行產品...

用訊號量程序同步與互斥

1.理解生產者和消費者問題 1 沒有引入訊號量時的生產者和消費者程序,什麼情況下會出現結果不唯一?什麼情況下會出現永遠等待?結果不唯一 假如當前的產品數為8,如果生產者生產一件產品投入快取區,擬執行產品數加一操作 同時消費者取走一樣產品,擬執行產品數減一操作 假如兩者交替執行加一或減一操作,取決於其...

程序同步與互斥 POSIX有名訊號量

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