同步和P-V操作:P-V操作的概念
信號燈的概念
信號燈是一種卓有成效的進程同步機制录粱。
1965年荷蘭學者Dijkstra(迪科斯徹)提出
信號燈用于進程同步的基本思想
進程在運行過程受信號燈狀態(tài)控制,并能改變信號燈狀態(tài)
- 進程受控制:信號燈的狀態(tài)可以阻塞或喚醒進程沟优。
- 改變信號燈:信號燈的狀態(tài)可以被進程改變举农。
信號燈機制
信號燈數(shù)據(jù)結(jié)構(gòu)
- 信號燈變量定義為一個二元矢量(S,q)。
- S:整數(shù),初值非負突颊。
- q:PCB隊列,初值為空集潘悼。
struct SEMAPHORE
{
int s; //整數(shù)律秃,初值為負
Pointer_PCB;//隊列:進程PCB指針,初值空集
}
信號燈操作
兩個操作
- P操作(函數(shù)或過程治唤,P(S,q))
- V操作 (函數(shù)或過程棒动,V(S,q))
P,V是荷蘭語:Passeren通過,Vrijgeren釋放
P操作的原理(P(S,q),P(S))
- S值減一宾添;
- 若差大于或等于零船惨,該進程繼續(xù);
- 若差小于零缕陕,則該進程阻塞并加入到對列q中粱锐,并轉(zhuǎn)調(diào)度函數(shù)
P(S,q)
{
S=S-1扛邑;
if(S<0)
{
Insert(Caller,q);
Block(Caller);
轉(zhuǎn)調(diào)度函數(shù)();
}
}
提示:P操作可能使進程調(diào)用處阻塞卜范。
提示2:S初值很重要!
V操作的原理
- S值加一
- 若和大于零鹿榜,該進程繼續(xù)海雪;
- 若和小于或等于零,該進程繼續(xù)同時從q中喚醒一個進程舱殿。
V(s,q)
{
S=S+1;
if(S<=0)
{
Remove(q,pid);//pid進程ID
Wakeup(pid);
}
}
提示:V操作可能會喚醒阻塞的進程