操作系统经典同步问题——生产者-消费者问题

news/2024/11/17 19:32:38/

问题描述

一组生产者进程和一组消费者进程共享一个初始为空、大小为n的缓冲区,只有缓冲区没满时,生产者才把消息放入缓冲区,否则必须等待;只有缓冲区没空时,消费者从中取出消息,否则必须等待。由于缓冲区是临界资源,它只允许一个生产者放入消息,或一个消费者从中取出消息。

对于同步互斥的解释

首先,在操作系统中的异步指的是进程以不可预知的速度前进,举个例子来说,我想打LOL,需要我先打开客户端登陆,才能打LOL,因此打LOL这个动作要发生在客户端登陆之后,这就是所谓同步(用于进程间的相互制约)。

问题分析

  1. 关系分析
    首先,临界区的意思是一次只能由一个进程访问。而如果一次有两个消费者进程要去访问临界区,那么可能会出现一个进程获得了一些资源,另一个进程获得了另一半资源,造成资源的分配不全,生产者进程也是会造成这样的问题。因此生产者和消费者对于临界区的访问是互斥关系
    其次,消费者只有在生产者生产之后才能消费,而生产者也需要在消费者消费后(使资源不满)才能再生产。这种先后的顺序则是同步关系
  2. 信号量设置
    在此问题中,互斥关系有一对,而同步关系有两对。
    mutex为互斥信号量,初值为1,用于控制互斥访问。
    full为同步信号量,初值为0,记录当前缓冲区中满的缓冲区数
    empty为同步信号量,初值为n,记录当前缓冲区中空的缓冲区数
semaphore mutex=1;
semaphore empty=N;//N表示当前总共有几个缓冲区,empty=N即当前缓冲区均为空
semaphore  full=0;Consumer(){while(1){P(full);//需要有满的存有数据的缓冲区P(mutex);visit()//访问临界区,并消费V(mutex);V(empty);//提供一个空的缓冲区可供生产}
}Producer(){while(1){P(empty);//需要空的缓冲区来生产P(mutex);visit()//访问临界区,并生产V(mutex);V(full);//提供一个满的缓冲区可供消费}
}

注意

对于mutex的PV操作一定要和临界区代码"夹紧",考虑这样一种情况:
当缓冲区已满,empty=0,full=n时

当前面生产者代码中P(empty);P(mutex);互换顺序,先对mutex进行P操作,再对full执行P操作,转换成人话就是在说:我先进入了临界区,但我就是不出去,与此同时我又申请了空闲的缓冲区,因为缓冲区均满,所以P(empty)会锁住,等待消费者代码那的V(empty)来唤醒自己,但是问题就出在这里。

消费者那里的V(empty)在代码的末尾,执行消费者进程时,我还需执行P(mutex)但人生产者还在临界区没出来,你怎么能进的去?所以这里也锁住,等待生产者那边的V(mutex)来唤醒自己。

相信大家也看出来了,这不是我等你你等我谁也等不到嘛?所以这样的交换是有问题的,不能够交换这两句代码的顺序。


http://www.ppmy.cn/news/1028529.html

相关文章

如何让你的图片服务也有类似OSS的图片处理功能

原文链接 前言 有自己机房的公司一般都有一套存储系统用于存储公司的图片、视频、音频、文件等数据,常见的存储系统有以NAS、FASTDFS为代表的传统文件存储,和以Minio为代表的对象存储系统,随着云服务的兴起很多公司逐渐将数据迁移到以阿里云…

Spring5新功能

文章目录 前言一、整合日志功能二、Nullable注解三、函数式风格编程四、JUnit5单元测试框架总结 前言 整合日志、Nullable注解、函数式风格编程、整合JUnit5、Webflux 一、整合日志功能 Spring5移除了Log4jConfigListener,官方建议使用Log4j2. 依赖: &…

【c语言】字符函数与字符串函数(上)

大家好呀,今天给大家分享一下字符函数和字符串函数,说起字符函数和字符串函数大家会想到哪些呢??我想到的只有求字符串长度的strlen,拷贝字符串的strcpy,字符串比较相同的strcmp,今天,我要分享给大家的是我们一些其他的…

【枚举+推式子】牛客小白月赛 63 E

登录—专业IT笔试面试备考平台_牛客网 题意: 思路: 首先是个计数问题,考虑组合数学 组合数学就是在考虑枚举所有包含1和n的区间 这个典中典就是枚举1和n的位置然后算贡献 双指针超时,考虑推式子: Code&#xff1a…

redis在java中的使用

redis在java中的使用 Redis是一个基于内存的key-value结构数据库,spring data redis是spring的一部分,对redis底层开发包进行了封装,可以直接使用Spring Data Redis简化操作。 5种常见的数据类型 Redis中key是字符串类型,value…

分布式文件存储系统-FastDFS

前言:FastDFS 是一个分布式文件存储系统,主要用于存储和管理大规模的文件数据,如图片、视频、文档等,是淘宝前架构师为了存储图片用C语言开发出来的系统。 服务端有两个组件 Tracker Server 与 Storage Server ,对应两…

登录验证码实现

Hutool代码改造 Hutool 有参考文档&#xff1b;很多工具类&#xff1b;把一些功能都封装好&#xff1b;都不用你自己去写&#xff1b;直接调用它的工具类 它这里会详细告诉你引入方式Hutool <dependency><groupId>cn.hutool</groupId><artifactId>hu…

化工行业案例 | 甄知科技助力万华化学重构IT服务价值,打造信息中心ERP!

随着科技的发展&#xff0c;新材料的应用领域与日俱增&#xff0c;近年来&#xff0c;全球化工新材料产业发展整体步入高技术引领、产品迭代速度快、产业规模和需求不断扩大的阶段。一体化协同与数字化转型策略是实现化工新材料生产原料自给、节能降耗、降低排放和物料成本的重…