进程同步机制与互斥生产者消费者问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学习中心:专业:
年级:年春/秋季
学号:
学生:
题目:进程同步与互斥生产者-消费者问题1.谈谈你对本课程学习过程中的心得体会与建议?
转眼间,学习了一个学期的计算机操作系统课程即将结束。在这个学期中,通过老师的悉心教导,让我深切地体会到了计算机操作系统的一些原理和具体操作过程。在学习操作系统之前,我只是很肤浅地认为操作系统只是单纯地讲一些关于计算机方面的操作应用,并不了解其中的具体操作过程和实用性。通过这一学期的学习,我才知道操作系统(Operating System,简称OS)是管理计算机系统的全部硬件资源包括软件资源及数据资源;控制程序运行;改善人机界面;为其它应用软件提供支持等,使计算机系统所有资源最大限度地发挥作用,为用户提供方便的、有效的、友善的服务界面。操作系统这门课程并不是教你如何使用操作系统的,而是讲操作。总而言之,操作系统的一些原理在生活中都可以找到相应的例子。结合生活中的例子,可以化抽象为具体,我们会更加清楚地了解到其原理与操作过程。我觉得通过我们的不断学习,结合生活中的实际问题,我们就会把操作系统学得更好。总体来说,通过这次的对操作系统的总结,有收获也有遗憾、不足的地方,但我想,我已经迈入了操作系统的大门,只要我再认真努力的去学习,去提高,肯定能让自己的知识能力更上一层楼.
1设计思路及主要代码分析
1.1设计思路
在这次设计中定义的多个缓冲区不是环形循环的,并且不需要按序访问。其中生产者可以把产品放到某一个空缓冲区中,消费者只能
消费被指定生产者生产的产品。本设计在测试用例文件中指定了所有生产和消费的需求,并规定当共享缓冲区的数据满足了所有有关它的消费需求后,此共享才可以作为空闲空间允许新的生产者使用。
本设计在为生产者分配缓冲区时各生产者之间必须互斥,此后各个生产者的具体生产活动可以并发。而消费者之间只有在对同一个产品进行消费时才需要互斥,它们在消费过程结束时需要判断该消费者对象是否已经消费完毕并释放缓冲区的空间。
1.2程序流程图
主函数
初始化缓冲区,消费请求队列及部分同步对象
提取线程信息
完成线程相关同步对象的初始化
等待所有线程结束
创建线程模拟生产和消费
程序结束
消费者
有消费请求?
此请求可满足?
确定产品位置
此产品正被消费?
进入临界区(对同一产品进
行请求的消费者之间互斥)
消费产品、并判断是否应该
释放产品所占缓冲区 结束消费进程
生产者
存在空缓冲区?
另一生产者正在生产?
进入临界区
(所有生产者之间互斥)
从空缓冲区中为本生产者的产品分配一个空间
退出临界区
在该缓冲区放入产品
通过信号量通知等待本产品的消费者
结束生产进程
退出临界区 Y
Y
Y
N
N
N
N
Y
Y
N
1.3基本内容
在设计程序时主要有三个主体部分、三个辅助函数和一个数据结构。
其中主体部分为一个主函数main(),用于初始化缓冲区和各个同步对象,并完成线程信息的读入,最后根据该组的线程记录启动模拟线程,并等待所有线程的运行结束后退出程序;
生产者函数Produce()和消费者函数Consume(),生产者和消费者函数运行于线程中完成对缓冲区的读、写动作,根据此处生产消费的模型的特点,生产者和消费者之间通过使用同步对象实现了生产和消费的同步与互斥,是本实验的核心所在。
另外三个辅助性函数被生产者和消费者函数调用,是上述生产和消费函数中对缓冲区进行的一系列处理。
定义一个数据结构,记录在测试文件中指定的每一个线程的参数。
1)用一个整型数组Buffer_Critical来代表缓冲区。不管是生产产品还是对已有的产品的消费都需要访问该组缓冲区。
2)进程信息ThreadInfo数据结构,包含线程的各个信息。
3)在实现本程序的消费生产模型时,具体的通过如下同步对象实现互斥:
①设一个互斥量h_mutex,以实现生产者在查询和保留缓冲区内的下一个位置时进行互斥。
②每一个生产者用一个信号量与其消费者同步,通过设置h_Semaphore[MAX_THREAD_NUM]信号量
③数组实现,该组信号量用于相应的产品已产生。同时用一个表示空缓冲区数目的信号量empty_semaphore进行类似的同步,只是缓冲区中是否存在空位置,以便开始生产下一个产品。
④每一个缓冲区用一个同步对象实现该缓冲区上消费者之间的互斥,这通过设置临界区对象数组PC_Crilical[MAX_BUFFER_NUM]实现。
1.4程序代码
2实验结果及问题分析
2.1 测试结果
测试文件内容为:
运行程序如下图主菜单页面所示:
2.2结果分析
由于我们在一个循环中创建了这五个线程,所以认为它们是同时开始运转的。根据第三列的延迟时间,最早开动作的是thread 4生产产品。它5个缓冲区的位置[1]中生产了产品。接下来是线程 5和1,消费者 5要求消费线程 1生产的产品,线程 1还没有生产,所以先阻塞,然后, 线程 1发送生产请求,线程 1生产完产品放入位置[2],消费者5才能够消费,接着消费者5要求消费线程 2的产品,此产品还没生产,5线程被阻塞。到第4秒时,线程 2要求生产,产品放入位置[3],消费者3消费线程 1的产品.此时线程 5所要求消费的产品已经都就绪,所以线程 5消费被激活,顺利消费线程 1,2,4生产者得产品。所以,由于对每个产品的都是对它的最后一次消费,所以,消费完产品后随即释放该产品所占缓冲区空间。