大学习大讨论大调研并非是大而空,大而虚,大而泛,学习什么,如何来学习,讨论什么,从哪些方面来讨论,调研什么,如何调研,这都需要认真思考,不能因为热潮涌动失去了方向。《操作系统》课程设计报告专业:计算机科学与技术班级:08计本(2)班学号姓名题目名称:理发师问题完成日期:2011.6甘肃政法学院计算机科学学院成绩大学习大讨论大调研并非是大而空,大而虚,大而泛,学习什么,如何来学习,讨论什么,从哪些方面来讨论,调研什么,如何调研,这都需要认真思考,不能因为热潮涌动失去了方向。目录一.题目内容..............................................错误!未定义书签。二.课程设计目的..........................................错误!未定义书签。三.设计思想说明..........................................错误!未定义书签。四.系统结构的说明........................................错误!未定义书签。(一)头文件声明.....................................错误!未定义书签。(二)定义各种变量...................................错误!未定义书签。(三)信号量的定义...................................错误!未定义书签。(四)相关函数及线程的定义...........................错误!未定义书签。五.数据结构说明..........................................错误!未定义书签。六.程序用到的系统调用(API).............................错误!未定义书签。七.程序总体算法流程图....................................错误!未定义书签。八.程序运行..............................................错误!未定义书签。九.使用说明书............................................错误!未定义书签。十.程序设计总结..........................................错误!未定义书签。参考文献.................................................错误!未定义书签。附录.....................................................错误!未定义书签。(一)代码清单.......................................错误!未定义书签。(二)课程设计分工表.................................错误!未定义书签。大学习大讨论大调研并非是大而空,大而虚,大而泛,学习什么,如何来学习,讨论什么,从哪些方面来讨论,调研什么,如何调研,这都需要认真思考,不能因为热潮涌动失去了方向。睡眠理发师问题一一..题题目目内内容容有一个理发师,一把理发椅和n把提供给等候理发的顾客座的椅子。如果没有顾客,则理发师便在理发椅子上睡觉;当第一个顾客到来时,必须唤醒该理发师进行理发;如果理发师正在理发时又有顾客到来,则如果有空椅子可坐,他就坐下来等待,如果没有空椅子,他就离开理发店。为理发师和顾客各编一段程序描述他们的行为,要求不能带有竞争条件,试用P、V操作实现。二二..课课程程设设计计目目的的通过本次课程设计,能深入彻底的弄清楚睡眠理发师问题,能够举一反三,遇到同样的问题能够很快解决。通过自己的实际操作,认真分析,理解进程,线程,信号量之间的关系和他们的实现过程,掌握一些基本的系统调用的用法及其所实现的功能。用C++来实现睡眠理发师的课程设计,达到复习C++相关知识的目的。三三..设设计计思思想想说说明明此题可看作是n个生产者和1个消费者问题。顾客作为生产者,每到来一个就使计数器count增加1,以便让理发师理发(相当于消费)至最后一个顾客(相当于产品)。并且,第1个到来的顾客应负责唤醒理发师;如果不是第1个到达的顾客,则在有空椅子的情况下坐下等待,否则离开理发店(该消息可由计数器count获得)。主要有以下一些函数来实现整个问题的实现过程:(1)用随机函数random()来产生进入理发店的顾客。(2)定义理发师的理发函数cuthair()用来实现理发操作。(3)定义顾客被理发的函数gethaircut()用来实现顾客被理发的操作。(4)用顾客线程customer实现对顾客行为的控制。(5)用理发师线程barber实现对理发师行为的控制。(6)定义主函数main实现对两个线程的控制和执行操作。四四..系系统统结结构构的的说说明明(一)头文件声明#includestdafx.h#includewindows.h#includeiostream.h#includemath.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编译环境,新建工程名,将上述代码复制粘贴编译运行即可看到运行窗口。然后根据窗口提示,从键盘输入椅子数并按回车键即可。然后再根据提示,即可进行相应操作。其中一些窗口内容如上面一些截图所示。十十..程程序序设设计计总总结结通过这次课程设计,我们搜索了理发师问题的相关资料,又对课本知识进行了进一步的深入学习。在完成该程序的编写的过程中,使我对课堂上所学的理论知识有了一个更深更具大学习大讨论大调研并非是大而空,大而虚,大而泛,学习什么,如何来学习,讨论什么,从哪些方面来讨论,调研什么,如何调研,这都需要认真思考,不能因为热潮涌动失去了方向。体的认识,尤其对操作系统课程中的信号量,线程,中断等内容有了进一步的认识,并吸收整合了网络上一些优秀的代码,经历了不少艰辛,终于完成了此项任务。总的来讲,此次课程设计对我们操作系统知识的巩固起了重要作用,让我们受到了很多启发,懂得了怎样更好的去学习操作系统课程。在做的