当前位置:  技术问答>linux和unix

很简单的PV原语问题

    来源: 互联网  发布时间:2016-10-21

    本文导语:   生产围棋的工人不小心把相等数量的黑子和白子混装载一个箱子里,现要用自动分拣系统把黑子和白子分开,该系统由两个并发执行的进程组成,功能如下:   (1)进程A专门拣黑子,进程B专门拣白子;   (2...

 生产围棋的工人不小心把相等数量的黑子和白子混装载一个箱子里,现要用自动分拣系统把黑子和白子分开,该系统由两个并发执行的进程组成,功能如下:
  (1)进程A专门拣黑子,进程B专门拣白子;
  (2)每个进程每次只拣一个子,当一个进程在拣子时不允许另一个进程去拣子;
  分析:
  第一步:确定进程间的关系。由功能(2)可知进程之间是互斥的关系。
  第二步:确定信号量及其值。由于进程A和进程B要互斥进入箱子去拣棋子,箱子是两个进程的公有资源,所以设置一个信号量s,其值取决于公有资源的数目,由于箱子只有一个,s的初值就设为1。
  实现:
  begin
  s:semaphore;
  s:=1;
   cobegin
    process A
    begin
    L1: P(s);
     拣黑子;
     V(s);
     goto L1;   //? 是不是每次执行完,就跳到L1,那怎么执行process B?
    end; 
    process B
    begin
    L2:P(s);
     拣白子;
     V(s);
     goto L2;
    end;
   coend;
  end;
问题1:看代码的注释。
问题2:V原语操作的动作是:
  (1)sem加1;
  (2)若相加结果大于零,则进程继续执行;
  (3)若相加结果小于或等于零,则从该信号的等待队列中唤醒一等待进程,然后再返回原进程继续执行或转进程调度。
他要先加1 ,怎么可能出现小于或等于零的情况?

|
问题1:我理解process A和process B是同时开始,并行执行的。cobegin和coend的前缀co-就有这个意思

问题2:别忘了P(s)的时候s要减1。如果A先P(s),s变成0,然后拣黑子,此时B也P(s),s就变成-1,然后A再V(s),s就是0了。
如果有多个进程比如A~E五个,A先P(s),然后BCDE都P(s),那么s就会变成-4,然后A结束操作再V(s)的时候就会出现小于0的情况了
若相加结果小于或等于零,就说明有其他进程做了P(s)操作之后在等待,所以就需要唤醒

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux源于原语
  • FIFO属于什么原语?
  • 操作系统P,V原语
  • “进程进入临界区时要执行开锁原语”这句话错在哪里?
  • 邮件原语:消息内容如何设定!telnet mail 25 subject:testrnto:mm@mm.comrnhello world!rn.rn报502 unimplemented (#5.5.1)


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3