基于同步机制的理发师问题(终123)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统课程设计任务书
操作系统设计说明书
学院名称:计算机与信息工程
班级名称:计算机科学与技术
学生姓名:
学号:2011211245 2011211240 2011211204 2011211238 2011211249 2011211243 题目:基于同步机制的理发师问题
指导教师:
起止日期: 2013年6月3日~2013年6月30日
目录
1 选题背景 (5)
2 设计理念 (5)
3 过程论述 (6)
3.1 函数解释 (6)
3.2 概要设计 (7)
3.2.1 主函数模块 (7)
3.2.2 理发师进程模块 (7)
3.2.3 顾客进程模块 (8)
3.3 详细设计和代码 (9)
3.3.1 PV操作伪代码 (9)
3.3.2 理发师进程模块代码 (10)
3.3.3 顾客进程模块代码 (10)
4 结果分析 (11)
5 设计总结 (12)
6 参考文献 (13)
7 附录 (13)
1 选题背景
在操作系统理论中有一个非常重要的概念叫做P,V原语。在我们研究进程间的互斥的时候经常会引入这个概念,将P,V操作方法,来解决进程间的互斥问题。实际上,P、V原语的应用范围很广,不但可以解决进程同步与进程通信的问题而且我们还可以利用此方法解决进程管理当中的互斥问题。
那么操作系统中是如何实现P、V操作的呢?下面我们通过一个例子来说明。
wait(S): while S<=0 do no-op;
S:=S- 1;
signal(S): S:=S+1;
说明:wait(S)和signal(S)是两个原子操作,因此,它们在执行时是不可中断的。亦即,当进程在修改某信号量时,没有其他进程可同时对该信号量进行修改。此外,在wait操作中,对S值得测试和做S:=S-1操作时都不可中断。
理发师问题可以理解为经典进程同理发师问题可以理解为经典进程同步问题的一个具体问题,可以使用P、V操作解决理发师和顾客之间的同步问题。
2 设计理念
假设有家理发店,店里有一个理发师、一把理发椅和n把等候理发的顾客椅子。理发过程如下:
如果没有顾客则理发师便睡觉。当有一个顾客到达时,首先查看理发师在干什么,如果在睡觉则唤醒理发师理发,然后坐到理发椅上开始理发;如果理发师正在理发,则查看是否有空的椅子可坐,如果有,他就坐下等待,如果没有,则离开;理发师为一位顾客理完发后,查看是否有人等待,如有则唤醒一位为其理发,如没有则在理发椅上睡觉。(顾客不分优先级)。
此题可看作是n个生产者与一个消费者问题。顾客作为生产者,每来到一个就使计数器count增加1,以便让理发师(相当于消费)至最后一个顾客(相当于产品)。并且,第1个到来的顾客应负责唤醒理发师;如果不是第1个到达的顾客,则在有空椅子的情况下坐下等待,否则离开理发店(该消费可有计数器count获得)。
主要有以下一些函数来实现整个问题的实现过程:
⑴用随机函数random()来生产进入理发店的顾客。
(2)用顾客线程customer实现对顾客行为的控制。
(3)用理发师线程barber实现对理发师行为的控制。
(4)定义主函数main来实现两个线程的控制和执行操作。
3 过程论述
3.1 函数解释
WINAPI函数:
调用约定,WINAPI即stdcall,有加WINAPI的函数基本可以说明系统将在某个时候会自己调用这个函数,里面的参数LPVOID pParm是用来在下面的(hThreadCustomer=CreateThread(NULL,0,customer,NULL,0,NULL))创建线程时传递参数的。传递的是第五个参数。
hThreadCustomer=CreateThread(NULL, // 没有安全描述符
0, // 默认线程栈的大小
customer, // 线程函数指针
NULL, // 没有附加属性
0, // 传递参数(LPVOID)&n
NULL // 不需要获得线程号码);
WaitForSingleObject函数:
⑴ WaitForSingleObject(barbers,INFINITE); //等待理发
⑵ WaitForSingleObject(Mutex,INFINITE);//等待互斥量
⑶WaitForSingleObject(customers,INFINITE);//p(customers)等待顾客
该函数用来检测Handle事件的信号状态,当函数的执行时间超过dwMilliseconds就返回,但如果参数dwMilliseconds为INFINITE时函数将直到相应时间事件变成有信号状态才返回,否则就一直等待下去,直到WaitForSingleObject有返回直才执行后面的代码。
ReleaseSemaphore函数:
⑴ ReleaseSemaphore(barbers,1,NULL);//释放信号量
⑵ ReleaseSemaphore(customers,1,NULL)
该函数用于对指定的信号量增加指定的值。
ResumeThread线程恢复函数;
⑴ ResumeThread(barbers); //唤醒顾客进程;
⑵ ResumeThread(customers);//唤醒理发师进程
ReleaseMutex函数:
⑴ ReleaseMutex(Mutex);//v(mutex);
⑵ ReleaseMutex(Mutex);//释放互斥量,以便其他线程使用
该函数释放由线程拥有的一个互斥体。