进程同步机制与互斥-生产者消费者问题
学习中心:学习中心: 专专业:业: 年年级:级:年春/秋 季 学学号:号: 学学生:生: 题题目目: :进程同步与互斥 生产者-消费者问题 1. 1.谈谈你对本课程学习过程中的心得体会与建议?谈谈你对本课程学习过程中的心得体会与建议? 转眼间,学习了一个学期的计算机操作系统课程即将结束。在这个学期中,通 过老师的悉心教导, 让我深切地体会到了计算机操作系统的一些原理和具体操作 过程。 在学习操作系统之前,我只是很肤浅地认为操作系统只是单纯地讲一些关 于计算机方面的操作应用,并不了解其中的具体操作过程和实用性。通过这一学 期的学习,我才知道操作系统(Operating System,简称 OS)是管理计算机系统的 全部硬件资源包括软件资源及数据资源;控制程序运行;改善人机界面;为其它 应用软件提供支持等,使计算机系统所有资源最大限度地发挥作用,为用户提供 方便的、有效的、友善的服务界面。操作系统这门课程并不是教你如何使用操作 系统的,而是讲操作。总而言之,操作系统的一些原理在生活中都可以找到相应 的例子。结合生活中的例子,可以化抽象为具体,我们会更加清楚地了解到其原 理与操作过程。我觉得通过我们的不断学习,结合生活中的实际问题,我们就会 把操作系统学得更好。总体来说,通过这次的对操作系统的总结,有收获也有遗 憾、不足的地方,但我想,我已经迈入了操作系统的大门,只要我再认真努力的 去学习,去提高,肯定能让自己的知识能力更上一层楼. 第1页 / 共13页 1 1设计思路及主要代码分析设计思路及主要代码分析 1.11.1 设计思路设计思路 在这次设计中定义的多个缓冲区不是环形循环的, 并且不需要按 序访问。其中生产者可以把产品放到某一个空缓冲区中, 消费者只能 消费被指定生产者生产的产品。 本设计在测试用例文件中指定了所有 生产和消费的需求, 并规定当共享缓冲区的数据满足了所有有关它的 消费需求后,此共享才可以作为空闲空间允许新的生产者使用。 本设计在为生产者分配缓冲区时各生产者之间必须互斥, 此后各 个生产者的具体生产活动可以并发。 而消费者之间只有在对同一个产 品进行消费时才需要互斥, 它们在消费过程结束时需要判断该消费者 对象是否已经消费完毕并释放缓冲区的空间。 第2页 / 共13页 1.21.2 程序流程图程序流程图 结束消费进程结束消费进程 主函数主函数 初始化缓冲区,消费请求 队列及部分同步对象 消费者消费者 N 生产者生产者 N 有消费请求? Y 存在空缓冲区? Y 提取线程信息 此请求可满足? Y N 另一生产者正在生产? N Y 完成线程相关同步对象的 初始化 确定产品位置 Y 进入临界区 (所有生产者之间互斥) 此产品正被消费? 创建线程模拟生产和消费 N从空缓冲区中为本生产者 的产品分配一个空间 进入临界区(对同一产品进 等待所有线程结束 行请求的消费者之间互斥) 退出临界区 消费产品、并判断是否应该 程序结束程序结束 释放产品所占缓冲区在该缓冲区放入产品 退出临界区通过信号量通知等待本产 品的消费者 结束生产进程结束生产进程 第3页 / 共13页 1.31.3基本内容 基本内容 在设计程序时主要有三个主体部分、 三个辅助函数和一个数据结 构。 其中主体部分为一个主函数 main() ,用于初始化缓冲区和各个 同步对象,并完成线程信息的读入,最后根据该组的线程记录启动模 拟线程,并等待所有线程的运行结束后退出程序; 生产者函数 Produce()和消费者函数Consume() ,生产者和消 费者函数运行于线程中完成对缓冲区的读、 写动作,根据此处生产消 费的模型的特点, 生产者和消费者之间通过使用同步对象实现了生产 和消费的同步与互斥,是本实验的核心所在。 另外三个辅助性函数被生产者和消费者函数调用, 是上述生产和 消费函数中对缓冲区进行的一系列处理。 定义一个数据结构,记录在测试文件中指定的每一个线程的参 数。 1)用一个整型数组 Buffer_Critical 来代表缓冲区。 不管是生产 产品还是对已有的产品的消费都需要访问该组缓冲区。 2)进程信息 ThreadInfo 数据结构,包含线程的各个信息。 struct ThreadInfo { int serial;//线程序列号 char entity;//是 P 还是 C double delay;//线程延迟 int thread_request[MAX_THREAD_NUM];//线程请求队列 第4页 / 共13页 int n_request;//请求个数 }; 3)在实现本程序的消费生产模型时, 具体的通过如下同步对象实 现互斥: ①设一个互斥量 h_mutex,以实现生产者在查询和保留缓冲 区内的下一个位置时进行互斥。 ②每一个生产者用一个信号量与其消费者同步,通过设置 h_Semaphore[MAX_THREAD_NUM]信号量 ③数组实现,该组信号量用于相应的产品已产生。同时用一 个表示空缓冲区数目的信号量 empty_semaphore 进行类似的同步, 只是缓冲区中是否存在空位置,以便开始生产下一个产品。 ④每一个缓冲区用一个同步对象实现该缓冲区上消费者之间 的互斥, 这通过设置临界区对象数组 PC_Crilical[MAX_BUFFER_NUM] 实现。 1.41.4 程序代码程序代码 #include #include #include #include #include #include #define MAX_BUFFER_NUM10 #define INTE_PER_SEC 1000 #define MAX_THREAD_NUM64 第5页 / 共13页 //定义一个结构,记录在测试文件中指定的每一个线程的参数 struct ThreadInfo { //进程信息 ThreadInfo 数据结构,包含线程的各个信息 intserial;//线程序列号 char entity;//是 P 还是 C int delay;//线程延迟 int thread_request[MAX_THREAD_NUM];//线程请求队列 int n_request;//请求个数 }; //每一个缓冲区用一个同步对象实现该缓冲区上消费者之间的互斥,这通过设置临界 区对象数组 PC_Crilical[MAX_BUFFER_NUM]实现。 CRITICAL_SECTIONPC_Critical [MAX_BUFFER_NUM]; //用一个整型数组 Buffer_Critical 来代表缓冲区。 不管是生产产品还是对已有的产品 的消费都需要访问该组缓冲区。 int Buffer_Critical[MAX_BUFFER_NUM]; HANDLEh_Thread[MAX_THREAD_NUM]; ThreadInfo Thread_Info[MAX_THREAD_NUM]; //设一个互斥量 h_mutex,以实现生产者在查询和保留缓冲区内的下一个位置时进行 互斥。 HANDLE h_mutex; // 每 一 个 生 产 者 用 一 个 信 号 量 与 其 消 费 者 同 步 , 通 过 设 置 h_Semaphore[