本篇來介紹信號量與PV原語的一些知識,并介紹其在前趨圖上的應(yīng)用分析。本篇的知識屬于操作系統(tǒng)部分的通用知識,在嵌入式軟件開發(fā)中,同樣會用到這些知識。
1 信號量
信號量是最早出現(xiàn)的用來解決進程同步與互斥問題的機制(可以把信號量視為一個加鎖標志位,實現(xiàn)對臨界資源互斥的訪問)。
信號量是一個整數(shù):
- 當信號量S>=0時,代表可供并發(fā)使用的資源數(shù)量當信號量S<0時,代表已經(jīng)沒有可用資源,S的絕對值表示當前等待該資源的進程數(shù)
利用信號量可以實現(xiàn)進程的互斥與同步
2 PV原語
2.1 P原語(wait)
P原語(申請資源,相當于wait,阻塞進程)操作的動作是:
sem減1
-
- 若sem減1后仍>=0,則執(zhí)行P操作的進程繼續(xù)執(zhí)行
若sem減1后<0,則執(zhí)行P操作的進程被阻塞
- 后進入與該信號相對應(yīng)的隊列中,然后轉(zhuǎn)進程調(diào)度
2.2 V原語(signl)
V原語(釋放資源,相當于signal,激活進行)操作的動作是:
sem加1
-
- 若sem加1后>0,則執(zhí)行V操作繼續(xù)執(zhí)行若sem加1后仍<=0(表明有進程阻塞在該類資源上),則從該信號的
等待隊列中喚醒一等待進程
- ,然后再返回原進程繼續(xù)執(zhí)行或轉(zhuǎn)進程調(diào)度
注意:PV操作對于每一個進程來說,都只能進行一次,而且必須成對使用。在PV原語執(zhí)行期間不允許有中斷的發(fā)生。
2.3 P、V操作
PV原語的執(zhí)行順序:
- 執(zhí)行P操作,信號量減一然后進行對共享資源的訪問V操作,信號量加一
PV操作中關(guān)于信號量的計算:
某系統(tǒng)有n個進程,共享資源R,R是可用數(shù)為m,其中n>=m。若采用PV操作,則信號量S的取值范圍是多少?
分析:
- 信號量的最大值,即可用資源的數(shù)據(jù),即m信號量的最小值,即最多能阻塞的進程數(shù)量,然后取負數(shù),本例中,最大阻塞數(shù)為n-m所以,信號量S的取值范圍是 -(n-m)~m
3 信號量與PV操作的應(yīng)用
3.1 實現(xiàn)進程互斥
為使多個進程互斥的訪問某臨界資源(例如一臺打印機):
- 須為該資源設(shè)置一個互斥信號量mutex,并設(shè)其初值為1然后各進程訪問資源的臨界區(qū)CS置于wait(mutx)和signal(mutex)之間即可
semaphore mtuex = 1; //表示打印機(互斥/共享資源)
void process1() //進程1
{
//...
wait(mutx); //P操作,信號量-1
//使用打印機
signal(mutex); //V操作,信號量+1
//...
}
void process2() //進程2
{
//...
wait(mutx);//P操作,信號量-1
//使用打印機
signal(mutex);//V操作,信號量+1
//...
}
這里簡單分析一下
只有一臺打印機,所以信號量初值是1
wait(mutx),即P操作,信號量減1,例如:
-
-
- 當?shù)谝粋€進程使用打印機時,信號量減為0,沒有進程阻塞當?shù)诙€進程也使用打印機時,信號量再減1變?yōu)?1,小于0了,說明有進程阻塞(就是第二個進程阻塞)當?shù)谌齻€進程也使用打印機時,信號量再減1變?yōu)?2,也小于0了,說明有進程阻塞(就是第三個進程阻塞)
-
signal(mutex),即V操作,信號量加1,例如:
-
- 當?shù)谝粋€進程使用打印機完畢時,信號量加1變?yōu)?1,仍小于0,說明激活一個進程后,仍有進程阻塞(例如第二個進程可以使用打印機了,第三個進程仍在等待)當?shù)诙€進程使用打印機完畢時,信號量加1變?yōu)?,說明激活一個進程后,沒有進程阻塞(第二個進程可以使用打印機了)當?shù)谌齻€進程使用打印機完畢時,信號量加1變?yōu)?
3.2 實現(xiàn)前趨關(guān)系(前趨圖)
這里先簡單介紹下前趨圖:
前趨圖是為了描述一個程序的各部分間的依賴關(guān)系,或者是一個大的計算的各個子任務(wù)間的因果關(guān)系的圖示。
前趨圖中的每個結(jié)點可以表示一條語句、一個程序段或一個進程
結(jié)點間的有向邊表示兩個結(jié)點之間存在的偏序(Partial Order)或前趨關(guān)系
3.2.1 例子1
進程P1~P5的前趨圖如下所示,若用PV操作控制進程P1~P5并發(fā)執(zhí)行的過程,需要設(shè)置5個信號量S1~S5,且信號量的初值都是0。
根據(jù)以上描述,下圖中的a~e處分別該填什么:
分析,根據(jù)文字描述,對照圖中信息,可先將P(S1)和P(S3)在圖中標注出來,進而可推出信號量S1和S3以及V操作V(S1)和V(S3)。
然后假設(shè)P1到P3使用的信號量S3,P3到P5使用的信號量S4,P4到P5使用的信號量S5,即可推導(dǎo)出剩余的PV操作。
3.2.2 例子2
進程P1~P6的前趨圖如下所示,若用PV操作控制進程P1~P6進程同步與互斥的程序如下,則呈現(xiàn)中中的①~⑥處分別該填什么:
分析:根據(jù)程序中的描述,對照圖中信息,可先將程序中已表示的PV操作標注出來,并標注出①~⑥在圖中的位置。
然后假設(shè)P1到P2使用的信號量S1,P4到P6使用的信號量S7,P5到P6使用的信號量S8,即可推導(dǎo)出剩余的PV操作
4 總結(jié)
本篇介紹了信號量與PV原語的基礎(chǔ)知識點,并介紹了PV操作的一些應(yīng)用,實現(xiàn)進程互斥和實現(xiàn)前趨關(guān)系,前趨關(guān)系中使用前趨圖來實例分析PV操作影響信號量變化的具體運行過程。