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

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

生产者 - 消费者问题

问题描述

生产者消费者问题(英语: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 调度
实验 同步机制之生产者和消费者问题【操作系统】
实验 同步机制之生产者和消费者问题【操作系统】
304 0
|
Java
经典 生产者-消费者线程【操作系统】
经典 生产者-消费者线程【操作系统】
89 0
操作系统2020年8月生产消费者问题解析思路
操作系统2020年8月生产消费者问题解析思路
100 0
2.6操作系统(生产者消费问题 多生产者—消费者问题 吸烟者问题)
1.生产者消费问题 能否改变相邻P、V操作的顺序? 2.多生产者—消费者问题 如何实现? 可不可以不用互斥信号量? 如果盘子(缓冲区)容量为2 知识回顾与重要考点 3.吸烟者问题 如何实现
2.6操作系统(生产者消费问题 多生产者—消费者问题 吸烟者问题)
|
调度
生产者和消费者问题中的唤醒丢失(操作系统)
生产者和消费者问题中的唤醒丢失(操作系统)
179 0
|
27天前
|
运维 自然语言处理 Ubuntu
OS Copilot-操作系统智能助手-Linux新手小白的福音
OS Copilot 是阿里云推出的一款操作系统智能助手,专为Linux新手设计,支持自然语言问答、辅助命令执行和系统运维调优等功能。通过简单的命令行操作,用户可以快速获取所需信息并执行任务,极大提升了Linux系统的使用效率。安装步骤简单,只需在阿里云服务器上运行几条命令即可完成部署。使用过程中,OS Copilot不仅能帮助查找命令,还能处理文件和复杂场景,显著节省了查找资料的时间。体验中发现,部分输出格式和偶尔出现的英文提示有待优化,但整体非常实用,特别适合Linux初学者。
114 10
|
4月前
|
安全 Linux 数据安全/隐私保护
Vanilla OS:下一代安全 Linux 发行版
【10月更文挑战第30天】
144 0
Vanilla OS:下一代安全 Linux 发行版
|
2月前
|
弹性计算 自然语言处理 Ubuntu
OS Copilot-操作系统智能助手-Linux新手小白的福音
OS Copilot是由阿里云推出的操作系统智能助手,专为Linux新手设计,支持自然语言问答、辅助命令执行等功能,极大提升了Linux系统的使用效率。用户只需通过简单的命令或自然语言描述问题,OS Copilot即可快速提供解决方案并执行相应操作。例如,查询磁盘使用量等常见任务变得轻松快捷。此外,它还支持从文件读取复杂任务定义,进一步简化了操作流程。虽然在某些模式下可能存在小问题,但总体上大大节省了学习和操作时间,提高了工作效率。
149 2
OS Copilot-操作系统智能助手-Linux新手小白的福音
|
2月前
|
弹性计算 运维 Ubuntu
os-copilot在Alibaba Cloud Linux镜像下的安装与功能测试
我顺利使用了OS Copilot的 -t -f 功能,我的疑惑是在换行的时候就直接进行提问了,每次只能写一个问题,没法连续换行更有逻辑的输入问题。 我认为 -t 管道 功能有用 ,能解决环境问题的连续性操作。 我认为 -f 管道 功能有用 ,可以单独创建可连续性提问的task问题。 我认为 | 对文件直接理解在新的服务器理解有很大的帮助。 此外,我还有建议 可以在非 co 的环境下也能进行连续性的提问。
87 7
|
2月前
|
存储 运维 安全
深入解析操作系统控制台:阿里云Alibaba Cloud Linux(Alinux)的运维利器
本文将详细介绍阿里云的Alibaba Cloud Linux操作系统控制台的功能和优势。
111 6

热门文章

最新文章