进程之间的同步互斥与通信理发师题目操作系统课程设计仿单含源程程序Word文档下载推荐.docx
- 文档编号:5245617
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:15
- 大小:145.75KB
进程之间的同步互斥与通信理发师题目操作系统课程设计仿单含源程程序Word文档下载推荐.docx
《进程之间的同步互斥与通信理发师题目操作系统课程设计仿单含源程程序Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《进程之间的同步互斥与通信理发师题目操作系统课程设计仿单含源程程序Word文档下载推荐.docx(15页珍藏版)》请在冰点文库上搜索。
顾客来到的时候坐在椅子上,将自己作为“产品”,理发师理发的时候从椅子上叫走顾客,相当于消费“产品”,从而达到了课程设计要求的前一个要求。
顾客作为生产者,每到来一个就使计数器count增加1,以便让理发师理发(相当于消费)至最后一个顾客(相当于产品)。
并且,第1个到来的顾客应负责唤醒理发师;
如果不是第1个到达的顾客,则在有空椅子的情况下坐下等待,否则离开理发店(该消息可由计数器count获得)。
主要有以下一些函数来实现整个问题的实现过程:
(1)用随机函数random()来产生进入理发店的顾客。
(2)定义理发师的理发函数cuthair()用来实现理发操作。
(3)定义顾客被理发的函数gethaircut()用来实现顾客被理发的操作。
(4)用顾客线程customer实现对顾客行为的控制。
(5)用理发师线程barber实现对理发师行为的控制。
(6)定义主函数main实现对两个线程的控制和执行操作。
5.设计分工
成员:
李宁侯绍立
分工:
理发师进程、信号量的设置、理发师函数:
xxx
顾客进程、顾客函数、主函数:
xx
6.数据结构说明
本程序用到了数据结构中的队列,理发的顾客由随机函数产生,顾客遵从先到先理发的原则,但队列的长度限制为输入的理发店中的椅子的个数,当理发店的椅子没有空位的时候,到来的顾客主动退出加入队列。
理发师对队列中的顾客进行先到先服务的原则理发。
7.系统结构说明
(一)头文件声明
#include"
windows.h"
iostream.h"
math.h"
(二)定义各种变量
intlongwaiting(0);
intchairs;
charopen_door;
charclose_door;
intcount(0);
intfinish(0);
(三)信号量的定义
HANDLEMutex=:
:
CreateMutex(NULL,FALSE,"
Mutex"
);
HANDLEbarbers=:
CreateSemaphore(NULL,1,1,"
barbers"
HANDLEcustomers=:
CreateSemaphore(NULL,0,3,"
customers"
8.系统调用说明
(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():
睡眠等待
9.分工设计说明
需要用到的信号量:
实现顾客与理发师对公用缓存区的互斥操作
WaitForSingleObject(customers,INFINITE);
等待顾客进程的V(customer)操作
WaitForSingleObject(Mutex,INFINITE);
申请操作顾客与理发师公用的缓存区
ReleaseSemaphore(barbers,1,NULL);
释放信号量barbers
ReleaseMutex(Mutex);
释放信号量Mutex,允许顾客操作缓存区
10.算法流程图
11.分工代码
//等待理发的顾客人数
intchairs;
//店中椅子的总数目
//开门
//关门
//顾客的序号
intfinish(0);
//已经理完发的顾客人数
DWORDa;
//用来实现进程的互斥
//定义信号量来进行线程间的同步
intrandom()
//定义随机函数来产生顾客,并使两个顾客间的时间少于15秒
{
return(rand()*15000)/RAND_MAX;
}
voidcuthair()
//理发师的理发函数,用时15秒
{
:
Sleep(15000);
cout<
<
"
理发结束!
endl;
DWORDWINAPIbarber(LPVOIDpParm1)
//理发师线程
while(true)
{
:
//p(customers),等待顾客
//等待互斥量
waiting--;
//等待的人数减1
//释放信号量
ResumeThread(barbers);
//唤醒顾客进程
//v(mutex);
cuthair();
finish++;
}
return0;
12.整体代码
voidgethaircut()
//顾客被理发的函数
Sleep(15001);
//顾客被理发的函数,为了和理发师之间有所区别,比理发师理发时间长1毫秒
第"
finish<
个顾客理发完毕,离开"
DWORDWINAPIcustomer(LPVOIDpParm2)
//顾客线程
WaitForSingleObject(Mutex,INFINITE);
//P(mutex)来进行互斥操作
count++;
//来的是第几个顾客
顾客敲门!
第"
count<
个顾客到来"
if(waiting<
chairs)//如果有空椅子
{
if(waiting!
=0)
{
cout<
现在有"
waiting<
个人在等待理发"
}
else
无人在等待理发"
//输出有多少人在等待
waiting++;
cout<
剩余"
chairs-waiting+1<
个座位"
有空位,顾客已坐下"
ReleaseSemaphore(customers,1,NULL);
//V(customer)
ResumeThread(customers);
//唤醒理发师进程
//释放互斥量,以便其他线程使用
WaitForSingleObject(barbers,INFINITE);
//等待理发
gethaircut();
else
没有空椅子,第"
个顾客离开理发店"
//没有椅子,顾客直接离开
return0;
intmain(intargc,char*argv[])
//实现线程的操作
输入理发店中的椅子个数:
;
cin>
>
chairs;
店中有"
chairs<
把椅子"
//设置椅子数目
是否开始接待顾客?
Y/N"
//是否开门营业
open_door;
while(open_door!
='
y'
)
endl<
尚未营业!
cin>
HANDLEhThread1;
HANDLEhThread2;
hThread2=:
CreateThread(NULL,0,barber,NULL,0,NULL);
//产生一个理发师进程
while(close_door!
Sleep(random());
//函数实现顾客随机到来
hThread1=:
CreateThread(NULL,0,customer,NULL,a,NULL);
正在营业,请进!
if(finish>
=8&
&
waiting==0)
//如果完成数超过8并且没有人等待
已经为"
个顾客理发了,是否停止营业?
//提示是否关门
close_door;
returnclose_door;
if(close_door=='
)
暂停营业!
欢迎下次光临!
13.程序运行
开始
输入椅子数目
选择是否接待顾客
接待顾客
理发完毕
14.总结
通过这个课程设计,对于课本上的关于进程之间的同步、互斥有了更深层的认识,而且有了具体上直观上的理解。
虽然对于第二个课程设计要求没有达到,但我也学到了许多。
进程作为系统的基本的操作单位,其之间的互斥、同步是非常重要的。
生产者与消费者这一个问题中,生产者与消费者公用一个缓存区,这就涉及到了两个进程对缓存区的互斥操作,否者将会产生许多不切实际的问题,这也就失去的系统操作的实际意义。
而通过一个互斥信号量Mutex便很好的解决了这一个问题,两个进程在操作缓存区之前必须先申请使用,如果信号量表示已有进程正在对缓存区进行操作则必须等待其完成方可。
在做这个设计的时候也遇到了许多问题,例如信号量的设置。
由于这个问题中不仅涉及到理发师与顾客之间的互斥同步问题,还设计到各个顾客进程之间的互斥同步问题,所以起初信号量设置不足而导致问题出错。
总的来讲,此次课程设计对我们操作系统知识的巩固起了重要作用,让我们受到了很多启发,懂得了怎样更好的去学习操作系统课程。
操作系统不在是一个模糊的概念存在,许多实际的例子,问题都能涉及到操作系统方面的知识。
这也看出了操作系统对于整个计算机学科的重要性,他不单单作为一个学科存在,而是渗透到各个学科中,作为各个学科的基础甚至提升。
虽然本次的设计不够完善,但我觉得自己获得的东西远远超过这个设计的内容。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 进程 之间 同步 通信 理发师 题目 操作系统 课程设计 仿单 含源程 程序