信號量機制


信號量和P、V操作

*信號量:是一種特殊的數據結構。

功能:表示資源的實體。例如:設mutex是一個信號量,它有兩部分,分別是:mutex.value (數值)     mutex.L(指針)

特殊之處:

  **每個信號量與一個隊列關聯

  **其值只能通過初始化和P、V操作來訪問

*信號量的類型

  **公用信號量:用於進程間的互斥,初值通常為1

  mutex.value=1;表示資源空閑,可供使用

        =0;表示資源已被占用,無其他等待進程

        =-n;表示資源已被占用,還有n個進程因等待資源而阻塞

  **私有信號量:用於進程間的同步,初值通常為0或n

 

P、V操作(均是原語):

 

P操作:請求分配一個單位資源

P(S):   //S為信號量

{

  S=S-1;

  if(S<0)

  {

  調用進程被阻塞

  進入S的等待隊列

  }

}

 

V操作:釋放一個單位資源

V(S):  //S為信號量

{

  S=S+1;

  if(S<=0)

  {

  從S的等待隊列中喚醒一個進程

  使其進入就緒狀態

  }

}

信號量及P、V操作的應用

進程的互斥:

 

 

 

 進程的同步:

利用信號量機制解決進程間的同步問題,這里以下圖所示的計算進程c和打印進程P通過緩沖區Buffer傳送數據的同步問題為例說明

 

 

 

C和P進程算法如下:

C:begin

     repeat

  Compute  next  nember;

  add to Buffer;

  until  false

end

P:begin

  repeat

  take from  Buffer;

  print  last  number;

  until  false

end

 

C和P兩進程並發執行,必須在執行序列上遵循以下規則,才能避免錯誤。

  只有當C進程把數據送入Buffer后,P進程才能從Buffer中取出數據來打印,否則P進程只能等待。

  只有當P進程從Buffer中取走數據后,C進程才能將新計算的數據再存入Buffer,否則C進程也只能等待。 

為了實現進程同步,需采用同步信號量。為了滿足第一條同步規則,設置一個同步信號量full,它代表的資源是緩沖器滿,它的初值為0.這個資源是P進程所擁有,P進程可以申請該資源,對它施加P操作,如條件滿足P進程可從Buffer中取數。而P進程的合作進程C對full信號量施加V操作,即它可釋放該資源。當C進程將數據存入Buffer后,即可釋放該資源供P進程再使用。

同樣為了滿足第二條同步規則,設置另一個同步信號量empty,它代表的資源是緩沖器空,它的初值為1.緩沖器空這個資源是進程C所擁有。它可以申請該資源,對它施加P操作。而它的合作進程P對empty信號量施加V操作。

實現C和P兩進程同步的類PASCAL程序:

var: empty ,full:semaphore:=1,0;

begin

  parbegin

   c:begin

  repeat

   Compute  next  number;

   P(empty);

   add to buffer;

   V(full);

   until false

  end

P:begin

  repeat

   P(full)

    Take from  Buffer

  V(empty)

   Print  last  number

  until  false

 end

 parend

end


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM