4.信號量

整型信號量

  • 整型數

S<=0時,信號無效;測試

P(wait)原語code

V(singal)原語blog

等待原語:隊列

wait(S):
	while S<=0 do no-operation
		S:=S-1;

釋放原語:進程

singal(S):
	S:=S+1;
  • wait(s)和singal(s)是原子操做資源

  • 只要信號量S<=0就不斷測試,不知足讓權等待同步

記錄型信號量

  • 記錄型結構,包含兩個數據項:
type semaphore = record
		value:integer
		L:list of process
		end

  • S.value爲資源信號量,其初值表示某類資源的數目。

S.value>=0時,表示系統當中可用資源數目;it

S.value<0時,表示等待使用資源的進程個數。io

  • wait操做:申請一個單位資源
Procedure wait(S)
Var S:semaphore;
begin
	S.value:=S.value-1;
	If S.value<0 then block(s,L)//將S信號放進阻塞隊列L中
end
  • singal操做:釋放一個單位資源
Procedure singal(S):
Var S:semaphore;
begin
	S.value:=S.value+1;//S是信號量類型的
	If S.value <= 0 then wakeup(S,L)
end
//S.value>=0:表示系統中可用的資源數量
//S.value<0:其值表示已阻塞的進程數量
//S.value初值爲1時:只容許一個進程訪問臨界資源,是互斥信號量

AND型信號量(可解決記錄型信號量的死鎖問題)

基本思想:map

將進程在整個運行中須要的全部資源,一次性所有分配給進程,待進程使用完後一塊兒釋放。

  • 在wait中加入AND條件,又稱AND同步或同時wait操做,SWait
SWait(S1,S2,……,Sn)
	if S1 >=1 and Sn >= 1 then 
		for i:=1 to n do
		Si:= Si - 1;
		end for
	else
		當初次發現Si<1就把該進程放入等待隊列並將其程序計數器置於SWait操做的開始位置
	endif

釋放操做:

SSingal(S1,S2,……,Sn)
	for i:=1  to n do
		Si:=Si+1;
將全部等待Si的進程由等待隊列取出放入到就緒隊列
	end for;
相關文章
相關標籤/搜索