訊號量 實現程序互斥與同步
訊號量基本術語
現代計算機系統中,多個程序可以併發執行,程序間必然存在共享資源和相互合作的問題。
同步主要是使用者多個程序相互協作,共同完成任務,是程序間的直接制約問題;互斥則主要是為了多個程序分時使用有限的資源。
訊號量(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)
利用訊號量實現同步
此時可以把訊號想象成代表一個訊息。當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)—–>消費