操作系统中PV操作之顾客理发师问题
?
PV操作:對(duì)信號(hào)量進(jìn)行相應(yīng)操作
S:信號(hào)量
P:請(qǐng)求操作,相當(dāng)于S=S-1;S>=0,進(jìn)程繼續(xù)進(jìn)行
V:釋放操作,相當(dāng)于S=S+1,S>0,進(jìn)程被喚醒
理發(fā)師問(wèn)題?
一個(gè)理發(fā)師,一把理發(fā)椅,n把等候理發(fā)的顧客椅子,如果沒(méi)有顧客則理發(fā)師便在理發(fā)椅上睡覺(jué) ,當(dāng)有一個(gè)顧客到達(dá)時(shí),首先看理發(fā)師在干什么,如果理發(fā)師在睡覺(jué),則喚醒理發(fā)師理發(fā),如果理發(fā)師正在理發(fā),則查看是否有空的顧客椅子可坐, ?如果有,坐下等待,如果沒(méi)有,則離開(kāi)。?定義信號(hào)量:wait=0:顧客信號(hào)量 ? barber=0:理發(fā)師信號(hào)量
? ? ? ? ? ? ? ? ? ?custNum:當(dāng)前顧客數(shù)量 ? mutex=1:互斥量
理發(fā)師操作:
Barber(){
while(1){
? ? ? ? P(wait); ? ?//喚醒等待的一位顧客
? ? ? ? P(mutex); ?//顧客被喚醒,準(zhǔn)備理發(fā),沒(méi)有顧客,則睡覺(jué)
? ? ? ? custNum--; ? ?//當(dāng)前店里顧客數(shù)減1
? ? ? ? ?V(barber); ? //有顧客來(lái)了,醒來(lái)理發(fā)
? ? ? ? V(mettux): ? //釋放互斥信號(hào)量
}
}
顧客操作:
Customer(){
while(1){
P(mutex); ? ?//顧客想要理發(fā)
if(custNum<N){ ? //店里人沒(méi)有滿
? ? ?custNum++;
? ? ?V(wait); ? ? //理發(fā)師睡覺(jué)的話,喚醒他理發(fā)
? ? ?V(mutex); ? ?//釋放互斥量,理發(fā)這一動(dòng)作成功
? ? ?P(baber); ? ?//理發(fā)師進(jìn)行理發(fā)操作
}
else
{
? ? ? ?V(metux); ? ?//釋放互斥量,打消進(jìn)店理發(fā)的舉動(dòng)
}
}
}
總結(jié)
以上是生活随笔為你收集整理的操作系统中PV操作之顾客理发师问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Redis Lua脚本实现原子性操作
- 下一篇: 工具——Java后端开发中用到的一些工具