大工19春《操作系统》大作业答案_第1页
大工19春《操作系统》大作业答案_第2页
大工19春《操作系统》大作业答案_第3页
大工19春《操作系统》大作业答案_第4页
大工19春《操作系统》大作业答案_第5页
免费预览已结束,剩余12页可下载查看

付费下载

下载本文档

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

文档简介

1、网络教育学院程设计题 目 : 进程同步与互斥生产者 - 消费者问题学习中心:层次:专业:计算机网络技术年级:年 秋季学号:学生:辅导教师:完成日期:年 月 日题目四:进程同步与互斥生产者-消费者问题设计思路: 生产者消费者问题是一种同步问题的抽象描述。计算机系统中的每个进程都可以消费或生产某类资源。一资源时,可以看作是消耗,且该进程称为消费者。而当某个进程释放资源时,则它就相当一个生产者。流程(原理)图:1、生产者2、消费者通过一个有界缓冲区( 用数组来实现,类似循环队列) 把生产者和消费者联系起来。 假定生产者和消费者的优先级是相同的,只要缓冲区未满,生产者就可以生产产品并将产品送入缓冲区。

2、类似地, 只要缓冲区未空,消费者就可以从缓冲区中去走产品并消费它。应该禁止生产者向满的缓冲区送入产品,同时也应该禁止消费者从空的缓冲区中取出产品,这一机制有生产者线程和消费者线程之间的互斥关系来实现。为解决生产者/消费者问题,应该设置两个资源信号量,其中一个表示空缓冲区的数目,用g_hFullSemaphore 表示,其初始值为有界缓冲区的 大 小SIZE_OF_BUFFE;R 另 一 个 表 示 缓 冲 区 中 产 品 的 数 目 , 用g_hEmptySemaphore表示,其初始值为 0。另外,由于有界缓冲区是一个临界资源,必须互斥使用,所以还需要再设置一个互斥信号量g_hMutex,起

3、初值为1。在生产者 /消费者问题中,信号量实现两种功能。首先,它是生产产品和消费产品的计数器,计数器的初始值是可利用的资源数目( 有界缓冲区的长度) 。其次,它是确保产品的生产者和消费者之间动作同步的同步器。生产者要生产一个产品时,首先对资源信号量g_hFullSemaphore 和互斥信号量 g_hMutex进行 P操作,申请资源。如果可以通过的话,就生产一个产品,并 把 产 品 送 入 缓 冲 区 。 然 后 对 互 斥 信 号 量 g_hMutex 和 资 源 信 号 量 g_hEmptySemaphore进行V操作,释放资源。消费者要消费一个产品时,首先对资源信号量g_hEmptySe

4、maphore和互斥信号量 g_hMutex进行 P操作,申请资源。如果可以通过的话,就从缓冲区取出一 个 产 品 并 消 费 掉 。 然 后 对 互 斥 信 号 量 g_hMutex 和 资 源 信 号 量 g_hFullSemaphore 进行 V操作,释放资源。如果缓冲区中已经没有可用资源,就把申请资源的进程添加到等待队列的队尾。 如果有一个资源被释放,在等待队列中的第一个进程被唤醒并取得这个资源的使用权。源代码:/ 本程序于2005.12.25 在 VC+6.0下运行通过/ 系统环境:Windows XP#include #include const unsigned short SI

5、ZE_OF_BUFFER = 20;/ 有界缓冲区长度 int g_bufferSIZE_OF_BUFFER;/ 开辟缓冲区,用数组表示,可以看成是一个循环队列unsigned short ProductID = 0;/ 新生产出来的产品的产品号unsigned short ConsumeID = 0;/ 被消耗的产品的产品号unsigned short in = 0;/ 产品进缓冲区时的缓冲区下标,用于记录生产者的指针位置unsigned short out = 0;/ 产品出缓冲区时的缓冲区下标,用于记录消费者的指针位置bool g_continue = 1;/ 控制程序运行:1 表示继续

6、运行,0 表示停止运行HANDLE g_hMutex;/线程间的互斥信号量HANDLE g_hFullSemaphore;/ 资源信号量:缓冲区满HANDLE g_hEmptySemaphore;/资源信号量:缓冲区空/DWORD WINAPI Producer(LPVOID);/生产者线程DWORD WINAPI Consumer(LPVOID);消费者线程/const unsigned short PRODUCERS_COUNT=4;/生产者的个数const unsigned short CONSUMERS_COUNT=3;/消费者的个数const unsigned short THREA

