操作系统笔记:书Page188第50题

参考文献:[1]费翔林, 骆斌. 操作系统教程(第五版) [M]. 北京:高等教育出版社,2014. 

题目:某寺庙有小和尚和老和尚若干,水缸一只,由小和尚提水入缸供老和尚饮用。水缸可容水10桶,水取自同一口水井中。水井径窄,每次仅能容纳一只水桶取水,水桶总数为三个。每次放入、取出的水量仅为1桶,而且不能同时进行。规定取水、提水都需要用桶。试用一种同步工具写出小和尚和老和尚放入水、取水的活动过程。




解:


  1. 题意解读:

    • 首先要清楚这是一个大方向上是同步,同步中又有互斥的问题。
    • 同步:所谓同步,是指散布在不同进程之间的若干程序片断,它们的运行必须严格按照规定的、某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。(书上P129页第2段一个意思)显然,小和尚提水给老和尚喝,肯定得小和尚提水的进程先完成,老和尚取水的进程才能进行(规定的、某种先后次序来运行)。而同步资源当然就是缸里的10桶水了,所以设 semaphore empty=10,full=0;(empty对应小和尚要提多少桶才能加满缸,full对应老和尚可以取多少桶水)。
    • 互斥:所谓互斥,是指散布在不同进程之间的若干程序片断,当某个进程运行其中一个程序片段时,其它进程就不能运行它们之中的任一程序片段,只能等到该进程运行完这个程序片段后才可以运行。(书上P128页第5段一个意思)在这里有三个互斥资源:桶、井、缸。设 semaphore S桶=3,S缸=1,S井=1;(S桶:有3只桶能用;S缸:有一只缸能用;S井:有一口井能用)。
  2. PV操作模拟过程伪代码:

semaphore empty=10,full=0; //同步资源
semaphore S井=S缸=1,S桶=3; //互斥资源
cobegin:
    Process_老和尚:
    {
      L1:P(full); //缸内的水减1桶
          P(S桶); //拿桶
          P(S缸); //占缸
          取水;
          V(S缸); //还缸
          V(S桶); //还桶
          V(empty); //缸还能盛下的水加1桶
          goto L1;
    }

    Process_小和尚:
    {
      L2:P(empty); //缸内能盛下的水减1桶
          P(S桶); //拿桶
          P(S井); //占井
          P(S缸); //占缸
          倒水;
          V(S井); //还井
          V(S缸); //还缸
          V(S桶); //还桶
          V(full); //缸还内的水加1桶
          goto L2;
    }
coend;

  • 总结:

    1. PV操作用于互斥时,位于同一进程内。(看上面的S桶、S缸、S井)
    2. PV操作用于同步时,交错出现于两个合作的进程内。(empty、full)
      1. 多个P操作次序不可颠倒,否则可能产生死锁。(比如Process_老和尚中,S桶和S缸换一下,当老和尚把缸占了,小和尚把3只桶全拿去打水了,就会出现死锁)
      2. 多个V操作次序可任意。
      3. 如果既有同步,又有互斥信号,则同步在前,互斥在后。(看上面P(full)/P(empty)都是第一个,比如P(empty)在后面,那么当缸里不能再盛水时,小和尚也要去打水)

    • 0
      点赞
    • 1
      收藏
      觉得还不错? 一键收藏
    • 0
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值