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