- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
操作系统课程设计
题目:进程通信与进程同步机制实践
所在学院:计算机学院
所在班级:嵌软1102
学生姓名:缪江超
学生学号:3110609034
指导教师:薛安荣
201
题目
某银行提供5个服务窗口(4个对私服务窗口,1个对公服务窗口)和10个供顾客等待的座位。顾客到达银行时,若有空座位,则到取号机上领取一个号,等待叫号;若没有空座位,则在门外等待或离开。取号机每次仅允许一位顾客使用,有对公和对私两类号,每位顾客只能选取其中一个。当营业员空闲时,通过叫号选取一位顾客,并为其服务。
目的
1、 掌握基本的同步与互斥算法 。
2、Linux或Windows或Unix环境下,采用系统调用中的信号量、P、V操作解决问题
要求
当有顾客取号的时候,不允许其他顾客取号。
当服务窗口满的情况下,其他人等待或离开。
当等待者没有的情况下,服务窗口必须等待。
每位顾客只能选取对公对私其中之一
打印:A、 初始状态
B、 中间变化的状态信息
C、以及最终状态信息。
四、原理及算法
顾客来了看是否有空位,自行选择等待还是离开。有空位则随机选取对私或对公服务后取号等待被服务。服务员空闲时开始叫号,每个窗口只能服务一个顾客。服务完成后顾客离开,继续叫下一位顾客,同时座位号减一,等待顾客进来取号等待。
五、主要数据结构和流程
1、主要数据结构
定义一个全局变量统计顾客的号码,定义四个线程句柄数组,定义一个座位信号量来通知可分配的座位资源,生成随机数判断对私对公服务通知等待营业员对私信号量通知可分配的等待对私资源,通知等待营业员对公信号量等待对公资源,通知对私叫号信号量通知可分配的等待通知对私服务资源,通知对公叫号信号量通知等待对公服务资源。在设置一个互斥信号量用于取号。
2、流程
创建服务员窗口线程(对私和对公服务)
创建服务员窗口线程(对私和对公服务)
P(cs1)对私窗口叫号
P(cs1)
对私窗口叫号
V(s1)
P(cs2)
对公窗口叫号
V(s2)
来了顾客产生随机数确定是对公对私服务后,空闲服务员叫号服务。
P(seat)
P(seat)
P(mutex)
顾客已取号
V(mutex)
V(cs2)
顾客等待对公服务
P(s2)
顾客正在被服务
V(seat)
顾客已经被对公服务,离开
P(seat)
P(mutex)
顾客已取号
V(mutex)
V(cs1)
顾客等待对私服务
P(s1)
顾客正在被服务
V(seat)
顾客已经被对私服务,离开
等待所有线程完成,程序结束
等待所有线程完成,程序结束
六、源程序清单
#includewindows.h
#include time.h
#includeiostream
using namespace std;
#define PRIVATESERVER 4//私有服务
#define PUBLICSERVER 1//公有服务
#define CUSTOMER 10//等待座位量
#define SERVE_TIME 5000//服务时间
#define CUSTOMER_COME_ADAY 200//一天来的顾客量
#define CUSTOMER_COMING_TIME 1000//相邻顾客最大间隔时间
int number = 0;//取号号码
int seat_num=10;
HANDLE seat,s1,s2,cs1,cs2;//seat 等待座位量cs1,cs2等待叫号量s1,s2通知顾客量
HANDLE mutex;//互斥量
CRITICAL_SECTION c_seat;
DWORD WINAPI server1(PVOID s1pv) //营业员(对私)线程代码
{
while(true)
{
WaitForSingleObject(cs1,INFINITE);//p(cs1)
Sleep(SERVE_TIME);
cout对私窗口叫号!endl;
ReleaseSemaphore(s1,1,NULL);//v(s1)
EnterCriticalSection(c_seat);
seat_num++;
LeaveCriticalSection(c_seat);
}
return 0;
}
DWORD WINAPI server2(PVOID s2pv) //营业员(对公)线程代码
{
while(true)
{
WaitForSingleObject(cs2,INFINITE);//p(cs2)
Sleep(SERVE_TIME);
cout对公窗口叫号!endl;
ReleaseSemaphore(s2,1,NULL);//v(s2)
Ent
文档评论(0)