- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话: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。但是这样无法实现原料的互斥,无法保证
文档评论(0)