生产者和消费者问题中的唤醒丢失(操作系统)

简介: 生产者和消费者问题中的唤醒丢失(操作系统)

生产者和消费者问题中的唤醒丢失(操作系统)


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

————

代码如下:

#define N 100
int count = 0;
void producer(void)
{
 int item;
 while(TRUE)
 {
  item = produce_item();
  if(count == N)     //如果缓冲区满就休眠
  sleep();
  insert_item(item);
  count = count + 1;    //缓冲区数据项计数加1
  if(count == 1)
  wakeup(consumer);
 }
}
void consumer(void)
{
 int item;
 while(TRUE)
 {
  if(count == 0)    //如果缓冲区空就休眠
   sleep();
  item = remove_item();
  count = count - 1;   //缓冲区数据项计数减1
  if(count == N - 1)
   wakeup(producer);
  consume_item(item);
 }
}

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

在这里“逻辑上”是指

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

相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
相关文章
操作系统 生产者 - 消费者问题
操作系统 生产者 - 消费者问题
374 0
操作系统 生产者 - 消费者问题
|
12月前
|
Linux API 调度
实验 同步机制之生产者和消费者问题【操作系统】
实验 同步机制之生产者和消费者问题【操作系统】
176 0
|
Java
经典 生产者-消费者线程【操作系统】
经典 生产者-消费者线程【操作系统】
57 0
2.6操作系统(生产者消费问题 多生产者—消费者问题 吸烟者问题)
1.生产者消费问题 能否改变相邻P、V操作的顺序? 2.多生产者—消费者问题 如何实现? 可不可以不用互斥信号量? 如果盘子(缓冲区)容量为2 知识回顾与重要考点 3.吸烟者问题 如何实现
2.6操作系统(生产者消费问题 多生产者—消费者问题 吸烟者问题)
|
1月前
|
安全 Linux 网络安全
部署07--远程连接Linux系统,利用FinalShell可以远程连接到我们的操作系统上
部署07--远程连接Linux系统,利用FinalShell可以远程连接到我们的操作系统上
|
1月前
|
Linux 虚拟化 数据安全/隐私保护
部署05-VMwareWorkstation中安装CentOS7 Linux操作系统, VMware部署CentOS系统第一步,下载Linux系统,/不要忘, CentOS -7-x86_64-DVD
部署05-VMwareWorkstation中安装CentOS7 Linux操作系统, VMware部署CentOS系统第一步,下载Linux系统,/不要忘, CentOS -7-x86_64-DVD
|
6天前
|
编解码 安全 Linux
基于arm64架构国产操作系统|Linux下的RTMP|RTSP低延时直播播放器开发探究
这段内容讲述了国产操作系统背景下,大牛直播SDK针对国产操作系统与Linux平台发布的RTMP/RTSP直播播放SDK。此SDK支持arm64架构,基于X协议输出视频,采用PulseAudio和Alsa Lib处理音频,具备实时静音、快照、缓冲时间设定等功能,并支持H.265编码格式。此外,提供了示例代码展示如何实现多实例播放器的创建与管理,包括窗口布局调整、事件监听、视频分辨率变化和实时快照回调等关键功能。这一技术实现有助于提高直播服务的稳定性和响应速度,适应国产操作系统在各行业中的应用需求。
|
1月前
|
Linux 测试技术 数据安全/隐私保护
阿里云Linux os copilot 运维助手初体验
阿里云Linux os copilot 初体验
356 1
阿里云Linux os copilot 运维助手初体验
|
1月前
|
弹性计算 运维 自然语言处理
阿里云OS Copilot测评:重塑Linux运维与开发体验的智能革命
阿里云OS Copilot巧妙地将大语言模型的自然语言处理能力与操作系统团队的深厚经验相结合,支持自然语言问答、辅助命令执行等功能,为Linux用户带来了前所未有的智能运维与开发体验。
|
1月前
|
存储 缓存 安全
【Linux】冯诺依曼体系结构与操作系统及其进程
【Linux】冯诺依曼体系结构与操作系统及其进程
132 1

热门文章

最新文章