1. 程式人生 > >第二章 2.3 訊號量機制

第二章 2.3 訊號量機制

整形訊號量:

  • 訊號量定義為一個整型量;
  • 根據初始情況賦相應的值;
  • 僅能通過兩個原子操作來訪問
		 P 操作:
		 wait(S):	 
             While S<=0 do no-op; 
             S:=S-1;
         V 操作:
         signal(S):	  
             S:=S+1;

在這裡插入圖片描述

整型訊號量符合“有限等待”原則,但不符合“讓權等待”原則

記錄性訊號量:

  • 不僅要有值的處理,還有佇列的處理。
  • 此時形成記錄型資料結構,包括兩部分:
    - 整型變數value(代表資源數目)
    - 程序連結串列L(連結所有等待程序):
  • 程式碼描述:
        type  Semaphore=record
             value:integer;
	         L:list  of  PCB;
	    end;
  • 操作:S.Value,S.L

P、V 操作:

P操作wait():
    S.value = S.value - 1;
    if  S.value < 0  then  block(S,L)

V操作signal():
    S.value = S.value + 1;
    if  S.value <= 0 then wakeup(
S,L)
  • 定義訊號量semaphore代表可用資源實體的數量,又叫訊號燈
    - 當≥0,代表可供併發程序使用的資源實體數
    - 當<0,表示正在等待使用該資源的程序數
  • 建立一個訊號量必須經過說明,包括:
    - 訊號量所代表的意義
    - 賦初值
    - 建立相應的資料結構,以便指向等待使用臨界區的程序。
  • 除初值外,訊號量的值僅能由標準原子操作P、V操作來改變

訊號量的基本應用:

  • 實現程序互斥
  • 實現程序間的前趨關係( 有序 )

互斥訊號量注意點:

  • 互斥訊號量mutex初值為1;
  • 每個程序中將臨界區程式碼置於P(mutex)和V(mutex)原語之間
  • 必須成對使用P和V原語(在同一程序中),不能次序錯誤、重複或遺漏:
    - 遺漏P原語則不能保證互斥訪問
    - 遺漏V原語則不能在使用臨界資源之後將其釋放(給其他等待的程序)

控制同步順序的注意點:

  • 訊號量值為0的點是限制的關鍵所在;
  • 成對使用P和V原語(在有先後關係的兩個程序中),不能次序錯誤、重複或遺漏,否則同步順序出錯

AND 型訊號量

  • 出現原因:一些應用往往需要兩個或多個共享資源,而不是前述的一個資源。程序同時要求的共享資源越多,發生死鎖可能性越大
    在這裡插入圖片描述
Swait(S1, S2,, Sn)
    if (S1 >=1 andand Sn>=1 )then
        for i:=1 to n do
           Si:= Si -1 ;
        endfor
    else
       將程序阻塞在第一個不能滿足資源訊號量的佇列中。
   endif

Ssignal(S1, S2,, Sn)
    for i:=1 to n do
       Si:= Si +1 ;
       喚醒所以與si相關的阻塞程序
    endfor  

訊號量集:

優點:

  • 每次只能獲得或釋放一個單位的資源,低效;
  • 某些時候資源分配有下限的限制;
  • 修改:在大於可分配設定的下界值t前提下,每次可分配d個
訊號量題目做題一般方法:
  • 分析問題,找出同步、互斥關係
  • 根據資源設定訊號量變數
  • 寫出程式碼過程,並注意P、V操作的位置
  • 檢查程式碼,模擬機器執行,體驗訊號量的變化和程式執行過程是否正確