北邮操作系统进程同步实验报告及源代码

上传人:飞*** 文档编号:39732902 上传时间:2018-05-19 格式:DOCX 页数:7 大小:261.44KB
返回 下载 相关 举报
北邮操作系统进程同步实验报告及源代码_第1页
第1页 / 共7页
北邮操作系统进程同步实验报告及源代码_第2页
第2页 / 共7页
北邮操作系统进程同步实验报告及源代码_第3页
第3页 / 共7页
北邮操作系统进程同步实验报告及源代码_第4页
第4页 / 共7页
北邮操作系统进程同步实验报告及源代码_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《北邮操作系统进程同步实验报告及源代码》由会员分享,可在线阅读,更多相关《北邮操作系统进程同步实验报告及源代码(7页珍藏版)》请在金锄头文库上搜索。

1、进程管理实验报告进程管理实验报告1 1实验目的:实验目的:(1)理解进程/线程同步的方法,学会运用进程/线程同步的方法解决实际问题;(2)了解 windows 系统或 unix/linux 系统下中信号量的使用方法。2实验内容实验内容编写一个有关生产者和消费者的程序:每个生产者每次生产一个产品存入 仓库,每个消费者每次从仓库中取出一个产品进行消费,仓库大小有限,每次 只能有一个生产者或消费者访问仓库。要求:采用信号量机制。3、环境说明、环境说明本实验是在 win7 环境下使用 dev 编译器实现的,采用 Win API 的信号量机 制。4、程序设计说明程序设计说明该程序根据教材中的消费者生产者

2、问题编写的,使用了教材中提供的框架思路以及库函数,使用 CreateThread 建立新的线程,使用 CreateMutex 创建一个互斥信号量,使用 CreateSemaphore 创建信号量,使用 ReleaseMutex释放线程的互斥 信号量,使用 ReleaseSemaphore 对指定的信号量增加指定的值,使用 WaitForSingleObject 等待空位,使用 CloseHandle 在操作结束后关闭线程和信号量。在这个程序里我设计了三个函数:Int main()是主函数,其中包含了缓冲区大小的设置,生产者消费者发出请求等内容以及线程创建等内容DWORD WINAPI prod

3、ucer(LPVOID lpPara)是生产者等待缓冲区的使用权并对缓冲区进行操作DWORD WINAPI consumer(LPVOID lpPara)是消费者等待缓冲区的使用权并对缓冲区进行操作该程序模拟生产者消费者问题,首先要设置缓冲区的大小,输入请求资源的 各个进程的信息以及请求时间,并且按照请求时间对各进程进行排序,创建线 程,然后按序依次对缓冲区进行操作,详细设计见源代码。5 5、程序运行结果截图:、程序运行结果截图:只有生产者请求,没有消费者请求,请求满足只有消费者请求,没有生产者请求,消费者的请求不成功:生产者请求大于消费者请求并且消费者请求在生产者放入产品之后:消费者请求多于

4、生产者请求,只能满足部分消费者请求,不能满足全部:6、源代码:、源代码:#include #include #include #include #include #include using namespace std; #define MAX_BUF 1000 #define MAX_REQ 20 HANDLE mutex; HANDLE full; HANDLE empty; HANDLE threadMAX_REQ; DWORD pro_idMAX_REQ; DWORD con_idMAX_REQ;struct requestint type;/记录生产者消费者的类型int seq; /

5、记录请求次序 reqMAX_REQ; int buf_size; int req_size; int no; int bufferMAX_BUF; int in; int out; int result;bool cmp(request a,request b) return a.seqb.seq;DWORD WINAPI producer(LPVOID lpPara) WaitForSingleObject(full,INFINITE);WaitForSingleObject(mutex,INFINITE); printf(“生产者%d 将第%d 号产品放入缓冲区n“,(int)lpPara

6、,no);bufferin=no+;in=(in+1)%buf_size;printf(“成功放入缓冲区!nn“,(int)lpPara);ReleaseMutex(mutex);ReleaseSemaphore(empty,1,NULL); return 0; DWORD WINAPI consumer(LPVOID lpPara) WaitForSingleObject(empty,INFINITE);WaitForSingleObject(mutex,INFINITE); printf(“消费者%d 将第%d 号产品从缓冲区取出n“,(int)lpPara,bufferout);buff

7、erout=0; printf(“成功从缓冲区取出!nn“,(int)lpPara);ReleaseMutex(mutex);out=(out+1)%buf_size;ReleaseSemaphore(full,1,NULL); return 0; int main() int i; int p=0;no = 1;in=out=0;memset(buffer, 0, sizeof(buffer); printf(“请设置缓冲区大小:“);scanf(“%d“,printf(“请输入请求使用资源进程的个数:“);scanf(“%d“,for(i=0;ireq_size;i+)printf(“请选

8、择是消费者进程(0)还是生产者进程(1):“);scanf(“%d“,printf(“请输入该进程的请求时间:“); scanf(“%d“, sort(req,req+req_size,cmp);mutex=CreateMutex(NULL,FALSE,NULL);full=CreateSemaphore(NULL,buf_size,buf_size,NULL);empty=CreateSemaphore(NULL,0,buf_size,NULL); for(i=0;ireq_size;i+)if(reqi.type=0)threadi=CreateThread(NULL, 0, consum

9、er, (LPVOID)i, 0, if(threadi=NULL)return -1;printf(“n 消费者请求从缓冲区中取产品,请求时间为%dn“,reqi.seq);if(reqi.type=1)threadi=CreateThread(NULL,0,producer,(LPVOID)i,0, if(threadi=NULL)return -1;printf(“n 生产者请求往缓冲区中放产品,请求时间为%dn“,reqi.seq); result = WaitForMultipleObjects(req_size, thread, TRUE, 500);if (result = WA

10、IT_TIMEOUT)printf(“n 请求不能被完全满足n“);elseprintf(“n 能够满足所有请求 n“);for(int i=0; ireq_size; i+)CloseHandle(threadi);CloseHandle(mutex);CloseHandle(full);CloseHandle(empty);system(“pause“);return 0; 7、实验总结:、实验总结:本次实验基于书上的生产者消费者问题,原理在上课的时候老师已经详细地 讲解过,但是在具体编程实现的过程中也遇到了很多问题,除了书上的库函数 之外还有一些函数书上并没有给出用法,比如如何创建线程等函数,通过查阅 参考相关资料解决,通过编写代码也系统地理解了生产者消费者问题的操作过 程,线程的创建,信号量的创建以及信号量的使用方法等情况,遇到的好多编 代码上的细节问题通过反复调试解决,有较大收获。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 其它文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号