信號量和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