- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
进程同步实验
张咪
软件四班
一、实验要求
加深对并发协作进程同步与互斥概念的理解,观察和体验并发进程同步与互斥操作的效果,分析与研究经典进程同步与互斥问题的实际解决方案。了解Linux系统中IPC进程同步工具的用法,练习并发协作进程的同步与互斥操作的编程与调试技术。
二、实验目的
抽烟者问题。假设一个系统中有三个抽烟者进程,每个抽烟者不断地卷烟并抽烟。抽烟者卷起并抽掉一颗烟需要有三种材料:烟草、纸和胶水。一个抽烟者有烟草,一个有纸,另一个有胶水。系统中还有两个供应者进程,它们无限地供应所有三种材料,但每次仅轮流提供三种材料中的两种。得到缺失的两种材料的抽烟者在卷起并抽掉一颗烟后会发信号通知供应者,让它继续提供另外的两种材料。这一过程重复进行。 请用以上介绍的IPC同步机制编程,实现该问题要求的功能。
三、实验环境??
实验环境均为Linux操作系统,开发工具为gcc和g++。
四、实验思路?
1、约束:
(1)某一时刻,只能有一个供应者,放入一对物品。
(2)某一时刻,只能有一个抽烟者,且要保证这个抽烟者恰好需要的就是刚刚生产的物品。
(3)所有供应者提供这种物品之后,不论它要生产什么物品,只有等到抽烟者拿走了物品之后,才能继续生产。
供应者1供应者2
wait(empty);wait(empty);
wait(mutex1);wait(mutex1);
随机生产两样产品;随机生产两样产品;
signal(mutex1);signal(mutex1);
//有烟草的//有烟草的if(PG)signal(s1);if(PG)signal(s1);
//有胶水的//有胶水的
if(PT)signal(s2);if(PT)signal(s2);//有纸的//有纸的
if(TG)signal(s3);if(TG)signal(s3);
s1(有烟草的)s2(有胶水的)s3(有纸)
wait(s1);wait(s2);wait(s3);
wait(mutex2);wait(mutex2);wait(mutex2);
取产品吸烟取产品吸烟取产品吸烟
signal(mutex2);signal(mutex2);signal(mutex2);
signal(empty);signal(empty);signal(empty);
2、创建五个子进程,两个作为供应者,三个作为吸烟者。
3、创建信号灯数组,8个信号灯
3 个给吸烟者: 0:tobaccopaper,1:paperglue,2:gluetobacco
2 个给两个供应者用于同步: 3,4
3 个给供应者用于互斥: 5:tobaccopaper,6:paperglue,7:gluetobacco
生产者同步,确保同一时间不会同时提供多个原料
原料互斥,两个生产者不会同时提供同种原料,通知需要该原料的吸烟者
4、系统建立IPC通讯时必须指定一个ID值。通常情况下,该id值通过ftok函数得到。
在成功获取到key之后,就可以使用该key作为某种方法的进程间通信的key值
新建一个文件夹,在该文件夹中建立以下名为test4.c的C语言程序。编写代码?,保存。
输入gcc test4.c命令, 生成默认的可执行文件a.out。执行a.out:。执行并调试test4程序。
六、调试及实验结果
1、一开始只设置了六个信号量,三个吸烟者的s1,s2,s3,空信号empty,和用于互斥的mutex1和mutex2。但是这样无法实现原料的互斥,无法保证两个生产者不会同时提供同种原料。后来又改为八个信号量,每个吸烟者对应一个,两个用于生产者同步,确保同一时间不会同时提供多个原料。两个用于原料互斥,两个生产者不会同时提供同种原料。
2、对于switch语句掌握不熟练,先是忘记加括号,编译时出错
3、case语句忘记加break,编译虽然成功但运行结果有错误,显示由同一个供应者一直供应而不是两个供应者轮流供应的情况,错误结果如下图:
调试后两个供应者轮流供应,按ctrl+c结束进程,成功运行的结果如下图:
七、心得与收获
1、在本实验中,通过信号灯实现了进程的同步。如果信号灯的值小于0,进程阻塞。通过执行信号灯的sem-p()和sem-v()操作,使进程并发执行时保持同步。
2、操作系统中,进程同步可以通过信号量机制实现。在本实验中,信号灯就是信号量,sem-p()操作就是信号量的wait操作,sem-v()操作就是信号量的signal操作。
3、了解了信号灯系统调用的语法
①创建一个信号灯数组的系统调用有语法:
#include sys/sem.h int semget(key_t key,int nsems, int flags);
key信号灯数组的键值。若指定
您可能关注的文档
最近下载
- 柯林斯词频分级词汇(一到五星).docx VIP
- 母婴护理知识大全课件.pptx
- GB∕T30146-2023 《安全与韧性 业务连续性管理体系 要求》“8.1运行策划和控制”理解与实施指导材料(2024A0).docx VIP
- GB∕T30146-2023 《安全与韧性 业务连续性管理体系 要求》“8.3业务连续性策略和解决方案”理解与实施指导材料(2024A0).docx VIP
- GB∕T30146-2023 《安全与韧性 业务连续性管理体系 要求》“8.2 业务影响分析和风险评估”理解与实施指导材料(2024A0).docx VIP
- GB∕T30146-2023 《安全与韧性 业务连续性管理体系 要求》“8.5演练策划”理解与实施指导材料(2024A0).docx VIP
- 中考现代文阅读——邓宗良《母亲的叶搭饼》.docx VIP
- GB∕T30146-2023 《安全与韧性 业务连续性管理体系 要求》“8.6业务连续性文件和能力评价”理解与实施指导材料(2024A0).docx VIP
- 华住加盟管理指导手册.pdf VIP
- (5MWh方案)--【314电芯液冷】100MW200MWh储能方案书.docx
文档评论(0)