1. 程式人生 > >用信號量進程同步與互斥

用信號量進程同步與互斥

三種 rac 銀行 () except exceptio mutex v操作 eat

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

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

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

  答:在兩個進程同時進行時,結果會不唯一,因為不同步。

    由於異常的中斷,導致判斷條件的重復錯誤,最後導致永遠等待。

2.哲學家吃面問題

3.讀寫文件問題

4.理發師問題

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

  答: Semaphore[] forks= new Semaphore[]{new Semaphore(1),new Semaphore(1),new Semaphore(1),new Semaphore(1),new Semaphore(1)};

        Semaphore limit = new Semaphore(4);
        for(int i=0;i<5;i++){
            final int index=i;
            new Thread(()->{
                while(true){
                    try {
                        limit.acquire();
                        forks[index].acquire(); //P(index)
                        forks[(index+1)%5].acquire();//P((index+1)%mod5)
                        System.out.println("第"+index+"個哲學家在通心粉");
                        forks[index].release();
                        forks[(index+1)%5].release();
                        limit.release();
                        System.out.println("第"+index+"個哲學家吃完了");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }

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

  答:semaphore mutex=A, customer_count=0:
  main()
  {  
  Cobegin
  Customeri()
  {
  p(mutex);
  取號碼,進入隊列;
  v(mutex);
  v(customer_count);
  }
  serversi()
  {
  while(A)
  {
  p(customer_count);
  p(mutex);
  從隊列中取下一個號碼;
  v(mutex);

  為該號碼持有者服務;
  }  
  end
  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.

  答:能。

8.九、在一個盒子裏,混裝了相等數量的黑棋子和白棋子,現要用自動分揀系統把黑棋子和白棋子分開,該系統由兩個並發執行的進程P1和P2組成,其中進程P1專門揀黑子,進程P2專門揀白子。規定兩個進程輪流揀子且每個進程每次只揀一個子。當一個進程在揀子時不允許另一個進程去揀子,並設P1先揀。請用P,V操作管理這兩個並發進程,使其能正確實現上述功能。

  答:var S1,S2:semaphore;

S1:=1;S2:=0;

cobegin

{

process P1

begin

repeat

P(S1);

揀白子

V(S2);

until false;

end

process P2

begin

repeat

P(S2);

揀黑子

V(S1);

until false;

end

}

coend.

用信號量進程同步與互斥