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