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