版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
成绩《操作系统》课程设计报告专业:计算机科学与技术班级:08计本(2)班学号姓名题目名称:剪发师问题完毕日期:.6甘肃政法学院计算机科学学院
目录一.题目内容 2二.课程设计目的 3三.设计思想阐明 3四.系统构造的阐明 3(一)头文献声明 3(二)定义多个变量 3(三)信号量的定义 3(四)有关函数及线程的定义 3五.数据构造阐明 4六.程序用到的系统调用(API) 4七.程序总体算法流程图 4八.程序运行 5九.使用阐明书 7十.程序设计总结 7参考文献 8附录 8(一)代码清单 8(二)课程设计分工表 11睡眠剪发师问题一.题目内容有一种剪发师,一把剪发椅和n把提供应等待剪发的顾客座的椅子。如果没有顾客,则剪发师便在剪发椅子上睡觉;当第一种顾客到来时,必须唤醒该剪发师进行剪发;如果剪发师正在剪发时又有顾客到来,则如果有空椅子可坐,他就坐下来等待,如果没有空椅子,他就离开剪发店。为剪发师和顾客各编一段程序描述他们的行为,规定不能带有竞争条件,试用P、V操作实现。二.课程设计目的通过本次课程设计,能进一步彻底的搞清晰睡眠剪发师问题,能够举一反三,碰到同样的问题能够很快解决。通过自己的实际操作,认真分析,理解进程,线程,信号量之间的关系和他们的实现过程,掌握某些基本的系统调用的使用方法及其所实现的功效。用C++来实现睡眠剪发师的课程设计,达成复习C++有关知识的目的。三.设计思想阐明此题可看作是n个生产者和1个消费者问题。顾客作为生产者,每到来一种就使计数器count增加1,方便让剪发师剪发(相称于消费)至最后一种顾客(相称于产品)。并且,第1个到来的顾客应负责唤醒剪发师;如果不是第1个达成的顾客,则在有空椅子的状况下坐下等待,否则离开剪发店(该消息可由计数器count获得)。重要有下列某些函数来实现整个问题的实现过程:(1)用随机函数random()来产生进入剪发店的顾客。(2)定义剪发师的剪发函数cuthair()用来实现剪发操作。(3)定义顾客被剪发的函数gethaircut()用来实现顾客被剪发的操作。(4)用顾客线程customer实现对顾客行为的控制。(5)用剪发师线程barber实现对剪发师行为的控制。(6)定义主函数main实现对两个线程的控制和执行操作。四.系统构造的阐明(一)头文献声明#include"stdafx.h"#include"windows.h"#include"iostream.h"#include"math.h"(二)定义多个变量intlongwaiting(0);intchairs;charopen_door;charclose_door;intcount(0);intfinish(0);(三)信号量的定义DWORDa;%互斥信号量:mutex用来互斥对临界变量count的访问计数信号量customers用来统计等待的顾客数据,barbers用来统计等待的剪发师数,这里barbers只有两种取值,要不是0要不是1临界变量:count由剪发师进程和顾客进程共同访问,用来统计在椅子上等着的顾客数
N椅子数,为最多等待的顾客数HANDLEMutex=::CreateMutex(NULL,FALSE,"Mutex");HANDLEbarbers=::CreateSemaphore(NULL,1,1,"barbers");HANDLEcustomers=::CreateSemaphore(NULL,0,3,"customers");(四)有关函数及线程的定义定义随机函数intrandom()来产生顾客,并使两个顾客间的时间少于15秒定义剪发师的剪发函数voidcuthair(),用时15秒定义顾客被剪发的函数voidgethaircut()定义顾客线程DWORDWINAPIcustomer(LPVOIDpParm2)定义剪发师线程DWORDWINAPIbarber(LPVOIDpParm1)定义主函数实现线程的操作intmain(intargc,char*argv[])五.数据构造阐明本程序用到了数据构造中的队列,剪发的顾客由随机函数产生,顾客遵从先到先剪发的原则,但队列的长度限制为输入的剪发店中的椅子的个数,当剪发店的椅子没有空位的时候,到来的顾客主动退出加入队列。剪发师对队列中的顾客进行先到先服务的原则剪发。六.程序用到的系统调用(API)(1)CreateThread():创立线程(2)CreateMutex():找出现在系统与否已经存在指定进程的实例。如果没有则创立一种互斥体,用来同时。如果一种线程获取了互斥体,则要获取该互斥体的第二个线程将被挂起,直到第一种线程释放该互斥体。CreateMutex()函数可用来创立一种有名或无名的互斥量对象(3)CreateSemaphore():CreateSemaphore()是系统提供的API,包含在Windows.h中,应用在同时的解决中。作用是创立一种新的信号机,执行成功,返回信号机对象的句柄;零表达出错。一旦不再需要,一定记住用CloseHandle关闭信号机的句柄。它的全部句柄都关闭后来,对象自己也会删除。一旦值不不大于零,信号机就会触发(发出信号)。Semaphore是一种同时问题机制,不管是Event或Mutex,其它Process在执WaitForSingleObject时,就看当时的物件是Signal或UnSignal而决定与否等待,而Semaphore也相似,但是它要变成Signal/UnSignal的状态,却有些不同,它是提供一种计数值,它允许在这个计数值之内,任何执行到WaitForSingleObject的Thread都不会停下来,并且每执行WaitForSingleObject一次,计数值就减一,当计数值变成0时,该Semaphore才会处於UnSignal的状态,而某个ThreadReleaseSemaphore时,便会将计数值增加,方便其它的Thread或本身可得Signal的讯号,而使WaitForSingleObject停止等待。(4)ReleaseSemaphore():ReleaseSemaphore()函数的作用是增加信号机的计数。如果成功,就调用信号机上的一种等待函数来减少它的计数。(5)WaitForSingleObject():函数用来检测hHandle事件的信号状态,在某一线程中调用该函数时,线程临时挂起,如果在挂起的dwMilliseconds毫秒内,线程所等待的对象变为有信号状态,则该函数立刻返回;如果超时时间已经达成dwMilliseconds毫秒,但hHandle所指向的对象还没有变成有信号状态,函数照样返回。参数dwMilliseconds有两个含有特殊意义的值:0和INFINITE。若为0,则该函数立刻返回;若为INFINITE,则线程始终被挂起,直到hHandle所指向的对象变为有信号状态时为止。(6)ResumeThread():线程恢复函数,使用该函数能激活线程的运行,使CPU分派资源让线程恢复运行。(7)ReleaseMutex():释放由线程拥有的一种互斥体(8)Sleep():睡眠等待七.程序总体算法流程图程序开始程序开始键入店中的椅子数键入店中的椅子数与否开始接待顾客与否开始接待顾客尚未营业尚未营业Mutex剪发师线程True顾客线程False有空椅等待是离开有顾客等待休息否剪发师在睡觉则唤醒剪发,否则继续是八.程序运行(1)键入店中的椅子数(2)键入椅子数后询问与否接待顾客(3)开始接待顾客,第一种顾客到来(4)依次有顾客到来(5)尚有顾客依次到来九.使用阐明书打开VC++6.00编译环境,新建工程名,将上述代码复制粘贴编译运行即可看到运行窗口。然后根据窗口提示,从键盘输入椅子数并按回车键即可。然后再根据提示,即可进行对应操作。其中某些窗口内容如上面某些截图所示。十.程序设计总结通过这次课程设计,我们搜索了剪发师问题的有关资料,又对课本知识进行了进一步的进一步学习。在完毕该程序的编写的过程中,使我对课堂上所学的理论知识有了一种更深更具体的认识,特别对操作系统课程中的信号量,线程,中断等内容有了进一步的认识,并吸取整合了网络上某些优秀的代码,经历了不少艰辛,终于完毕了此项任务。总的来讲,本次课程设计对我们操作系统知识的巩固起了重要作用,让我们受到了诸多启发,懂得了如何更加好的去学习操作系统课程。在做的过程中也碰到诸多问题。重要有:为什么现在我在vs中编写c++程序还要加上#include"stdafx.h"这样一句,不加就报错?名称的英文全称为:StandardApplicationFrameworkExtensions。分析因素以下头文献预编译,就是把一种工程(Project)中使用的某些MFC原则头文献(如Windows.H、Afxwin.H)预先编译,后来该工程编译时,不再编译这部分头文献,仅仅使用预编译的成果。这样能够加紧编译速度,节省时间。预编译头文献通过编译stdafx.cpp生成,以工程名命名,由于预编译的头文献的后缀是“pch”,因此编译成果文献是projectname.pch。(一)代码清单#include"stdafx.h"#include"windows.h"#include"iostream.h"#include"math.h"intlongwaiting(0);//等待剪发的顾客人数intchairs;//店中椅子的总数目charopen_door;//开门charclose_door;//关门intcount(0);//顾客的序号intfinish(0);//已经理完发的顾客人数DWORDa;(无符号整数32位)HANDLEMutex=::CreateMutex(NULL,FALSE,"Mutex");//用来实现进程的互斥HANDLEbarbers=::CreateSemaphore(NULL,1,1,"barbers");//定义信号量来进行线程间的同时HANDLEcustomers=::CreateSemaphore(NULL,0,3,"customers");//定义信号量来进行线程间的同时intrandom()//定义随机函数来产生顾客,并使两个顾客间的时间少于15秒{return(rand()*15000)/RAND_MAX;}voidcuthair()//剪发师的剪发函数,用时15秒{ ::Sleep(15000); cout<<"剪发结束!"<<endl;}voidgethaircut()//顾客被剪发的函数{ ::Sleep(15001);//顾客被剪发的函数,为了和剪发师之间有所区别,比剪发师剪发时间长1毫秒 cout<<"第"<<finish<<"个顾客剪发完毕,离开"<<endl;}DWORDWINAPIcustomer(LPVOIDpParm2)//顾客线程{ ::WaitForSingleObject(Mutex,INFINITE);//P(mutex)来进行互斥操作 count++;//来的是第几个顾客 cout<<"顾客敲门!第"<<count<<"个顾客到来"<<endl; if(waiting<chairs)//如果有空椅子 { if(waiting!=0) { cout<<"现在有"<<waiting<<"个人在等待剪发"<<endl; } else cout<<"无人在等待剪发"<<endl;//输出有多少人在等待 waiting++; cout<<"剩余"<<chairs-waiting+1<<"个座位"<<endl; cout<<"有空位,顾客已坐下"<<endl; ::ReleaseSemaphore(customers,1,NULL); //V(customer) ::ResumeThread(customers); //唤醒剪发师进程 ::ReleaseMutex(Mutex); //释放互斥量,方便其它线程使用 ::WaitForSingleObject(barbers,INFINITE);//等待剪发 gethaircut(); //剪发并离开 } else { cout<<"没有空椅子,第"<<count<<"个顾客离开剪发店"<<endl;//没有椅子,顾客直接离开 ::ReleaseMutex(Mutex); }return0;}DWORDWINAPIbarber(LPVOIDpParm1)//剪发师线程{while(true)//外循环{ ::WaitForSingleObject(customers,INFINITE);//p(customers),等待顾客 ::WaitForSingleObject(Mutex,INFINITE);//等待互斥量waiting--;//等待的人数减1 ::ReleaseSemaphore(barbers,1,NULL);//释放信号量 ::ResumeThread(barbers);//唤醒顾客进程 ::ReleaseMutex(Mutex);//v(mutex); cuthair();//剪发 finish++;//剪发完毕的顾客数目加1}return0;}intmain(intargc,char*argv[])//实现线程的操作{cout<<"输
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 维修泵房合同范本
- 新都区小升初劳动合同范本
- 《医疗保险制度对医生信任的影响》
- 《胸部CT体检人群中胰腺偶发囊性病变的患病率及危险因素分析》
- 2024年度乙方为甲方提供品牌形象设计的创意服务合同
- 二零二四年度农产品批量购销合同
- 2024年度知识产权许可合同:专利技术使用许可协议
- 2024年度软件开发与技术服务合同(人工智能应用)
- 2024年度店铺商品采购与销售合同
- 2024年度建筑项目水电安装合同示范文本
- 司法涉案目的评估指南
- 高一分文理科语文第一课
- 光伏电站消纳利用率计算导则
- 焓熵图(膨胀线)
- 青春期多囊卵巢综合征诊治共识.ppt
- 前后鼻音生字表
- 人教版八年级上册英语单词表默写版(直接打印)
- 五年级数学质量分析经验交流发言稿(共3页)
- 工程的材料及成型技术基础概念鞠鲁粤编
- (精选)国培结业典礼领导讲话稿范文(3篇)
- 江西省科技创新平台建设(PPT课件)
评论
0/150
提交评论