生产者消费者问题实验报告.docVIP

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
生产者消费者问题实验报告

操作系统课程设计实验报告 实验名称: 生产者消费者问题 姓名/学号: 一、实验目的 以生产者和消费者问题为例,学习Linux和Windows下进程通信、同步机制的具体实现方法,主要是信号量和共享内存。熟悉相关系统API的用法。 二、实验内容 使用共享内存和信号量机制来实现多个生产者/消费者进程间的通信和同步。要求在Linux和Windows下分别实现。 缓冲区大小为3,初始为空。2个生产者,随机等待一段时间,往缓冲区添加数据,重复6次。3个消费者,重复4次。 三、实验环境 Ubuntu 10.10 , GCC; Windows 7, VC 6.0; 四、程序设计与实现1. Linux下: (1) 数据结构: a. 共享内存定义为一个结构,使得其数据成员更清晰且操作变得简单。 b. 共享缓冲区采用循环队列的数据结构,由上面的结构 struct buf { int start; int end; int info[BUF_NUM]; } 维护。其中start为队头指针,end为队尾指针,info为数据区域。 (2) 算法: 大致由三个模块组成: 主程序 (main): 创建信号量、共享内存并进行初始化 创建生产者、消费者进程,生产者执行pro_fun(),消费者执行con_fun() 等待所有子进程的结束 删除信号量、共享内存 生产者进程 (pro_fun): 通过key获得信号量、共享内存的ID,将内存添加到自己的地址空间 P(empty),P(mutex),Add(data),V(mutex),V(full) 解除和共享内存的关联 消费者进程 (con_fun): 通过key获得信号量、共享内存的ID,将内存添加到自己的地址空间 P(full),P(mutex),Add(data),V(mutex),V(empty) 解除和共享内存的关联 循环队列部分: 加入数据: info[end] = value; end = (end + 1) % 3; 取出数据: temp = info[start]; info[start] = 0; (start = start + 1)%3; return temp; (3) 程序流程图: a. 主函数: b. 生产者进程: c. 消费者进程和生产者类似 4. Windows 下: (1) 数据结构: 和Linux大致相同 (2) 算法: a. 创建的子进程调用正在执行的文件本身,通过main函数的参数区分主进程和生产者、消费者进程。 b. 主进程、消费者、生产者进程的流程和Linux类似,只是系统调用的函数不同。 五、实验结果和分析 1. Linux : 显示内容的格式为:时间--生产(消费)者进程ID加入(取走)一数据--缓冲区状态 如图,由缓冲区状态可知,生产者消费者进程实现了互斥访问共享缓冲区,且在缓冲区为空时,消费者等待,缓冲区满时,生产者等待。由于题目设定生产12次消费12次,故最后缓冲区为空。 2. Windows: 显示内容格式为:时间 -- I add(get) a data -- 缓冲区状态。共享内存为0时表示无数据,为1时表示有数据。 如图,达到了预期目标。 五、讨论、心得 共享内存定义为结构会简化操作。 主进程应等待子进程结束后再销毁信号量及共享内存,不然会出现错误。 Windows下的没有特定的P操作函数,而是由WaitForSingleObject()来实现。 主进程不应传给子进程任何同步对象的信息,而不同的子进程得到相同的信号量是由key(Linux)及name(Windows)来实现的。 创建子进程有两种方式,一种是调用另外的可执行文件,一种是只有主进程一个可执行文件,在第二种方式中只要主进程不传给子进程任何信息,两种方式本质上是相同的。 Windows下打开句柄一定不要忘记释放。

文档评论(0)

aicencen + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档