大工20秋《操作系统》大作业题目及要求答案.pdf

上传人:修**** 文档编号:75976771 上传时间:2023-03-06 格式:PDF 页数:12 大小:407.74KB
返回 下载 相关 举报
大工20秋《操作系统》大作业题目及要求答案.pdf_第1页
第1页 / 共12页
大工20秋《操作系统》大作业题目及要求答案.pdf_第2页
第2页 / 共12页
点击查看更多>>
资源描述

《大工20秋《操作系统》大作业题目及要求答案.pdf》由会员分享,可在线阅读,更多相关《大工20秋《操作系统》大作业题目及要求答案.pdf(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、学习中心:学习中心:层层次:次:专专业:业:年年级:级:学学号:号:姓姓名:名:题题目目:进程同步与互斥 生产者与消费者问题1.1.谈谈你对本课程学习过程中的心得体会与建议?谈谈你对本课程学习过程中的心得体会与建议?转眼间,学习了一个学期的计算机操作系统课程即将结束。在这个学期中,通过老师的悉心教导,让我深切地体会到了计算机操作系统的一些原理和具体操作过程。在学习操作系统之前,我只是很肤浅地认为操作系统只是单纯地讲一些关于计算机方面的操作应用,并不了解其中的具体操作过程和实用性。通过这一学期的学习,我才知道操作系统(Operating System,简称 OS)是管理计算机系统的全部硬件资源包

2、括软件资源及数据资源;控制程序运行;改善人机界面;为其它应用软件提供支持等,使计算机系统所有资源最大限度地发挥作用,为用户提供方便的、有效的、友善的服务界面。题目四:进程同步与互斥题目四:进程同步与互斥 生产者与消费者问题生产者与消费者问题设计思路:生产者消费者问题是一种同步问题的抽象描述。计算机系统中的每个进程都可以消费或生产某类资源。当系统中某一进程使用某一资源时,可以看作是消耗,且该进程称为消费者。而当某个进程释放资源时,则它就相当一个生产者。流程(原理)图:1、生产者2、消费者基本内容:通过一个有界缓冲区(用数组来实现,类似循环队列)把生产者和消费者联系起来。假定生产者和消费者的优先级

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

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

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

6、#include const unsigned short SIZE_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;/控

7、制程序运行:1 表示继续运行,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 s

8、hort THREADS_COUNT=PRODUCERS_COUNT+CONSUMERS_COUNT;/总线程数HANDLE hThreadsPRODUCERS_COUNT;/各线程的 handleDWORD producerIDCONSUMERS_COUNT;/生产者线程的标识符DWORD consumerIDTHREADS_COUNT;/消费者线程的标识符/*-生产一个产品开始-*/生产一个产品,输出其 ID 号void Produce()/*-生产一个产品结束-*/*-把新生产的产品放入缓冲区开始-*/把新生产的产品放入缓冲区void Append()std:cerr把生产的产品送入缓冲

9、区;g_bufferin=ProductID;std:coutstd:endl;std:cerr生产一个产品:+ProductID;std:coutstd:endl;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(i=out)std:coutstd:endl;i

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

11、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:couti g_bufferi;std:coutstd:endl;std:cerr消费一个产品:ConsumeID;std:coutstd:endl;elsestd:couti g_bufferi;if(i=in)if(i=out)std:coutstd:endl;if(g_bufferi10)st

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

13、WORD WINAPI Consumer(LPVOID lpPara)while(g_continue)/资源信号量的 P 操作WaitForSingleObject(g_hEmptySemaphore,INFINITE);/互斥信号量的 P 操作WaitForSingleObject(g_hMutex,INFINITE);/从缓冲区中取出一个产品Take();return 0;WaitForSingleObject(g_hMutex,INFINITE);/生产一个产品Produce();/把新生产的产品放入缓冲区Append();Sleep(2000);/互斥信号量的 V 操作Release

14、Mutex(g_hMutex);/资源信号量的 V 操作ReleaseSemaphore(g_hEmptySemaphore,1,NULL);/消费一个产品Consume();Sleep(2000);/互斥信号量的 V 操作/*-消费者线程结束-*/*-创建生产者线程开始-*/void createPT()/创建生产者线程/*-创建生产者线程结束-*/*-创建消费者线程开始-*/void createCT()/创建消费者线程for(int j=0;jCONSUMERS_COUNT;+j)hThreadsi=CreateThread(NULL,0,Producer,NULL,0,&produce

15、rIDi);if(hThreadsi=NULL)g_continue=0;for(int i=0;iPRODUCERS_COUNT;+i)return 0;ReleaseMutex(g_hMutex);/资源信号量的 V 操作ReleaseSemaphore(g_hFullSemaphore,1,NULL);hThreadsPRODUCERS_COUNT+j=CreateThread(NULL,0,Consumer,NULL,0,&consumerIDj);/*-创建消费者线程结束-*/*-主函数开始-*/void main()/显示程序提示信息info();/创建互斥信号量g_hMutex=

16、CreateMutex(NULL,FALSE,NULL);/创建资源信号量g_hFullSemaphore=CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUif(hThreadsj=NULL)g_continue=0;FFER-1,NULL);g_hEmptySemaphore=CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL);/创建生产者线程createPT();/创建消费者线程createCT();/不按回车键的话程序会一直运行下去while(g_continue)/按回车键终止程序if(getchar()g_continue=0;/*-主函数结束-*/

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

当前位置:首页 > 管理文献 > 企业管理

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