操作系统 生产者 - 消费者问题

简介: 操作系统 生产者 - 消费者问题

生产者 - 消费者问题

问题描述

生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。

记录型信号量

思路

  • 假定在生产者和消费者之间的公用缓冲池中具有n个缓冲区,这时可利用互斥信号量mutex实现诸进程对缓冲池的互斥使用;利用信号量empty和full分别表示缓冲池中空缓冲区和满缓冲区的数量。又假定这些生产者和消费者相互等效,只要缓冲池未满,生产者便可将消息送入缓冲池;只要缓冲池未空,消费者便可从缓冲池中取走一个消息。
  • 使用互斥信号量mutex,实现对公用缓冲池的互斥使用
  • 使用信号量empty和full代替原来的count计数,同时实现线程的同步机制
  • 利用数组buffer模拟具有n个缓冲区的缓冲池,指针in,out表示该放入缓冲区的位置,于该取走缓冲区的位置,使用 ( in / out = (in / out + 1) % n)实现循环缓冲区

image.png

代码实现

int in = 0, out = 0;  //位置记录
item buffer[n];  //缓冲池
semaphore mutex = 1;  //互斥信号量
semaphore empty = n, full = 0;  //同步信号量
void producer(){
  do{
    produce an item nextp;  //产生商品nextp
    ……
    wait(empty);  //wait的顺序不能变换
    wait(mutex);
    buffer[in] = nextp;
    in = (in + 1) % n;
    signal(mutex);
    signal(full);
  }while(TRUE);
}
void consumer(){
  do{
    wait(full);  //wait的顺序不能变换
    wait(mutex);
    nextc = buffer[out];
    out = (out + 1) % n;
    signal(mutex);
    signal(empty);
    consumer the item in nextc;
    ……
  }while(TRUE);
}
void main(){
  cobegin;  //同时开始
  producer();
  consumer();
  coend;
}

注意点

  • 互斥型信号量mutex的wait()与signal()操作一定要成对出现
  • 资源信号量empty与full的wait()与signal操作虽然不在同一进程中,但是为了实现同步,同时避免死锁一定也要对应出现
  • 一个进程中的wait()操作的次序不能颠倒,一定是先对资源信号量再对互斥信号量使用wait()

AND信号量

思路

  • 因为同时需要生产者与消费者都同时需要两个信号量的控制,故引入AND信号量
  • 使用Swait(empty,mutex)代替wait(empty),wait(mutex)
  • 使用Ssignal(mutex, full)代替signal(mutex),signal(full)
  • 同理Swait(full,mutex),Ssignal(mutex, empty)

代码实现

int in = 0, out = 0;  //位置记录
item buffer[n];  //缓冲池
semaphore mutex = 1;  //互斥信号量
semaphore empty = n, full = 0;  //同步信号量
void producer(){
  do{
    produce an item nextp;
    ……
    Swait(empty, mutex);
    buffer[in] = nextp;
    in = (in + 1) % n;
    Ssignal(mutex, full);
  }while(TRUE);
}
void consumer(){
  do{
    Swait(full, mutex);
    nextc = buffer[out];
    out = (out + 1) % n;
    Ssignal(mutex, empty);
    consumer the item in nextc;
    ……
  }while(TRUE);
}
void main(){
  cobegin;  //同时开始
  producer();
  consumer();
  coend;
}


目录
相关文章
|
Linux API 调度
实验 同步机制之生产者和消费者问题【操作系统】
实验 同步机制之生产者和消费者问题【操作系统】
185 0
|
Java
经典 生产者-消费者线程【操作系统】
经典 生产者-消费者线程【操作系统】
59 0
操作系统2020年8月生产消费者问题解析思路
操作系统2020年8月生产消费者问题解析思路
61 0
|
调度
生产者和消费者问题中的唤醒丢失(操作系统)
生产者和消费者问题中的唤醒丢失(操作系统)
143 0
2.6操作系统(生产者消费问题 多生产者—消费者问题 吸烟者问题)
1.生产者消费问题 能否改变相邻P、V操作的顺序? 2.多生产者—消费者问题 如何实现? 可不可以不用互斥信号量? 如果盘子(缓冲区)容量为2 知识回顾与重要考点 3.吸烟者问题 如何实现
2.6操作系统(生产者消费问题 多生产者—消费者问题 吸烟者问题)
|
2月前
|
安全 Linux 网络安全
部署07--远程连接Linux系统,利用FinalShell可以远程连接到我们的操作系统上
部署07--远程连接Linux系统,利用FinalShell可以远程连接到我们的操作系统上
|
2月前
|
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
|
1月前
|
编解码 安全 Linux
基于arm64架构国产操作系统|Linux下的RTMP|RTSP低延时直播播放器开发探究
这段内容讲述了国产操作系统背景下,大牛直播SDK针对国产操作系统与Linux平台发布的RTMP/RTSP直播播放SDK。此SDK支持arm64架构,基于X协议输出视频,采用PulseAudio和Alsa Lib处理音频,具备实时静音、快照、缓冲时间设定等功能,并支持H.265编码格式。此外,提供了示例代码展示如何实现多实例播放器的创建与管理,包括窗口布局调整、事件监听、视频分辨率变化和实时快照回调等关键功能。这一技术实现有助于提高直播服务的稳定性和响应速度,适应国产操作系统在各行业中的应用需求。
|
2月前
|
Linux 测试技术 数据安全/隐私保护
阿里云Linux os copilot 运维助手初体验
阿里云Linux os copilot 初体验
381 1
阿里云Linux os copilot 运维助手初体验
|
2月前
|
弹性计算 运维 自然语言处理
阿里云OS Copilot测评:重塑Linux运维与开发体验的智能革命
阿里云OS Copilot巧妙地将大语言模型的自然语言处理能力与操作系统团队的深厚经验相结合,支持自然语言问答、辅助命令执行等功能,为Linux用户带来了前所未有的智能运维与开发体验。