- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
山东大学操作系统实验报告4进程同步实验
计算机科学与技术学院实验报告
?
实验题目: 学号: 日期: 班级:计基地 姓名: 实验目的:
实验内容:
抽烟者问题。假设一个系统中有三个抽烟者进程,每个抽烟者不断地卷烟并抽烟。抽烟者卷起并抽掉一颗烟需要有三种材料:烟草、纸和胶水。一个抽烟者有烟草,一个有纸,另一个有胶水。系统中还有两个供应者进程,它们无限地供应所有三种材料,但每次仅轮流提供三种材料中的两种。得到缺失的两种材料的抽烟者在卷起并抽掉一颗烟后会发信号通知供应者,让它继续提供另外的两种材料。这一过程重复进行。 请用以上介绍的 IPC 同步机制编程,实现该问题要求的功能。
硬件环境:?
软件环境:ubuntu13.04
实验步骤:
(1)定义了和共用的IPC函数原型和变量。
(2)ipc.c文件,编写和共用的IPC的具体相应函数。
(3)Producer文件,首先定义,利用系统调用,建立共享内存区域,设定长度并获取共享内存的首地址。然后设定生产者互斥与同步的信号灯,并为他们设置相应的初值。当有生产者进程在运行而其他生产者请求时,相应的信号灯就会阻止他,当共享内存区域已满时,信号等也会提示生产者不能再往共享内存中放入内容。
(4)?Consumer文件,定义,利用系统调用来创建共享内存区域,并设定他的长度并获取共享内存的首地址。然后设定消费者互斥与同步的信号灯,并为他们设置相应的初值。当有消费进程在运行而其他消费者请求时,相应的信号灯就会阻止它,当共享内存区域已空时,信号等也会提示生产者不能再从共享内存中取出相应的内容。运行的消费者应该与相应的生产者对应起来,只有这样运行结果才会正确。 结论分析与体会:
实现方式:
Consumer:#include ipc.h
int main(int argc,char *argv[]) {
int rate = 3;
int consumerid=atoi(argv[1]);
buff_h = 101;
buff_number = 1;
cget_h = 103;
cget_number = 1;
shm_flg = IPC_CREAT | 0644;
buff_ptr = (char *)set_shm(buff_h,buff_number,shm_flg);
cget_ptr = (int *)set_shm(cget_h,cget_number,shm_flg);
prod_h = 201;
pmtx_h = 202;
cons_h = 301;
cmtx_h = 302;
sem_flg = IPC_CREAT | 0644;
sem_val = buff_number;
prod_sem = set_sem(prod_h,sem_val,sem_flg);
sem_val = 0;
cons_sem = set_sem(cons_h,sem_val,sem_flg);
sem_val = 1;
cmtx_sem = set_sem(cmtx_h,sem_val,sem_flg);
if(consumerid==0)
*cget_ptr=0;
while(1){
if(buff_ptr[0]-A==consumerid){
down(cons_sem);
down(cmtx_sem);
sleep(rate);
if(buff_ptr[0]==A){
printf(%d The consumer has glue.\nThe consumer gets tobacco and paper\n,getpid());
}
if(buff_ptr[0]==B){
printf(%d The consumer has paper.\nThe consumer gets tobacco and glue\n,getpid());
}
if(buff_ptr[0]==C){
printf(%d The consumer has tobacco.\nThe consumer gets glue and paper\n,getpid());
}
*cget_ptr = (*cget_ptr+1);
if(*cget_ptr%2==0)
buff_ptr[0]=D;
else
buff_ptr[0]=E;
up(cmtx_sem);
up(prod_sem);
}
}
return EXIT_SUCCESS;
}
Producer:
#include ip
文档评论(0)