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