1. 程式人生 > >訊號量 實現程序互斥與同步

訊號量 實現程序互斥與同步

  1. 訊號量基本術語

    現代計算機系統中,多個程序可以併發執行,程序間必然存在共享資源和相互合作的問題。

    同步主要是使用者多個程序相互協作,共同完成任務,是程序間的直接制約問題;互斥則主要是為了多個程序分時使用有限的資源。

    訊號量(semaphore)是1965年由荷蘭人Dijkstra提出的一種卓有成效的程序間同步及互斥工具。訊號量在作業系統中實現時一般作為一個整數變數,這種訊號量稱為整型訊號量。訊號量S的物理意義:

    S >= 0表示某資源的可用數;

    S<0 其絕對值表示阻塞佇列中等待該資源的程序數目;

訊號量的兩個操作方法是PV,P操作為S=S-1;表示申請一個資源,V操作為S=S+1;表示釋放一個資源。因為對整數的加減1操作是在一個指令完成的,而硬體能夠保證中斷只能發生在指令之間,所以PV操作不會被中斷打擾執行結果。

   P

  {

         S = S-1;

         if(s<0)

             Wait(S);  --------當前程序進入等待佇列等待

   }



   V

   {

         S=S+1;

         if(S<=0)

             Resume(S); ----------喚醒等待佇列中的一個程序

    }

2.利用訊號量實現互斥

 初始化訊號量mutex = 1; 當程序進入臨界區時執行P操作,退出臨界區時執行V操作。

   P(mutex)

     臨界區程式碼;(操作互斥資源)

  V(mutex)
  1. 利用訊號量實現同步

    此時可以把訊號想象成代表一個訊息。當S=0表示表示訊息未產生;當S>0則表示訊息已經產生。例如:

    (1)單緩衝區的生產者和消費者問題。

    生產者程序P1不斷地生產產品送入緩衝區,消費者程序P2不斷地從緩衝區中提取產品消費。為了實現P1與P2程序間的同步,需要設定一個訊號量S1,並且初始化為1,表示緩衝區為空,可以將產品放入緩衝區中;還需要設定另一個另一個訊號量S2,初始值為0,表示緩衝區沒有產品,可以提取消費。

P1:生產一個產品—>P(S1)測試緩衝區是否為空—–>產品送緩衝區—->V(S2)設定有產品—->重複

P2: P(S2)測試是否有產品—–>從緩衝區取出產品——->V(S1)設定緩衝區為空——->消費—>重複

 (2)多緩衝區同步問題

  設有一個生產者和一個消費者,緩衝區可以存放n件物品,生產者不斷地生產產品,消費者不斷地消費產品。

 設定3個訊號量,S, S1,S2。其中S是一個互斥訊號量初值為1,對緩衝區資源進行互斥控制,S1表示是否可以將物品放入緩衝區,初值為n,S2表示緩衝區中是否有物品,初值為0。同步過程如下:

P1:生產一個產品—–>P(S1)—>P(S)—>產品送緩衝區—>V(S)—->V(S2)

P2:P(S2)——>P(S)—>從緩衝區取出一個產品—–>V(S)—–>V(S1)—–>消費