第二章 2.3 訊號量機制
阿新 • • 發佈:2018-12-09
整形訊號量:
- 訊號量定義為一個整型量;
- 根據初始情況賦相應的值;
- 僅能通過兩個原子操作來訪問
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 and … and 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操作的位置
- 檢查程式碼,模擬機器執行,體驗訊號量的變化和程式執行過程是否正確