pv操作同步過程
對信號燈狀態進行改變,P調用一次-1,V調用一次+1。
P操作:
p(s)是一個原語操作,p操作執行 s– ,若s爲負數,調用p(s)的進程被阻塞,放到等待隊列q中。
p(s)
{
s- -;
if (s < 0)
{
保留調用進程的CPU現場;
將進程的pcb插入到s的等待隊列;
把進程變爲“等待狀態”;
轉到進程調度;
}
}
V操作
v(s)剛好與p(s)操作相反,v操作執行 s++ ,若s爲大於0,繼續執行;s <=0,從信號燈等待隊列移出一個進程,解除等待狀態,返回本程序繼續執行。
v(s)
{
s++;
if (s <= 0)
{
移出s等待隊列首元素;
將該進程的pcb插入就緒隊列;
設置該進程爲“就緒狀態”;
}
進程互斥的實現
上鎖原語順利通過可進入臨界區CSa或者CSb。
1、使用上鎖原語與開鎖原語解決併發進程互斥問題:
main()
{
int w = 0; //互斥鎖
cobegin
ppa();
ppb();
coend
}
使用信號燈實現進程互斥:
用與互斥信號燈初值mutex = 1 ;表示該資源未被佔用。任何想要進入臨界區的進程,必須先進行p操作(mutex爲1時才能通過),訪問臨界資源完成後再v操作。。。
mutex =1 : 表示沒有進程進入臨界區
mutex =0 : 表示有一個進程進入臨界區,前方沒有其他進程。
mutex =-1 :表示一個進程已經進入,另一個進程的等待進入。
main()
{
int mutex = 0; //互斥信號燈
cobegin
Pa();
Pb();
coend
進程同步實現:
生產中消費者問題:
這裏寫圖片描述
消費者:消耗系統資源。
生產者:釋放系統資源。
緩衝區未空:消費者就可以一直取資源。
緩衝區未滿:生產者就可以一直生產資源。
因此,同步關係保證了上面兩點的實現。
方法:用兩個信號燈,分別說明緩衝區數目(full和empty)
main()
{
int w = 0; //滿緩衝區的數目
int empty = n; //空緩衝區的數目
int mutex = 1; //對有界緩衝區進行操作的互斥信號燈
cobegin
P1();P2()……Pm();
C1();C2()……Cn();
coend
}
producer() consumer()
{ {
while(生產未完成) while(還要繼續消費)
{ {
. p(full);
. p(mutex);
. 從有界緩衝區取產品;
生產一個產品; v(mutex);
p(empty); v(empty);
p(mutex); .
送一個產品到有界緩衝區; .
v(mutex); .
v(full); 消費一個產品;
}
} }
}