当前位置:
文档之家› 操作系统PV操作经典例题与答案
操作系统PV操作经典例题与答案
离开;
P(mutex)
custNum--;
V(mutex)
V(wait)
}
理发师进程:
While{
P(mutex)
If(custNum ==0){
V(mutex)
P(Barber)
}else{
V(mutex)
理发
}
}
V(SM);
i = (i+1) %k;
};
Receive:
j =0;//标记取产品的缓存区位置
SM=0;//信号量,标记初始没有消息
ReadCount=0;//读进程计数器
Mutex =1;//读进程互斥信号量
SW=0; //信号量,读进程在此信号量等待
while (true) {
P(SM);
从Buffer[j]取消息;
V(W);
Else if(rw>0)
V(R)
rw--
V(mutex);
};
3.理发师睡觉问题
理发店里有一位理发师,一把理发椅和N把供等候理发的顾客坐的椅子
如果没有顾客,则理发师便在理发椅上睡觉。当一个顾客到来时,他必须先唤醒理发师
如果顾客到来时理发师正在理发,则如果有空椅子,可坐下来等;否则离开
Wait =0;表示等待顾客资源;
V(R)
rw--
}
V(mutex);
读
P(mutex);
rc--;
if (rc==0){
If(wc>0)V(w)
}
V(mutex);
};
写者:
while (true) {
P(mutex);
wc++;
if((wc >1)||(rc>0)){
P(W)
}
V(mutex);
写
P(mutex);
Wc--;
if(wc>0)
3)写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者)
rc=0,//正在读者计数器
wc,//写计数器
rw, //读等计数器
R //等待读信号量
W //等待写信号量
读者:
while (true) {
P(mutex);
if (wc>0){
rw++
P (R);
}
rc++;
If(rw>0&&wc=0){
Barber=1;表示可以理发
custNum关键资源,表示当前顾客数量
顾客进程:
Coming//顾客来到
P(mutex)
If(custNum>0){
If(custNum<=N){
V(mutex)
P(wait);
}else{
V(mutex)
离开;
}
}else{
V(mutex)
V(Barber);
理发;
ReadCount++
If(ReadCount<n){
V(SM);
P(SW)
}else{
V(SB);
j = (j+1) %k;
for(intg=1; g<ReadCount;g++)
V(SW);
ReadCount=0;
}
};2.第二类读者写ຫໍສະໝຸດ 问题:写者优先条件:
1)多个读者可以同时进行读
2)写者必须互斥(只允许一个写者写,也不能读者写者同时进行)
1.推广例子中的消息缓冲问题。
消息缓冲区为k个,有1个发送进程,n个接收进程,每个接收进程对发送来的消息都必须取一次若有m个发送进程呢?
Send:
SB=k; //信号量,标记当前空余缓冲区资源。
i = 0;//标记存放消息的缓冲区位置
while (true) {
P(SB);
往Buffer [i]放消息;