山东大学操作系统实验五理发师问题报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机科学与技术学院操作系统实验报告
实验题目:理发店问题
理发店问题:假设理发店的理发室中有3个理发椅子和3个理发师,有一个可容纳4个顾客坐等理发的沙发。此外还有一间等候室,可容纳13位顾客等候进入理发室。顾客如果发现理发店中顾客已满(超过20人),就不进入理发店。
在理发店内,理发师一旦有空就为坐在沙发上等待时间最长的顾客理发,同时空出的沙发让在等候室中等待时间最长的的顾客就坐。顾客理完发后,可向任何一位理发师付款。但理发店只有一本现金登记册,在任一时刻只能记录一个顾客的付款。理发师在没有顾客的时候就坐在理发椅子上睡眠。理发师的时间就用在理发、收款、睡眠上。
请利用linux系统提供的IPC进程通信机制实验并实现理发店问题的一个解法。
实验目的:
进一步研究和实践操作系统中关于并发进程同步与互斥操作的一些经典问题的解法,加深对于非对称性互斥问题有关概念的理解。观察和体验非对称性互斥问题的并发控制方法。进一步了解Linux系统中IPC进程同步工具的用法,训练解决对该类问题的实际编程、调试和分析问题的能力。
硬件环境:
Inter(R)Core(TM)*******************内存:4GB 硬盘:500G
软件环境:
XUbuntu-Linux 操作系统
Gnome 桌面 2.18.3
BASH_VERSION='3.2.33(1)-release
gcc version 4.1.2
gedit 2.18.2
OpenOffice 2.3
实验步骤:
1、问题分析:
为了解决本实验的同步问题,采用共享内存,信号量,消
息队列三种IPC 同步对象处理。
客户程序思想:
每一个客户把自己的请求当做一条消息发送到相应的消息
队列中去,并通过阻塞等待接收消息的方式来等待理发师
最终帮自己理发。每一个客户先判断sofa 是不是坐满了,如
果没有就坐在沙发上等,否者就判断waitroom 是不是坐满
了,如果没有,就坐在waitroom 等,只要有一个坐在sofa
的客户离开sofa 理发,理发师就会到waitroom 找最先来的
客户,让他进入sofa 等待。
理发师程序思想:
理发师查看sofa 上有没有人,没有就睡3 秒,然后再一次
看有没有人,如果有人,就到沙发请最先来的客户来理发。
账本互斥的实现:
Semaphore mutex=1 ;
Sofa 队列的长度和wait 队列的长度的实现:
在顾客进程中设置两个变量sofa_count,wait_count,分别保存沙发
和等候室的顾客数。
2、算法设计说明如下:
该解法利用消息队列的每条消息代表每个顾客,将进入等候室的顾客组织到一个队列,将坐入沙发的顾客组织到另一个队列。理发师从沙发队列请出顾客,空出的沙发位置再从等候室请入顾客进入沙发队列。三个理发师进程使用相同的程序段上下文,所有顾客使用同一个程序段上下文。这样可避免产生太多进程,以便节省系统资源。
理发师程序(Barber)
{
建立一个互斥帐本信号量:s_account,初值=1;
建立一个同步顾客信号量:s_customer,初值=0;
建立沙发消息队列:q_sofa;
建立等候室消息队列:q_wait;
建立3个理发师进程:b1_pid, b2_pid, b3_pid;
每个理发师进程作:
while(1)
{
以阻塞方式从沙发队列接收一条消息,
如果有消息,则消息出沙发队列(模拟一顾客理发);
唤醒顾客进程(让下一顾客坐入沙发)。
用进程休眠一个随机时间模拟理发过程。
理完发,使用帐本信号量记账。
互斥的获取账本
记账
唤醒用账本理发师者
否则没有消息(沙发上无顾客)
则理发师进程在沙发队列上睡眠;
当沙发队列有消息时被唤醒(有顾客坐入沙发)。
}
}
顾客程序(customer)
{
while(1)
{
取沙发队列消息数(查沙发上顾客数) ;
如果消息数小于4(沙发没座满)
以非阻塞方式从等候室队列接收一条消息(查等候室有顾客否),
如果有消息将接收到的消息发送到沙发队列(等候室顾客坐入沙发);否则发送一条消息到沙发队列(新来的顾客直接坐入沙发);
否则(沙发坐满)
取等候室队列消息数(查等候室顾客数) ;
如果消息数小于13
发送一条消息到等候室队列(等候室没满,新顾客进等候室);
否则
在顾客同步信号量上睡眠(等候室满暂不接待新顾客);用进程休眠一个随机时间模拟顾客到达的时间间隔。}
}
3、开发调试过程:
在shell命令行下运行$ make barber customer
gcc -g -c barber.c ipc.c
gcc barber.o ipc.o -o barber
gcc -g -c customer.c ipc.c
gcc customer.o ipc.o -o customer
假设先运行理发师程序:
$ ./barber
2726号理发师睡眠
2728号理发师睡眠
2727号理发师睡眠
运行$./customer
1号新顾客坐入沙发
2号新顾客坐入沙发
3号新顾客坐入沙发
4号新顾客坐入沙发