同步和互斥——生产者和消费者进程版

经典进程同步与互斥问题——生产者消费者问题 问题描述:生产者——消费者问题是指有两组进程共享一个环形的缓冲池,一组称为生产者,一组称为消费者。缓冲池是由若干个大小相等的缓冲区组成,每个缓冲区可以容纳一个产品。生产者进程不断的将产品放入缓冲池中,消费者不断将产品从缓冲池中取出。核心:生产者——消费者问题,既存在着进程同步问题,也存在着临界区互斥问题。当缓冲区满时,表示供大于求,生产者必须停止生产,进入等待状态,同时唤醒消费者;当所有缓冲区都为... 阅读详情

一、同步和互斥的概念

什么是同步?什么是互斥?

同步是一种时序关系。如规定了进程1处理完事情A后,进程2才能处理事情B,经典的同步问题是生产者和消费者间的同步.

互斥描述的是一种独占关系.如任一时刻,进城1和进程2中只能有一个写文件C.

有人说互斥是一种特殊的同步,同步是一种更为复杂的互斥关系(见" http//topic.youkuaiyun.com/t/20020711/17/867228.html"),但我不这么认为!

首先上面的言论是矛盾的,如果A和B互相包含,那A只能等于B,而同步和互斥显然是不等的。从前面的描述可以看出,同步和互斥是你中有我,我中有你的关系。当然如果你要从更广义地角度来说互斥是一种特殊的同步,我也没办法,毕竟我们的程序正确运行的前提就是同步。

 

二、生产者和消费者的问题分析

生产者和消费者的解答网络上有多种线程版本,但却没看到进程版本,所以我就来填补这一“空白”了。PS:使用进程版本的另一个重要原因是,想顺便复习下共享内存。

我们使用信号量来同步,用一个整型数组来当缓冲区。很显然这两者都要能够在各生产者和消费者进程间全局可见,所以我们用共享内存来实现他们。

生产者和消费者问题从易到难有三种。

 

1.         一个生产者和一个消费者,公用一个缓冲区

解决办法,定义两个信号量。

empty:表示缓冲区是否为空,初值为1,生产者用它来判断缓冲区是否可写。

full:表示缓冲区是否为满,初值为0,消费者用它来判断缓冲区是否可读。

producer(生产者)的伪码:

while(1)

{

P(empty);

写缓冲区;

V(full);

}

consumer(消费者)的伪码:

while(1)

{

P(full);

写缓冲区;

V(empty);

}

 

2.   一个生产者和一个消费者,公用m个环形缓冲区

分析过程与第一种情况类似,直接看伪码。

producer(生产者)的伪码:

while(1)

{

P(empty); /* empty初值为m */

写第in个缓冲区; /* in用来指示当前的第一个可写的缓冲区的下标,初值设为0。 */

in = (in+1)%m;

V(full);

}

consumer(消费者)的伪码:

while(1)

{

P(full); /* full初值为0 */

读第out个缓冲区; /* out用来指示当前的第一个可读的缓冲区的下标,初值设为0。 */

out = (out+1)%m;

V(empty);

}

 

3.      一组生产者和一组消费者,公用m个环形缓冲区

相比第2种情况,我们所要做的是用两个互斥变量mutex_producer和mutex_consumer,来实现各生产者间、各消费者间互斥地访问某个缓冲区。

producer(生产者)的伪码:

while(1)

{

P(empty); /* empty初值为m */

P(mutex_producer);

写第in个缓冲区; /* in用来指示当前的第一个可写的缓冲区的下标,初值设为0。 */

in = (in+1)%m;

V(mutex_producer);

V(full);

}

 

consumer(消费者)的伪码:

while(1)

