进程同步机制与互斥-生产者消费者问题

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

学习中心:

专业:

年级:年春/秋季

学号:

学生:

题目:进程同步与互斥生产者-消费者问题

1.谈谈你对本课程学习过程中的心得体会与建议?

转眼间,学习了一个学期的计算机操作系统课程即将结束。在这个学期中,通过老师的悉心教导,让我深切地体会到了计算机操作系统的一些原理和具体操作过程。在学习操作系统之前,我只是很肤浅地认为操作系统只是单纯地讲一些关于计算机方面的操作应用,并不了解其中的具体操作过程

1.1设计思路

在这次设计中定义的多个缓冲区不是环形循环的,并且不需要按序访问。其中生产者可以把产品放到某一个空缓冲区中,消费者只能消费被指定生产者生产的产品。本设计在测试用例文件中指定了所有生产和消费的需求,并规定当共享缓冲区的数据满足了所有有关它的消费需求后,此共享才可以作为空闲空间允许新的生产者使用。

本设计在为生产者分配缓冲区时各生产者之间必须互斥,此后各个生产者的具体生产活动可以并发。而消费者之间只有在对同一个产品进行消费时才需要互斥,它们在消费过程结束时需要判断该消费者对象是否已经消费完毕并释放缓冲区的空间。

1.2程序流程图

1.3基本内容

在设计程序时主要有三个主体部分、三个辅助函数和一个数据结构。 其中主体部分为一个主函数main (),用于初始化缓冲区和各个同步对象,并完成线程信息的读入,最后根据该组的线程记录启动模拟线程,并等待所有线程的运

主函数

初始化缓冲区,消费请求队列及部分同步对象

提取线程信息

完成线程相关同步对象的初始化

等待所有线程结束

创建线程模拟生产和消费

程序结束

消费者

有消费请求?

此请求可满足?

确定产品位置

此产品正被消费?

进入临界区(对同一产品进

行请求的消费者之间互斥)

消费产品、并判断是否应该

释放产品所占缓冲区 结束消费进程

生产者

存在空缓冲区?

另一生产者正在生产?

进入临界区 (所有生产者之间互斥)

从空缓冲区中为本生产者的产品分配一个空间

退出临界区

在该缓冲区放入产品

通过信号量通知等待本产品的消费者

结束生产进程

退出临界区 Y

Y

Y

N

N

N

N

Y

Y

N

行结束后退出程序;

生产者函数Produce()和消费者函数Consume(),生产者和消费者函数运行于线程中完成对缓冲区的读、写动作,根据此处生产消费的模型的特点,生产者和消费者之间通过使用同步对象实现了生产和消费的同步与互斥,是本实验的核心所在。

另外三个辅助性函数被生产者和消费者函数调用,是上述生产和消费函数中对缓冲区进行的一系列处理。

3)在实现本程序的消费生产模型时,具体的通过如下同步对象实现互斥:

①设一个互斥量h_mutex,以实现生产者在查询和保留缓冲区内的下一个位置时进行互斥。

②每一个生产者用一个信号量与其消费者同步,通过设置h_Semaphore[MAX_THREAD_NUM]信号量

③数组实现,该组信号量用于相应的产品已产生。同时用一个表示空缓冲区

数目的信号量empty_semaphore进行类似的同步,只是缓冲区中是否存在空位置,以便开始生产下一个产品。

④每一个缓冲区用一个同步对象实现该缓冲区上消费者之间的互斥,这通过设置临界区对象数组PC_Crilical[MAX_BUFFER_NUM]实现。

1.4程序代码

运行程序如下图主菜单页面所示:

2.2结果分析

由于我们在一个循环中创建了这五个线程,所以认为它们是同时开始运转的。根据第三列的延迟时间,最早开动作的是thread4生产产品。它5个缓冲区的位置

[1]中生产了产品。接下来是线程5和1,消费者5要求消费线程1生产的产品,线

程1还没有生产,所以先阻塞,然后,线程1发送生产请求,线程1生产完产品放入位置[2],消费者5才能够消费,接着消费者5要求消费线程2的产品,此产品还没生产,5线程被阻塞。到第4秒时,线程2要求生产,产品放入位置[3],消费者3消费线程1的产品.此时线程5所要求消费的产品已经都就绪,所以线程5消费被激活,顺利消费线程1,2,4生产者得产品。所以,由于对每个产品的都是对它的最后一次消费,所以,消费完产品后随即释放该产品所占缓冲区空间。

相关文档
最新文档