操作系统学习笔记--进程同步(哲学家进餐问题)

    哲学家进餐问题:有五个哲学家,她们的生活方式是交替地进行思考和进餐。哲学家们共用一张园桌,分别坐在周围五张椅子上。在圆桌上有五个碗和五支筷子,平时一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两支筷子时才能进餐。进程毕,放下筷子又继续思考。

    分析:筷子是临界资源,在一段时间内只允许一个哲学家使用。(有临界资源就存在互斥)。用一个信号量表示一支筷子,由这五个信号量构成信号量组。

var chopstick : array[0...4] of semaphore(信号量型) 所有信号量被初始化为1

 用记录型信号量解决哲学家进餐问题:

 第i个哲学家的活动描述为:

   repeat

    wait(chopstick[i]);

    wait(chopstick[i+1 mod 5]);

    ... eat ...

    signal(chopstick[i]);

    signal(chopstick[i+1 mod 5]);

    ... 

    think;

    until false;

    问题:假如五个哲学家同时饥饿而各自拿起左边的筷子,会使五个信号量均为0,当他们再试图拿起右边筷子时,都将无限期地等待。

    解决方式:(1)至多四个人同时拿左边的筷子,保证至少一个人可以进餐,最终释放筷子使更多的人进餐。(2)仅当哲学家的左右两支筷子均可用时,才允许他拿起筷子进餐。(3)规定奇数号哲学家先拿起其左边的筷子,再拿右边的筷子,偶数号哲学家则相反。即1、2号人竞争1号筷子,3、4号人竞争3号筷子,即五个人都先竞争奇数号筷子,获得后,再去竞争偶数号筷子,最后总会有某一个进程。

    用AND型信号量解决哲学家进餐问题:

    var chopstick : array[0...4] of semaphore := (1,1,1,1,1)

    (AND型是在执行wait语句时,要么全给资源,要么不给)

    repeat think;

    Swait(chopstick[(i+1) mod 5], chopstick[i]);//同时申请

    eat;

    Ssignal(chopstick[(i+1) mod 5], chopstick[i]);//同时释放,原语操作,不允许中断

    think;

    until false;

    

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值