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

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

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

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

生产者进程和消费者进程的交替执行会导致进程永远等待,造成系统死锁。

 

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

semaphore mutex=1,s1=0,s2=0,s3=0;

cobegin

    fan1(){

        s1=1;

       P(s2);

       P(s3);

      if(s1&&s2&&s3){

        V(mutex);
        V(s1);
        V(s2);
        V(s3);
          }

    }

 fan2(){

      s2=1;

       P(s1);

       P(s3);

      if(s1&&s2&&s3){

          V(mutex);
           V(s1);
          V(s2);
           V(s3);}

  }

 fan3(){

       s3=1;

       P(s1);

       P(s2);

      if(s1&&s2&&s3){

          V(mutex);
        V(s1);
        V(s2);
        V(s3);}

   }

}

Coend

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

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

parbegin

var x:integer; var s:semaphore:=1;

process P1                                   process P2

       var y,z:integer ;                             var ,tu:integer ;

begin                                           begin

      P(s);                                           P(s);

      x:=1;                                         x:=0;

      y:=0;                                         t:=0;

        if x>=1 then y:=y+1;                   if x<=1 then t:=t+2

      V(s);                                            V(s);

         z:=y;                                           u:=t;

end                                                end

parend

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

semaphore S1,S2;
S1=1;S2=0;
cobegin
      process P1(){
            begin
            repeat
            P(S1);
            拣黑子
            V(S2);
            until false;
           end
        }
      process P2(){
           begin
           repeat
           P(S2);
           拣白子
           V(S1);
           until false;
           end
       }
coend.

posted on 2019-05-06 10:44  baijjjy  阅读(518)  评论(0)    收藏  举报