操作系统实验报告生产者消费者问题
更新时间:2023-08-31 05:27:01 阅读量: 教育文库 文档下载
- 操作系统推荐度:
- 相关推荐
《操作系统实验报告》
班级 计算机2011-3班 姓名 李洋 学号
2013年 12 月 31 日
一.设计目标
完成N个生产者和M个消费者线程之间的并发控制,N、M不低于30,数
据发送和接收缓冲区尺寸不小于20个(每个产品占据一个)。
其中生产者线程1、3、5、7、9生产的产品供所有奇数编号的消费者线程消费,只有所有奇数编号的消费者线程都消费后,该产品才能从缓冲区中撤销。
其中生产者线程2、4、6、8、10生产的产品所有偶数编号的消费者线程都可消费,任一偶数编号消费者线程消费该消息后,该产品都可从缓冲区中撤销。
其中11-20号生产者线程生产的产品仅供对应编号的消费者线程消费。
其他编号生产者线程生产的产品可由任意的消费者线程消费。
每个生产线程生产30个消息后结束运行。如果一个消费者线程没有对应的生产者线程在运行后,也结束运行。所有生产者都停止生产后,如果消费者线程已经没有可供消费的产品,则也退出运行。
二.背景知识说明
2.1原理
生产者与消费者线程采用posix互斥锁机制进行互斥进入各自的代码段,只有采用互斥锁临界区代码段才可以不被打扰的执行;同步机制采用的是posix条件变量pthread_cond_wait和pthraed_cond_signal进行同步的。
线程间的通信采用的是共享内存机制。(注:所有的共享内存块是在进程里建立的,线程只需链接上各自的共享内存块即可,每一块共享内存的大小是100). 在这里共享内存 设置成一个100的数组。
具体实施:(1)为1.3.5.7.9建立一个共享内存1号,1.3.5.7.9生产者线程生产的产品都放入这块共享内存缓冲区,所有奇数的消费者线程要消费的话,只需在消费者线程中链接上这块共享内存,就可以直接消费1.3.5.7.9生产者线程生产的产品。
(2)为2.4.6.8.10建立一块共享内存2号。2.4.6.8.10生产的产品都放入2号共享内存缓冲区,所有的偶数的消费者线程只要链接上2号缓冲区,就可以消费2.4.6.8.10生产的产品。当偶数消费者线程消费产品后,产品即可从缓冲区撤销,方法是在消费线程里将消费的产品在共享内存数组里置0。
(3)为11--20的每一对生产者消费者线程建立一块共享内存,编号11--20. 11--20号的消费者线程能链接各自的共享内存缓冲区或奇数或偶数共享内存缓冲区,即11--20号的生产者生产的产品只能被对应的消费者消费而11-20的奇数
消费者可以消费缓冲区1的产品,偶数消费者可消费缓冲区2的产品。 (4)为21--30号的生产者消费者线程只建立一块共享内存21号,21--30号生产者生产的产品都放入21号缓冲区,所有的消费者线程只要链接上21号共享内存,就可以消费21--30号生产者生产的产品。
用于控制线程是否结束的方法是:设置一个全局变量t,在生产者线程里进行t++,在生产者线程里当t达到10时(注:为了很好的测试程序,本应该在生产者生产30个产品时菜结束线程,这里设置成了10),就break跳出while()循环,这样线程自然就终止。同样在消费者线程里,当t达到10时,这里不用t++,就跳出while()循环,消费者线程自然就终止。这样设计满足了,当生产者生产30个产品时就终止生产者线程,生产者线程终止消费者线程也得终止的要求。
生产者从文件so.txt读取数据进行生产,这个文件里的数据是一连串的字符从a--z的组合,没有空格或其他字符。文件内容的格式没有特殊要求。
2.2函数说明
创建线程函数:参数tida30是
线程号,produce30是线程30生产者函数。
消费者线程
其他线程与以上的两个线程函数功能一样,只是变量不同。
等待函数,当满足一定条件时就会阻塞线
程,而激活另一个线程
触发函数,当满足一定条件时就会激活一个线程
建立共享内存函数:在进程里创
建一块共享内存
链接共享内存函数:参数shmid19是共享内存标识号,
此函数将线程连接到指定的共享内存。
三.设计
3.1设计环境
此设计不面向任何用户,只是一个测试用例;没有涉及网络通信; 此设计意在验证多个线程的并发执行,会有什么结果,线程是如何并发执行的,并发执行的线程与什么有关。线程间的互斥采用什么机制,同步采用什么机制,线程间如何通信,通信的机制是什么。此设计可以加深对线程的同步互斥以及通信的认识和理解。
3.3详细设计
消费者 comsume() 流程图:
开始
选择消费缓冲区,链接共享内存
Count-否 t=11 进入临界区 否 Count=0 否
是
是 阻 塞 消 费 者 线 程,激 活 生 产 者 线程
消 费 产品
Count<3 是
激活 生产 者线 程 Break;
结束
实现思路:
在main里创建30对线程,30个生产者,30个消费者。每对生产者消费者线程对应一对生产者消费者函数produce()和comsume();
生产者函数的实现:先链接对应的共享内存缓冲区,打开文件;设置全局变量count用于控制生产者线程的阻塞与消费者线程激活。当count=4时,意味着生产者生产了3个产品但是消费者没有消费,这时调用pthread_cond_wait()函数阻塞生产者线程,激活消费者线程消费。当count=1时,意味着生产者生产了一个产品消费者没有消费掉,就调用 pthread_cond_signal()函数激活消费者线程消费。设置全局变量t,用于控制线程是否结束。当t=11时,意味着生产者生产了10个产品,此时调用break跳出while循环,终止生产者线程。采用posix互斥锁机制进行互斥进入各自的代码段,只有采用互斥锁临界区代码段才可以不被打扰的执行;同步机制采用的是posix条件变量pthread_cond_wait和pthraed_cond_signal进行同步的。
消费者函数的实现:先链接对应的共享内存缓冲区;设置全局变量t与生产者的功能一样,在此不作介绍。设置全局变量count,用于控制消费者的阻塞与生产者线程的激活,当count=0时,调用pthread_cond_wait()函数阻塞消费者线程并激活生产者线程进行生产;当count<3时,调用pthread_cond_signal()函数激活生产者线程进行生产。采用posix互斥锁机制进行互斥进入各自的代码段,只有采用互斥锁临界区代码段才可以不被打扰的执行;同步机制采用的是posix条件变量pthread_cond_wait和pthraed_cond_signal进行同步的。
线程间的通信采用的是共享内存机制。(注:所有的共享内存块是在进程里建立的,线程只需链接上各自的共享内存块即可,每一块共享内存的大小是100). 在这里共享内存 设置成一个100的数组。
具体实施:(1)为1.3.5.7.9建立一个共享内存1号,1.3.5.7.9生产者线程生产的产品都放入这块共享内存缓冲区,所有奇数的消费者线程要消费的话,只需在消费者线程中链接上这块共享内存,就可以直接消费1.3.5.7.9生产者线程生产的产品。
(2)为2.4.6.8.10建立一块共享内存2号。2.4.6.8.10生产的产品都放入2号共享内存缓冲区,所有的偶数的消费者线程只要链接上2号缓冲区,就可以消费2.4.6.8.10生产的产品。当偶数消费者线程消费产品后,产品即可从缓冲区撤销,方法是在消费线程里将消费的产品在共享内存数组里置0。
(3)为11--20的每一对生产者消费者线程建立一块共享内存,编号11--20. 11--20号的消费者线程能链接各自的共享内存缓冲区或奇数或偶数共享内存缓冲区,即11--20号的生产者生产的产品只能被对应的消费者消费而11-20的奇数消费者可以消费缓冲区1的产品,偶数消费者可消费缓冲区2的产品。 (4)为21--30号的生产者消费者线程只建立一块共享内存21号,21--30号生产者生产的产品都放入21号缓冲区,所有的消费者线程只要链接上21号共享内存,就可以消费21--30号生产者生产的产品。
线程的终止是靠全局变量t实现的,在produce()函数里进行t++,当t=11即生产了10个产品时,就跳出while循环终止生产者线程,生产者线程终止时消费者函数里的t=11也跳出while循环终止消费者线程。也就是当生产者线程终
止时消费者线程也就终止了。
重要代码注释:
四.测试(注:测试时在选择消费缓冲区时,必须快速输入缓冲区代号,然后快速按enter键)
由于这里没有开启21--30号线程,所以缓冲区只能选择一号。同一线程号的一对生产者消费者线程比较集中,这是由于同步机制完成的任务。1 3 5 7 9公用一个共享内存缓冲区,生产者生产的产品都放入这块缓冲区,奇数号的消费者线程竞争消费缓冲区里的产品。从图中可看到,越往后1 3 等的线程已--经不见了,说明生产者已经生产了10个产品后生产者线程和消费者线程自行终止了。
缓冲区里的产品已经列出如图所示。
由于这里没有开启21--30号线程,所以缓冲区只能选择二号。同一线程号的一对生产者消费者线程比较集中,这是由于同步机制完成的任务。2 4 6 8 10公用一块共享内存缓冲区,生产者生产的产品都放入这块缓冲区,偶数号的消费者线程竞争消费缓冲区里的产品。从图
中可看到,越往后2 4 等的线程已经不见了,说明生产者已经生产了10个产品后生产者线程和消费者线程自行终止了。
缓冲区里的产品已经列出如图所示。可看见缓冲区前边都是0,说明这些产品被消费了并直接从缓冲区里撤销了,后边的不是0说明生产了还没有消费。
由于这里没有开启1--10 21--30号线程,所以缓冲区只能选择11-20对应的号。同一线程号的一对生产者消费者线程比较集中,这是由于同步机制完成的任务。11--20每对线程对应一个共享内存缓冲区,各个生产者生产的产品放入自己的缓冲区,消费者从指定的缓冲区里消费。其中13号消费时,提示error thread 13说明输入的要消费的缓冲区号错误。从上图可以看见缓冲区11 12均只有10个产品,说明生产者线程生产了10个产品就终止了,同时消费者也终止了,这也说明了为什么越往后就看不见11 12 等线程的踪迹了。
由于这里没有开启1--10 11-20号线程,所以缓冲区只能选择对应的21号。同一线程号的一对生产者消费者线程比较集中,这是由于同步机制完成的任务。所有线程公用一块共享内存缓冲区,生产者生产的产品都放入此块缓冲区,所有的的消费者线程竞争消费缓冲区里的产品。从图中可看到,越往后21 22 等的线程已经不见了,说明生产者已经生产了10个产品后生产者线程和消费者线程自行终止了。 缓冲区产品如图所示。
26--30的测试与21--25类似在此略。
五.总结
通过此次课程设计对线程有了深刻的认识,明白了如何创建线程,如何终止线程。同时对线程的如何并发执行有了一定的理解,这主要是学会了如何运用互斥锁实现互斥,利用条件变量实现线程间的同步。通过此设计明白了如何运用互斥锁函数和条件变量函数实现同步与互斥,这才是此次设计的目的所在与关键。
由于此次设计用到了共享内存,使我对共享内存的使用有了更深刻的把握,
明白了一些函数的原理与使用方法。同时注意到,共享内存只能在主进程里建立,在线程里链接使用,而不能在线程里建立共享内存,否则,无法在线程里链接共享内存。
正在阅读:
操作系统实验报告生产者消费者问题08-31
英语作文常用句型总结08-12
2005-2010历年全国计算机等级考试二级Access笔试试题及答案 - 图文01-29
高一英语阅读理解专练07-07
2017年兰州理工大学电路(同等学力加试)考研复试核心题库04-29
以水为话题的作文600字5篇03-31
数据结构试卷及答案03-02
小学少年宫经典诵读活动总结03-30
小学生起床优秀作文06-15
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 生产者
- 操作系统
- 消费者
- 实验
- 报告
- 问题
- 《行政组织学》形考任务试题及答案
- 2020物理二轮48分小题精准练:2 Word版含解析
- 特殊坐标以及平移
- 吕梁市电梯日常维护保养收费标准
- 青年群体思想状况调查问卷
- 分享版 外贸部薪酬和销售提成方案
- 药物临床试验的稽查
- 2009年中国经济发展趋势分析和调控对策建议
- 继续教育-严守安全红线,护航福祉民生——《生产安全事故应急条例》解读课后习题
- 商务管理综合应用考试冲刺笔记
- VMware 6.5安装及使用
- ansys坐标系的总结
- 4S店销售管理优秀案例
- 退税申请审批表
- 新人教版物理九年级全一册18.4 电功率、电热的综合计算 同步练习1-推荐
- 汽车发动机结构与检修教案 第四单元 冷却系
- 2008届高三英语精品资源-江苏省黄桥中学08届高考英语语法复习之定语从句精讲精练
- 公路工程概预算试题
- 建设项目竣工环境保护验收审批表(房地产验收申请表)
- Java初学者需掌握的30个基本概念