用信号量解决理发店问题.doc_第1页
用信号量解决理发店问题.doc_第2页
用信号量解决理发店问题.doc_第3页
用信号量解决理发店问题.doc_第4页
用信号量解决理发店问题.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

操作系统课程设计专业:信息安全班级:0801 姓名:黄春海学号:3080604022老师:薛安荣一、课程设计的目的与要求1、课程设计目的 本课程设计的主要目的是通过生产者和消费者问题(理发店问题)的设计和调试,使学生掌握进程同步的工作原理,利用信号量的原理和机制去解决同步问题,并培养学生分析和解决实际问题的能力。2、课程设计要求(1)、在Windows系统环境下,用Windows API编程实现操作系统经典同步问题。 (2)、理解和运用信号量、PV原语、进程间的同步互斥关系等基本知识。 (3)、在实习过程中,加强对于进程同步概念的理解,对于实验进行分析。(4)、掌握在Windows环境下多线程(进程)程序设计的一些基本方法。二、设计内容 理发店理有一位理发师、一把理发椅和5把供等候理发的顾客坐的椅子。如果没有顾客,理发师便在理发椅上睡觉。一个顾客到来时,它必须叫醒理发师。如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,就坐下来等待,否则就离开。三、开发环境 操作系统功能的模拟实现可以在计算机系统的终端上进行。本次课程设计的主要过程是用语言来模拟操作系统的主要功能。试验环境如下:系统: Windows XP语言:C开发工具:Visual C+ 6.0四、分析设计 题目中要求描述理发师和顾客的行为,因此需要两类进程Barber ()和Customer()分别描述理发师和顾客的行为。当理发师看报时顾客近来需要唤醒理发师为其理发,当有顾客时理发师为其理发,没有的时候理发师休息,因此理发师和顾客之间是同步的关系,由于每次理发师只能为一个人理发,且可供等侯的椅子有限只有n个,即理发师和椅子是临界资源,所以顾客之间是互斥的关系。故引入3个信号量和一个控制变量:1)控制变量waiting用来记录等候理发的顾客数,初值均为0;2)信号量customers用来记录等候理发的顾客数,并用作阻塞理发师进程,初值为0;3)信号量barbers用来记录正在等候顾客的理发师数,并用作阻塞顾客进程,初值为0;4)信号量mutex用于互斥,初值为1 三 问题实现 1.PV操作代码如下: int waiting=0 ; /等候理发的顾客数 int chairs=n; /为顾客准备的椅子数 semaphore customers=0, barbers=0,mutex=1; barber() while(TRUE); /理完一人,还有顾客吗? P(cutomers); /若无顾客,理发师睡眠 P(mutex); /进程互斥 waiting := waiting 1; /等候顾客数少一个 V(barbers); /理发师去为一个顾客理发 V(mutex); /开放临界区 cut-hair( ); /正在理发 customer() P(mutex); /进程互斥 if (waiting) waiting := waiting+1; / 等候顾客数加1 V(customers); /必要的话唤醒理发师 V(mutex); /开放临界区 P(barbers); /无理发师, 顾客坐着养神 get-haircut( ); /一个顾客坐下等理/ else V(mutex); /人满了,走! 2.详细实现: 椅子数目可以设置;程序采用用随机数产生顾客进程,也就是顾客按照随机数自动到来,这样更加接近现实生活;对于理发师,当顾客到来后去理发,如果没有顾客继续看报纸,当理完一个后,判断是否有等待,有则叫下一个来理发,没有的话去看报纸。对于客人,先看理发师是空闲还是忙,空闲则去理发,忙着的话则看是否有位置等待,有则坐下等,没有的话则离开。对于理发时间,是取系统时间来控制,设理发时间为10秒,当两次时间差大于等于10时表示理完叫下一位,小于则继续理发。并且还能控制是否开门营业,当理发师为10个以上顾客理发完成并且没有人在等待时,可以决定是否关门休息.信号量 信号量的定义:信号量(Semaphore)是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。信号量S是一个整数,S大于等于零时代表可供并发进程使用的资源实体数,但S小于零时则表示正在等待使用临界区的进程数。对信号量操作的PV原语:P原语操作的动作是:(1)S减1;(2)若S减1后仍大于或等于零,则进程继续执行;(3)若S减1后小于零,则该进程被阻塞后进入与该信号相对应的队列中,然后转进程调度。V原语操作的动作是:(1)S加1;(2)若相加结果大于零,则进程继续执行;(3)若相加结果小于或等于零,则从该信号的等待队列中唤醒一等待进程,然后再返回原进程继续执行或转进程调度。PV操作对于每一个进程来说,都只能进行一次,而且必须成对使用。在PV原语执行期间不允许有中断的发生。2、涉及的数据结构程序中引入3个信号量和一个控制变量:(1)控制变量wait用来记录等候理发的顾客数,初值均为0;(2)信号量customers用来记录等候理发的顾客数,并用作阻塞理发师进程,初值为0;(3)信号量barbers用来记录正在等候顾客的理发师数,并用作阻塞顾客进程,初值为1;(4)信号量Mutex用于互斥,初值1.int long wait(0); /*正在等待的顾客的数目 */ int sofas; /*为顾客准备的椅子数*/ customers, barbers,mutex : semaphore; customers = 0; barbers = 1; wait = 0; mutex = 1;3、流程图 顾客需要理发是否有等待椅?获得理发椅使用权?等待使用权得到使用权被理发释放使用权离开是顾客进程否 理发师等待顾客理发有无顾客?获得理发椅使用权给顾客理发理完发释放理发椅使用权唤醒下一个顾客睡觉无有理发师进程五、运行示例及结果分析1、运行示例 六、个人体会 通过这个课设更好的了解操作系统的一些问题融汇平时上课不懂的地方,最终解决了问题。七、附录(源程序)#include #include iostream.h #include math.h #define random (rand()*10000)/RAND_MAX /定义一个随机函数来产生顾客,并且使两个顾客间的时间少于10秒 int long waiting(0); /正在等待的顾客的数目 int chairs; /椅子的总数目 char close_door; /关门 int count(0); /顾客的号码数 int finish(0); /理发完毕的顾客数目 DWORD a; void cuthair() Sleep (10000); cout理发完成 !endl; /理发师理发函数,用时10秒 void gethaircut() Sleep (10001); /顾客被理发的函数,为了和理发师之间有所区别,比理发师理发时间长0.001秒。 cout第finish个顾客理发完毕,离开 endl; HANDLE Mutex=CreateMutex(NULL, FALSE, Mutex); /用来实现进程的互斥 HANDLE barbers=CreateSemaphore(NULL, 1,1, barbers);/定义信号量来进行线程间的同步 HANDLE customers=CreateSemaphore(NULL,0,3,customers); DWORD WINAPI customer(LPVOID pParm2) /顾客的线程 WaitForSingleObject(Mutex ,INFINITE); /p(mutex)进入临界区count+; /来的是第几个顾客 cout第 count 个顾客来了 endl; if (waitingchairs) /如果还有椅子可以坐 if (waiting!=0) cout此时有waiting 个人在等待理发endl; else cout没有人在等待endl; /输出有多少人在等待 waiting+; cout还有chairs-waiting+1个座位endl; cout有座位,顾客已经坐下endl; ReleaseSemaphore(customers,1,NULL);/v(customer) sfangxinghaoliangResumeThread(customers);/唤醒理发师进程 ReleaseMutex(Mutex);/释放互斥量,以便其他线程使用 WaitForSingleObject(barbers,INFINITE);/等待理发 gethaircut(); /理发并离开 else cout座位已满,第count个顾客离开endl; /没有椅子,顾客直接离开 ReleaseMutex(Mutex); return 0; DWORD WINAPI barber(LPVOID pParm1) /理发师的线程 while(true) /一直执行 WaitForSingleObject(customers,INFINITE);/p(customers),等待顾客 WaitForSingleObject(Mutex,INFINITE); /等待互斥量 waiting-; /等待的人数减一 ReleaseSemaphore(barbers,1,NULL); /释放信号量 ResumeThread(barbers); /唤醒顾客进程 ReleaseMutex(Mutex); /v(mutex); cuthair(); /理发 finish+; /理发完毕的顾客数目加一 return 0; int main() coutchairs; cout理发店共有chairs把椅子endl; HANDLE hThread1; HANDLE hThread2; hThread2=CreateThread (NULL,0,barber,NULL,0,NULL); /产生一个理发师进程 while(close_door!=y) Sleep(random);

温馨提示

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

评论

0/150

提交评论