(规格为A4纸或A3纸折叠)佛山科学技术学院(用四号宋体)实验报告(用小二号黑体)课程名称《操作系统原理》实验项目生产者-消费者模型模拟进程调度一、实验目的1.掌握基本的同步互斥算法,理解生产者和消费者模型。2.了解Windows2000/XP中多线程的并发执行机制,线程间的同步和互斥。3.学习使用Windows2000/XP中基本的同步对象,掌握相应的API。二、实验原理利用系统给的API函数创建生产者和消费者线程,来模拟生产者与消费者进程调度问题。1.初始化对象初始化(产品)缓冲区初始化(长度,进出缓冲区的记录)2.创建互斥信号信号量(Semaphore)CreateSemaphore()创建信号量对象;互斥量(Mutex)CreateMutex()创建互斥量对象;3.创建生产者线程和消费者线程CreateThread()创建线程WaitForSingleObject()等待单个线程WaitForMultipleObjects()等待多个线程ReleaseSemaphore()释放信号量ReleaseMutex()释放互斥量4.生产产品,消耗产品产品放入缓冲区,从缓冲区取产品输出缓冲区状态输出生产产品号,输出消耗产品号三、实验步骤1.利用windows提供的API函数CreateSemaphore()创建信号量对象;CreateThread()创建线程;WaitForSingleObject()执行P操作;ReleaseSemaphore()执行V操作;WaitForMultipleObjects()主进程等待线程的结束等函数进行设计。2.在Windows中,常见的同步对象有:信号量(Semaphore)、互斥量(Mutex)。使用这些对象都分为三个步骤,一、是创建或者初始化;二、接着请求该同步对象,随即进入临界区,这一步对应于互斥量的上锁;三、最后释放该同步对象,这对应于互斥量的解锁。这些同步对象在主进程中创建,在其子线程中都可。具体步骤有:1.在Windows2000/XP环境下,创建一个控制台进程,在此进程中创建n个线程来模拟生产者或消费者。2.根据题目要求提出生产者与消费者规则模型:首先要创建两个生产者和两个消费者线程。每个生产者每次只是生产一个产品,同样消费者每次消费一个产品。总共要生产50个产品和消费50个产品。3.建立一个循环的缓冲区,用in,out分别表示生产产品的位置和消费产品的位置。缓冲区大小为10,从0开始。并且每当生产者生产一个产品时,放到缓冲区里都会显示缓冲区的状态和in,out指针的位置来观看进程调度的情况。4.创建创建缓冲区空和满的信号量g_hEmptySemaphore、g_hFullSemaphore,还有一个g_hMutex的互斥量,来进行个进程间的同步与互斥。5.当生产者进入临界区前,申请同步对象g_hFullSemaphore信号量,还有申请互斥对象g_hMutex上锁,然后生产产品放入缓冲区,同样消费者进入临界区前,申请同步对象g_hEmptySemaphore信号量,还有申请互斥对象g_hMutex上锁,当离开时解锁,还有释放信号量。四、实验结果五、讨论分析1.生产者消费者函数问题。刚开始不是很了解同步这个概念,结果生产和消费是什么时候都分不清。后来才知道是由于2个生产者函数之间和2个消费者函数之间的Sleep()这个函数来确定的。2.程序结束问题。一开始我想让程序自动结束,初步想法是定义一个变量追踪实际线程数目,再定义一个常量为最大线程数目,当实际线程数目大于最大线程数目时程序结束(见我原程序注释掉了的变量及程序),此办法我运行后程序并不能如我想的结束,百思不得其解后我在生产者跟消费者的函数中都增加了标志量,以此来让程序结束。六、改进实验建议该设计是利用系统给的API函数创建生产者和消费者线程,来模拟生产者与消费者进程调度问题,虽然简化了编程的复杂度,不需要写类似于那API功能的函数,但是那系统API函数规范化了我们编写的程序,我们很难按照自己的要求和特点来编程。这是美中不足的地方。此系统中使用的是用VC++6.0实现的,由于我的经验不足及阅历颇浅,因此,在设计方面还有很多不足,比如代码不够优化等问题,我会在以后的学习、工作的过程中,根据工作的具体要求不断的修改,完善,争取使该系统慢慢趋向完美。我相信通过实践和理论相结合会使我更近一步。注:1、实验报告的内容:一、实验目的;二、实验原理;三、实验步骤;四、实验结果;五、讨论分析(完成指定的思考题和作业题);六、改进实验建议。2、各专业可在满足学校对实验教学基本要求的前提下,根据专业特点自行设计实验报告的格式,所设计的实验报告在使用前需交实践教学管理科备案。