网站大量收购独家精品文档,联系QQ:2885784924

操作系统实验四吸烟者问题201000130133计算机4班郑思雨.doc

操作系统实验四吸烟者问题201000130133计算机4班郑思雨.doc

  1. 1、本文档共23页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
操作系统实验四吸烟者问题201000130133计算机4班郑思雨

计算机科学与技术学院实验报告 ? 实验题目:实验四 吸烟者问题 学号:201000130133 日期:2012-4-3 班级: 计算机4班 姓名: 郑思雨 Email:1412561943@ 实验目的: 1、加深对并发协作进程同步与互斥概念的理解,观察和体验并发进程同步与互斥操作的效果。 2、分析与研究经典进程同步与互斥问题的实际解决方案。 3、了解Linux系统中IPC进程同步工具的用法,练习并发协作进程的同步与互斥操作的编程与调试技术。 硬件环境:? 实验室计算机 软件环境: 语言编写。实验环境均为Linux操作系统 实验步骤: 1、了解实验的目的,了解并掌握与进程间通信IPC中的3个对象:共享内存、信号灯数组、 消息队列到呢个有关的系统调用,并能熟练的掌握。 2、阅读实验题目并分析实验的需求。 抽烟者问题。假设一个系统中有三个抽烟者进程,每个抽烟者不断地卷烟并抽烟, 抽烟者卷起并抽掉一颗烟需要有三种材料:烟草、纸和胶水。一个抽烟者有烟草,一个纸, 另一个有胶水。系统中还有两个供应者进程,它们无限地供应所有三种材料,但每次仅轮 流提供三种材料中的两种。得到缺失的两种材料的抽烟者在卷起并抽掉一颗烟后会发信号 通知供应者,让它继续提供另外的两种材料。这一过程重复进行。 请用以上介 绍的IPC同步机制编程,实现该问题要求的功能。 首先创建ipc.h文件,在里面定义生产者/消费者共用的IPC函数的原型和变量。 然后创建ipc.c文件,在里面定义生产者/消费者共用的IPC的具体的相应函数。 创建provider文件,在其中对生产者的一些行为进行定义,先利用系统调用创建共享内存区域,并设定他的长度并获取共享内存的首地址。 然后设定生产者互斥与同步的信号灯,并为他们设置相应的初值。当有生产者进程在运行而其他生产者请求时,相应的信号灯就会阻止他,当共享内存区域已满时,信号等也会提示生产者不能再往共享内存中放入内容。 三个生产者到底哪个应该运行,我们是采取选取随机数的方法进行的,通过随机数来确定应该有哪个进程运行,既有哪个生产者来进行生产。 创建smoker文件,在其中对消费者的一些行为进行定义,先利用系统调用来创建共享内存区域,并设定他的长度并获取共享内存的首地址。 然后设定消费者互斥与同步的信号灯,并为他们设置相应的初值。当有消费进程在运行而其他消费者请求时,相应的信号灯就会阻止它,当共享内存区域已空时,信号等也会提示生产者不能再从共享内存中取出相应的内容。 同样采取用随机数的方法来确定由哪个消费者来运行进程,但同时运行的消费者应该与相应的生产者对应起来,只有这样运行结果才会正确。 代码实现如下: #include ipc.h /* * get_ipc_id() 从/proc/sysvipc/文件系统中获取 IPC 的 id 号 * pfile: 对应/proc/sysvipc/目录中的 IPC 文件分别为 * msg-消息队列,sem-信号量,shm-共享内存 * key: 对应要获取的 IPC 的 id 号的键值 */ int get_ipc_id(char *proc_file,key_t key) { FILE *pf; int i,j; char line[BUFSZ],colum[BUFSZ]; if((pf = fopen(proc_file,r)) == NULL){ perror(Proc file not open); exit(EXIT_FAILURE); } fgets(line, BUFSZ,pf); while(!feof(pf)){ i = j = 0; fgets(line, BUFSZ,pf); while(line[i] == ) i++; while(line[i] != ) colum[j++] = line[i++]; colum[j] = \0; if(atoi(colum) != key) continue; j=0; while(line[i] == ) i++; while(line[i] != ) colum[j++] = line[i++]; colum[j] = \0; i = atoi(colum); fclose(pf); return i; } fclose(pf); return -1; } /* * 信号灯上的 down/up 操作 * semid:信号灯数组标识符 * semnum:信号灯数组下标 * buf:操作信号灯的结构 */ int down(int sem_id) { struct sembuf buf; buf.sem_op =

文档评论(0)

shenlan118 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档