预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共17页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

操作系统 实验二 进程同步实验 班级:2010211306 学号: 10211295 姓名:龙佳 实验目的 理解进程/线程同步的方法,学会运用进程/线程同步的方法解决实际问题; 了解windows系统或unix/linux系统下中信号量的使用方法。 实验要求 编写一个有关生产者和消费者的程序:每个生产者每次生产一个产品存入仓库,每个消费者每次从仓库中取出一个产品进行消费,仓库大小有限,每次只能有一个生产者或消费者访问仓库。要求:采用信号量机制。 3:实验环境: Win7+DEV或者VS2012 4:实验思考与设计 这是一个很典型的生产者和消费者的问题。在该题中生产者和消费者的个数显然不止一个,而且仓库的大小也是未知的,这都需要用户自己来自定义。 那么我看到这题的时候我马上想到的便是写出这个问题的简化的流程图。 对于生产者其流程图如下: 对于消费者其流程图如下: 那么这么设计的原因是什么了? 首先有一个仓库需要实现互斥访问,故需要互斥控制量mutex;然后消费者能够进入仓库的原因是因为仓库中有产品可消耗,故需要一个信号量full来表示仓库中是否有产品。那么对应的对于生产者必须是在仓库空余的条件下,才能将产品放入仓库中,故需要用信号量empty来表示此时仓库是否空余能放入生产者生产的产品。 到底是用面向对象的的程序设计还是面向过程的程序设计了? 由于本题我在使用面向对象的时候觉得有点繁忙,所以最终还是采用了面向过程的方法来解决该问题,故导致代码的可移植性不高。 5实验接口的相关知识 本次实验运行在windows的平台上,故我们需要了解相关的关于win32API所提供的系统调用的方法(接口函数) CreateThread(用来创建线程) CreateMutex创建一个互斥体: CreateSemaphore创建一个新的信号量: ReleaseMutex释放由线程拥有的一个互斥体 ReleaseSemaphore对指定的信号量增加指定的值 WaitForSingleObject WaitForMultipleObjects CloseHandle 6:实验流程 首先由用户来指定仓库的大小,以及同时进行的线程个数,此处并不进行随机创建,虽然实验结果一致。 然后根据用户提供的线程对临界区的访问来确定接下来的线程是否能否完成任务,一旦完不成输出进程无法全都完成。否则则输出实验完成 7:编程实现 //datadefine.h #ifndef_DATA_DEFINE_H_ #define_DATA_DEFINE_H #include<iostream> #include<windows.h> typedefHANDLESemaphore;//信号量的定义 typedefintsize;//数据大小定义 typedefintBoundary;//缓冲区边界定义 typedefintBuffer_Kind;//定义缓冲区数据类型 typedefintkind_of_request;//请求类型 typedefintTime;//定义时间类型 typedefintProcess_Kind; typedefintSequence_number; /*最大缓冲区*/ constsizeMAX_BUFFER=256; constsizeMAX_REQUEST=20; structnode { Process_Kindcon_or_prod;//请求者的类型 Timeconsume_time;//占用时间 }; typedefstructnodePro; #endif //Process_synchronization.h #ifndef_PROCESS_SYNCHRONIZATION_H_ #define_PROCESS_SYNCHRONIZATION_H_ #include"data_define.h" /*缓冲区的边界设置实现一个循环队列*/ Boundaryon;//上边界 Boundaryoff;//下边界 /*定义缓冲区数组(队列)*/ Buffer_Kindbuffer[MAX_BUFFER]; /*定义请求队列(包含请求的进程类型,进程所占用的时间)*/ Prorequest[MAX_REQUEST]; /*定义三个信号量 mutex(对仓库访问的控制),empty(消费者消费的控制量),full(生产者生产的控制量) */ Semaphoremutex; Semaphorefull; Semaphoreempty; HANDLEtotal_thread[MAX_REQUES