{

进程的PV操作及互斥同步实现 在操作系统中,P、V操作是进程管理中的难点。这是1968年荷兰人Dijkstra给出的一种解决并发进程间互斥和同步关系的通用方法。 1. P、V操作的意义 定义了信号量及其上的P操作和V操作,来实现并发进程间的同步和互斥,甚至可以用来管理资源的分配。P、V操作因交换的信息量少,属于进程的低级通信。 2. 什么是信号量? 信号量(semaphore)是由一个值和一个指针构成的数据结构 阅读详情

相关推荐

进程同步之生产者消费者模型

一、概念引入 例如寄信 我(生产者) 邮递员(消费者) 我把信件写好 -----相当于生产者生产数据 我把信放到邮筒-----相当于把生产者的数据放入到缓冲区 邮递员把信从邮筒取出-----相当于消费者把数据从缓冲区取出 邮递员把信拿去邮局处理------相当于消费者处理数据 ...

HiMark 9078

进程同步互斥经典题之消费者与生产者问题

操作系统进程同步互斥经典题之消费者与生产者问题

一字并肩王的博客 6527

进程同步与互斥 生产者与消费者问题--操作系统大作业

大连理工大学操作系统大作业, 进程同步与互斥 生产者与消费者问题

BFD+OSPF+FRR:构建高可用网络的核心铁三角

摘要:VRRP、OSPF、BFD和FRR协同实现网络高可用。VRRP负责网关冗余,OSPF确保路由可达,BFD提供毫秒级故障检测,FRR实现快速路径切换。故障时,BFD立即检测并通知OSPF,FRR在OSPF收敛前切换流量,VRRP完成网关切换(如需)。BFD采用异步模式动态建立,效率最高。该机制确保业务流量无缝切换,提升网络可靠性。

A516988的博客 753

无源定位之时差估计的精确时差估计算法(ETDE)及MATLAB实现程序

时差估计算法之精确时差估计(ETDE)欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想

伊谢尔伦的林中小路 4255

Gromacs GPU加速版安装全攻略:从依赖配置到性能优化

本文提供了Gromacs GPU加速版的完整安装与性能优化指南。详细介绍了从编译器、OpenMPI、FFTW到CUDA等关键依赖的配置,手把手指导编译支持CUDA的Gromacs,并深入解析了如何通过调整.mdp参数及平衡MPI与OpenMP线程分配,最大化GPU利用率,从而让分子动力学模拟效率获得数十倍提升。

y9z0a1b的博客 1151

数分实战(01):Global_Superstore数据集解析与商业洞察

本文以Global_Superstore零售数据集为例,手把手指导数据分析实战全流程。从数据清洗、探索性分析到深度商业洞察,详细解析了如何通过Python处理缺失值与异常值,进行销售利润分析、客户细分与地理分析,并探讨了折扣与利润的微妙关系。文章旨在帮助读者建立数据分析思维框架,从数据中挖掘可指导实际业务决策的核心洞察。

weixin_28487433的博客 342

利用 Docker Distribution 搭建私有的 Docker Registry

1、拓扑

weixin_44983653的博客 1067

《数学建模与数学实验》第5版 线性规划 习题3.4

1. 某鸡场有1000只鸡,用动物饲料和谷物混合喂养. 2. 某工厂用A1,A2两台机床加工B1,B2,B3三种不同零件. 3. 某工厂利用两种原料甲、乙生产$A_1、A_2、A_3$三种产品. 4. 每班的护士在值班开始时向病房报到,连续工作8个小时. 5. 某工厂生产 A1 、A2 两种型号的产品 6. 有两个煤厂A,B 7. 某工厂制造三种产品,生产这三种产品需要三种资源 8. 已知某工厂计划生产1,2,3三种产品,各产品需要在ABC设备加工。...

hexiaosi_的博客 2万+

【11】科曼医疗——科曼医疗 嵌入式--面试,校招,面试问答记录

科曼医疗嵌入式校招面试记录:3位面试官分别考察应用层技术、底层技术和HR面。技术问题涵盖C++特性(多态、虚函数、指针与引用区别)、内存管理(malloc与new对比)、嵌入式基础(51最小系统、IIC/SPI协议)及项目经验(智能黑板擦专利项目)。同时考察了Linux使用经验、STM32开发及嵌入式操作系统认知。最后环节应聘者询问了开发环境及面试流程。面试内容全面覆盖嵌入式开发核心知识点。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1250

PPT里文字太多如何排版-一口气教你7种布局瞬间让PPT高大上起来

PPT里全是文字且很拥挤怎么办?本篇教你使用7种不同的排版让你的PPT瞬间变得高大上起来。

打造全国最全的AI Agent开发知识领域的博客 5022

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

上一篇: 从大熊猫看价值升迁
下一篇: 关于telnet协议还原
彭令鹏
博客等级 码龄20年 225粉丝 39原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值