《现代操作系统》读书笔记,关于“消费者此时在逻辑上并未睡眠,所以wakeup信号丢失”

原文:
现在回到竞争条件的问题。这里有可能会出现竞争条件,其原因是对count的访问未加限制。有可能出现以下情况:缓冲区为空,消费者刚刚读取count的值发现它为0。此时调度程序决定暂停消费者并启动运行生产者。生产者向缓冲区中加入一个数据项,count加1。现在count的值变成了1。它推断认为由于count刚才为0,所以消费者此时一定在睡眠,于是生产者调用wakeup来唤醒消费者。

但是,消费者此时在逻辑上并未睡眠,所以wakeup信号丢失。当消费者下次运行时,它将测试先前读到的count值,发现它为0,于是睡眠。生产者迟早会填满整个缓冲区,然后睡眠。这样一来,两个进程都将永远睡眠下去。

在这里“逻辑上”是指当消费者进程检测到count等于0时,在还没有运行sleep()时消费者进程时间片到期,消费者进程变成runnable状态,生产者这时候被调度运行,当count变为1时,生产者试图唤醒消费者,此时对于消费者来说唤醒是无效的,因为消费者根本没有运行到sleep(),,wakeup信号丢失,所以说在逻辑上并未睡眠。当时间片被转到消费者时,这时候消费者进程被调度,执行完sleep()后,消费者进程才真正进入逻辑上得睡眠。尽管count已经非零了,但是再也不会有唤醒信号了,它将永远沉睡。归根到底是因为这里对count的访问不是原子性的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值