7、DS_COUNT=PRODUCERS_COUNT+CONSUMERS_COUNT;/ 总线程数HANDLE hThreadsPRODUCERS_COUNT各线程的 ;/handleDWORD producerIDCONSUMERS_COUN生产者线程的标识符T;/DWORD consumerIDTHREADS_COUNT消费者线程的标识符 ;/* 生产一个产品开始*/ 生产一个产品,输出其ID 号void Produce()std:coutstd:endl;std:cerr 生产一个产品: +ProductID;std:coutstd:endl;/* 生产一个产品结束*/* 把新生产的产品放入

8、缓冲区开始*/ 把新生产的产品放入缓冲区void Append()std:cerr 把生产的产品送入缓冲区;g_bufferin=ProductID;in=(in+1)%SIZE_OF_BUFFER;std:cerrstd:endl;std:cout 缓冲区产品 生产者 /消费者 std:endl;/ 新产品放入缓冲区后,输出缓冲区当前的状态for(int i=0;iSIZE_OF_BUFFER;+i)/ 输出缓冲区下标if (i10)std:couti g_bufferi;elsestd:couti g_bufferi;if(i=in)if(g_bufferi10)std:cout ;els

9、estd:cout ;std:cout -生产者 ;/ 输出生产者的指针位置if(i=out)if(g_bufferi10)std:cout ;elsestd:coutstd:cout -消费者 ;/ 输出消费者的指针位置std:coutstd:endl;/* 把新生产的产品放入缓冲区结束*/* 消费一个产品开始*/void Consume()/ 消费一个产品std:coutstd:endl;std:cerr 消费一个产品: ConsumeID;std:coutstd:endl;/* 消费一个产品结束*/* 从缓冲区中取出一个产品开始*/ 从缓冲区中取出一个产品void Take() std:

10、coutstd:endl;std:cerr 从缓冲区取出一个产品;ConsumeID=g_bufferout;out=(out+1)%SIZE_OF_BUFFER;std:cerrstd:endl;std:coutstd:endl;std:cout 缓冲区产品 生产者 /消费者 std:endl;/ 取出一个产品后,输出缓冲区当前的状态for(int i=0;iSIZE_OF_BUFFER;+i)/ 输出缓冲区下标if(i10)std:coutig_bufferi;elsestd:couti g_bufferi;if(i=in)if(g_bufferi10)std:cout ;elsestd:

11、cout ;std:cout -生产者 ;/ 输出生产者的指针位置if(i=out)if(g_bufferi10)std:cout ;elsestd:cout ;std:cout -消费者 ;/ 输出消费者的指针位置std:coutstd:endl;/* 从缓冲区中取出一个产品结束*/* 生产者线程开始*/ 生产者线程DWORD WINAPI Producer(LPVOID lpPara)while(g_continue)/ 资源信号量的P 操作WaitForSingleObject(g_hFullSemaphore,INFINITE);/ 互斥信号量的P 操作WaitForSingleObj

12、ect(g_hMutex,INFINITE);/ 生产一个产品Produce();/ 把新生产的产品放入缓冲区Append();Sleep(2000);/ 互斥信号量的V操作ReleaseMutex(g_hMutex);/ 资源信号量的V操作ReleaseSemaphore(g_hEmptySemaphore,1,NULL);return 0;/* 生产者线程结束*/* 消费者线程开始*/ 消费者线程DWORD WINAPI Consumer(LPVOID lpPara)while(g_continue)/ 资源信号量的P 操作WaitForSingleObject(g_hEmptySemap

13、hore,INFINITE);/ 互斥信号量的P 操作WaitForSingleObject(g_hMutex,INFINITE);/ 从缓冲区中取出一个产品Take();/ 消费一个产品Consume();Sleep(2000);/ 互斥信号量的V操作ReleaseMutex(g_hMutex);/ 资源信号量的V操作ReleaseSemaphore(g_hFullSemaphore,1,NULL);return 0;/* 消费者线程结束*/* 创建生产者线程开始*/ void createPT()/ 创建生产者线程for(int i=0;iPRODUCERS_COUNT;+i)hThrea

14、dsi=CreateThread(NULL,0,Producer,NULL,0,&producerIDi);if(hThreadsi=NULL) g_continue=0;/* 创建生产者线程结束*/* 创建消费者线程开始*/ void createCT()/ 创建消费者线程 for (int j=0;jCONSUMERS_COUNT;+j)hThreadsPRODUCERS_COUNT+j=CreateThread(NULL,0,Consumer,NULL,0,& consumerIDj);if (hThreadsj=NULL)g_continue=0;/* 创建消费者线程结束*/* 主函数开始*/void main()/ 显示程序提示信息info();/ 创建互斥信号量g_hMutex=CreateMutex(NULL,FALSE,NULL);/ 创建资源信号量g_hFullSemaphore=CreateSemaphore(NULL,

温馨提示

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

最新文档

评论

0/150

提交评论