北邮操作系统进程同步实验报告及源代码_第1页
北邮操作系统进程同步实验报告及源代码_第2页
北邮操作系统进程同步实验报告及源代码_第3页
北邮操作系统进程同步实验报告及源代码_第4页
已阅读5页,还剩6页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

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

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

4、求,只能满足部分消费者请求,不能满足全部:可编辑-精选文档 -6、源代码:#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>#include <windows.h>using namespace std;#define MAX_BUF 1000#define MAX_REQ 20可编辑-精选文档 -HANDLE mutex;HANDLE full;HANDLE empty;HANDLE th

5、readMAX_REQ;DWORDpro_idMAX_REQ;DWORDcon_idMAX_REQ;struct requestint type;/记录生产者消费者的类型int seq;/ 记录请求次序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.seq<b.seq;DWORD WINAPI producer(LPVOID lpPara)可编辑-精选文档 -WaitForSingle

6、Object(full,INFINITE);WaitForSingleObject(mutex,INFINITE);printf(" 生产者 %d 将第 %d 号产品放入缓冲区 n",(int)lpPara,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)WaitForSi

7、ngleObject(empty,INFINITE);WaitForSingleObject(mutex,INFINITE);printf("消 费 者 %d将 第 %d号 产 品 从 缓 冲 区 取 出 n",(int)lpPara,bufferout);bufferout=0;printf(" 成功从缓冲区取出 !nn",(int)lpPara);ReleaseMutex(mutex);可编辑-精选文档 -out=(out+1)%buf_size;ReleaseSemaphore(full,1,NULL);return 0;int main()int

8、 i;int p=0;no = 1;in=out=0;memset(buffer, 0, sizeof(buffer);printf(" 请设置缓冲区大小: ");scanf("%d",&buf_size);printf(" 请输入请求使用资源进程的个数:");scanf("%d",&req_size);for(i=0;i<req_size;i+)printf(" 请选择是消费者进程 (0)还是生产者进程 (1):");scanf("%d",&r

9、eqi.type);printf(" 请输入该进程的请求时间:");scanf("%d",&reqi.seq);可编辑-精选文档 -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;i<req_size;i+)if(reqi.type=0)threadi=Create

10、Thread(NULL,0,consumer,(LPVOID)i,0,&con_idi);if(threadi=NULL)return -1;printf("n消费者请求从缓冲区中取产品,请求时间为 %dn",reqi.seq);if(reqi.type=1)threadi=CreateThread(NULL,0,producer,(LPVOID)i,0,&pro_idi);if(threadi=NULL)return -1;printf("n生产者请求往缓冲区中放产品,请求时间可编辑-精选文档 -为 %dn",reqi.seq);res

11、ult = WaitForMultipleObjects(req_size, thread, TRUE, 500);if (result = WAIT_TIMEOUT)printf("n请求不能被完全满足 n");elseprintf("n能够满足所有请求n");for(int i=0; i<req_size; i+)CloseHandle(threadi);CloseHandle(mutex);CloseHandle(full);CloseHandle(empty);system("pause");return 0;7、实验总结:本次实验基于书上的生产者消费者问题,原理在上课的时候老师已经详

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论