用信号量进程同步与互斥

1.理解生产者和消费者问题

没有引入信号量时的生产者和消费者进程,什么情况下会出现结果不唯一?什么情况下会出现永远等待?

答:(1)生产者进程和消费者进程对counter的交替操作会使其结果不唯一。

(2).生产者进程和消费者进程对counter的交替执行会导致进程永远等待,导致系统死锁。

用信号解决生产者和消费者的同步与互斥,要求能自己写出来。

int b;
semaphore empty;//可用的空缓冲区数
semaphore full;//缓冲区内可用的产品数
empty =1;//缓冲区内允许放一件产品
full=0;//缓冲区内没有产品
cobegin
process prouducer(){//生产者
while(true){
proudce();
p(empty);
append to B;
V(full);
}}
process consumerr(){//消费者
while(true){
p(full);
take from  B;
V(empty);
conmuse();
}}

 

2.哲学家吃面问题

 

semaphore fork[5];
for(int i-0;i<5;i++)
fore[i]=1;
cobegin
process philosopher_i(){
while(true){
thnk();
P(fork[i]);
P(fork[(i+1)%5]);
eat();
V(fork[i]);
V(fork[(i+1)%5]);

 

3.读写文件问题

int readcount=0;
semaphore writeblock,mutex;
 writeblock=1;mutex=1;
cobegin
process reader_i(){
p(mutex);
readcount++;
if(readcount==1)
p(writeblock);
v(mutex);
//读文件
p(mutex);
readcount--if(readcount==0)
    v(writeblock);
v(mutex);
}
process write_j(){
p(writeblock);
//写文件
v(writeblock);
}

 

4.理发师问题

int waiting=0;
int CHAIRS=N;
semaphore customers,barbers,mutex;
customers=0;barbers=0;mutex=0;
cobegin
precess barbers(){
while(true){
P(customers);
P(mutex);
waiting--;
V(barbers);
V(mutex);
cythair();
}
}
precess customer_i(){
while(true){
P(mutex);
if(waiting<CHAIRD){
waiting++;
V(customers);
V(mutex);
P(barbers);
}
else
V()mutex):
}
coend
int waiting=0;
int CHAIRS=N;
semaphore customers,barbers,mutex;
customers=0;barbers=0;mutex=0;
cobegin
precess barbers(){
while(true){
P(customers);
P(mutex);
waiting--;
V(barbers);
V(mutex);
cythair();
}
}
precess customer_i(){
while(true){
P(mutex);
if(waiting<CHAIRD){
waiting++;
V(customers);
V(mutex);
P(barbers);
}
else
V()mutex):
}
coend

 

5.在一间酒吧里有三个音乐爱好者队列,第一队的音乐爱好者只有随身听,第二队只有音乐磁带,第三队只有电池。而要听音乐就必须随身听、音乐磁带和电池这三种物品俱全。酒吧老板一次出售这三种物品中的任意两种。当一名音乐爱好者得到这三种物品并听完一首乐曲后,酒吧老板才能再一次出售这三种物品中的任意两种。于是第二名音乐爱好者得到这三种物品,并开始听乐曲。全部买卖就这样进行下去。试用P,v操作正确解决这一买卖。

semaphore muext=1;

cobegin

process boss(){

             P(muext);

            /*老板任意出售两种*/

             V(muext);

}

 

process musiclovers_i() {

               while(ture){

                P(muext);

                 listening();

                V(muext);

}  }

coend

6.某银行有人民币储蓄业务,由n个储蓄员负责。每个顾客进入银行后先取一个号,并且等着叫号。当一个储蓄人员空闲下来,就叫下一个号。请用P,V操作正确编写储蓄人员和顾客进程的程序。

7.下面是两个并发执行的进程。它们能正确运行吗?若不能请举例说明,并改正之。(5分)

parbegin

    var X:integer;

    process  P1                    process  P2

    var y,z:integer:            var t,u:integer;

     begin                          begin

       x:=1;                           x:=0:

       y:=0:                           t=0;   

       if  x≥l  then y:=y十1;    if  x≤l  then  t:=t+2;

            z:=y;                           u:=t;

     end;                         end;

parend.

8.九、在一个盒子里,混装了相等数量的黑棋子和白棋子,现要用自动分拣系统把黑棋子和白棋子分开,该系统由两个并发执行的进程P1和P2组成,其中进程P1专门拣黑子,进程P2专门拣白子。规定两个进程轮流拣子且每个进程每次只拣一个子。当一个进程在拣子时不允许另一个进程去拣子,并设P1先拣。请用P,V操作管理这两个并发进程,使其能正确实现上述功能。

posted @ 2019-05-05 15:20  谢锐朗  阅读(275)  评论(0编辑  收藏  举报