基于同步机制的理发师问题(终123)
美发师职业技能鉴定国家题库精选全文

可编辑修改精选全文完整版 职业技能鉴定国家题库 美发师中级理论知识试卷 注 意 事 项 1、考试时间:120分钟。
2、本试卷依据2001年颁布的《美发师 国家职业标准》命制。
3、请首先按要求在试卷的标封处填写您的姓名、准考证号和所在单位的名称。
4、请仔细阅读各种题目的回答要求,在规定的位置填写您的答案。
5、不要在试卷上乱写乱画,不要在标封区填写无关的内容。
一 二 总 分 得 分 得 分 评分人 一、单项选择(第1题~第120题。
选择一个正确的答案,将相应的字母填入题内的括号中。
) 1. 人类社会生活可分为三大领域,即( )、社会公共生活和职业生活。
A 、社会主义阶段生活 B 、家庭生活 C 、学校生活 D 、共产主义阶段生活 2. 社会发展和生产技术进步产生了社会分工。
由于社会分工不同,因而不同职业有着不同的( ),这是职业道德产生的历史过程。
A 、技术设备 B 、职业责任和职业纪律 C 、从业人员 D 、生产结果 3. 美发师对自己所从事的职业要充满自信,对工作要()。
A 、态度和蔼 B 、顾客至上 C 、重视仪表 D 、认真负责 4. 美发师职业道德的特点是以人为本、以等价交换为原则,为顾客提供( )。
A 、知识 B 、劳务 C 、技术 D 、业务 5. 美发师职业道德的主要行为规范是热爱本职、认真负责,积极主动、热情服务,()。
A 、努力创收、效益第一 B 、技术高超、不传外人 C 、发式新潮、服饰出众 D 、举止文明、谦虚谨慎 6. 美发师在美发操作过程中,应随时听取顾客的反映,如洗发时水温的冷热、按摩时( )等。
A 、发质的好坏 B 、洗发水的多少 C 、力度的大小 D 、梳子的长短 7. 美发师讲究个人卫生是非常重要的,因此,在工作中必须做到“()”和“四坚持”。
A 、三勤 B 、四勤 C 、五勤 D 、六勤 8. 温度应为100℃,持续15分钟,这种对棉织品消毒的有效的方法是( )。
计算机操作系统(习题集)第二章 答案

第二章进程管理一、单项选择题1、在单一处理机上执行程序,多道程序的执行是在(B)进行的。
A.同一时刻B. 同一时间间隔内C.某一固定时刻D. 某一固定时间间隔内2、引入多道程序技术后,处理机的利用率( C)。
A.降低了B. 有所改善C.大大提高D. 没有变化,只是程序的执行方便了3、顺序程序和并发程序的执行相比,( C)。
A.基本相同 C.并发程序执行总体上执行时间快B. 有点不同 D.顺序程序执行总体上执行时间快4、单一处理机上,将执行时间有重叠的几个程序称为(C )。
A.顺序程序B. 多道程序C.并发程序D. 并行程序5、进程和程序的本质区别是(D )。
A.存储在内存和外存 B.顺序和非顺序执行机器指令C.分时使用和独占使用计算机资源D.动态和静态特征6、进程就是程序在并发环境中的执行过程,它是系统进行资源分配和调度的一个基本单位。
进程具有[1A]、[2D]、调度性、异步性和结构性等基本特征。
进程是一次执行过程,具有生命期体现了进程的[1]特征。
进程由程序段、[3B]、[4C]组成,其中[4]是进程在系统中存在的唯一标识。
供选择的答案:[1][2] :A、动态性 B、静态性 C、共行性 D、并发性 E、可执行性 F、易用性[3] :A、过程 B、数据 C、进程标识符 D、函数[4] :A、FCB B、FIFO C、PCB D、JCB7、进程执行时的间断性,决定了进程可能具有多种状态。
进程的基本状态有三种,在分时系统中,当一个进程拥有的时间片到时,则该进程即由[1D]进入[2A]。
如果出现因某种原因使得处理机空闲时,则需要从就绪队列中选择一进程,并将处理机分配给它,此时该进程进入[3D],这个过程是由[4C]来完成。
供选择的答案:[1][2][3] :A、就绪状态 B、静止状态 C、阻塞状态 D、运行状态[4] :A、进程控制程序B、资源分配程序C、进程调度程序 D、处理机分配程序8、为了描述进程的动态变化过程,采用了一个与进程相联系的(C ),根据它而感知进程的存在。
计算机操作系统作业2(含答案)资料

12.试比较说明进程和程序的区别有哪些?
三、应用题
1.有一个理发师,一把理发椅和n把供等候理发的顾客坐的椅子。如果没有顾客,则理发师便在理发椅子上睡觉;当一个顾客到来时,必须唤醒理发师,进行理发;如果理发师正在理发时,又有顾客来到,则如果有空椅子可坐,他就坐下来等,如果没有空椅子,他就离开。为理发师和顾客各编一段程序描述他们的行为,要求不能带有竞争条件。
9.银行家算法在解决死锁问题中是用于______的。
A.预防死锁B.避免死锁C.检测死锁D.解除死锁
10.______不是进程调度算法。
A.时间片轮转法B.先来先服务方法
C.响应比高者优先法D.均衡调度算法
11.下面关于线程的叙述中正确的是______。
A.线程包含CPU现场,可以独立执行程序B.每个线程有自己独立的地址空间
28.进程控制块PCB不包括的内容是______。
A.CPU现场B.进程优先级C.进程运行状态D.文件缓冲区
29.PCB是描述进程状态和特性的数据结构,一个进程______。
A.可以有多个PCBB.可以和其他进程共用一个PCB
C.可以没有PCBD.只能有唯一的PCB
30.资源顺序分配法破坏了死锁发生的______必要条件。
A.互斥关系B.同步关系C.互斥和同步D.无制约关系
7.在优先级调度中,______类进程可能被“饿死”,即长时间得不到调度。
A.短进程B.长进程C.低优先级进程D.大内存进程
8.进程从运行状态到阻塞状态可能是由于______。
A.进程调度程序的调度B.现运行进程的时间片耗尽
C.现运行进程执行了wait操作D.现运行进程执行了signal操作
操作系统实验五 理发师问题

实验题目:理发师问问题学号:201000130133 班级: 2010级计算机4班姓名:郑思雨 Email:1412561943@实验目的:1、进一步研究和实践操作系统中关于并发进程同步与互斥操作的一些经典问题的解法。
2、加深对于非对称性互斥问题有关概念的理解。
观察和体验非对称性互斥问题的并发控制方法。
3、进一步了解Linux系统中IPC进程同步工具的用法,训练解决对该类问题的实际编程、调试和分析问题的能力。
硬件环境:微机(多核,4GB 以上内存,320GB 以上硬盘)软件环境:Ubuntu-Linux 操作系统Gnome 桌面gcc version 4.1.2gedit 2.18.2OpenOffice 2.3实验步骤:1、了解实验的目的,了解并掌握与进程间通信IPC中的3个对象:共享内存、信号灯数组、消息队列到呢个有关的系统调用,并能熟练的掌握。
2、阅读实验题目并分析实验的需求。
理发店问题:假设理发店的理发室中有3个理发椅子和3个理发师,有一个可容纳4个顾客坐等理发的沙发。
此外还有一间等候室,可容纳13位顾客等候进入理发室。
顾客如果发现理发店中顾客已满(超过20人),就不进入理发店。
在理发店内,理发师一旦有空就为坐在沙发上等待时间最长的顾客理发,同时空出的沙发让在等候室中等待时间最长的的顾客就坐。
顾客理完发后,可向任何一位理发师付款。
但理发店只有一本现金登记册,在任一时刻只能记录一个顾客的付款。
理发师在没有顾客的时候就坐在理发椅子上睡眠。
理发师的时间就用在理发、收款、睡眠上。
(1)首先创建ipc.h文件,在里面定义生产者/消费者共用的IPC函数的原型和变量。
(2)然后创建ipc.c文件,在里面定义生产者/消费者共用的IPC 的具体的相应函数。
(3)创建sofa_control文件,在里面声明两个消息队列,当沙发空闲时则会将空闲的消息放入相应的队列中,让顾客可以进入沙发中,当理发师空闲时,也会将相应的消息放入队列中,从而可以让顾客到理发椅上进行理发。
系统调用中的信号量PV操作 理发师问题

⏹理发师问题:一个理发店由一间等候室W和一间工作室B组成。
顾客可以从外面大街上进入W等候理发。
两个房间的入口是并排的,且共享一扇日本式可滑动的推拉门(门总是挡住一个入口)。
顾客在工作室内理完发,可由B 的旁门出去。
W中有N把椅子,顾客必须坐着等候。
理发师可由门上小窗查看W中无人就睡觉,否则开门,并叫一位顾客入内理发。
顾客每进入一位,都拉铃通知理发师。
若把顾客和理发师都视为进程,请用P、V操作写出进程的同步算法。
⏹要求打印:题目中要求描述理发师和顾客的行为,因此需要两类线程barber()和customer ()分别描述理发师和顾客的行为。
其中,理发师有活动有理发和睡觉两个事件;等待和理发二个事件。
店里有固定的椅子数,上面坐着等待的顾客,顾客在到来这个事件时,需判断有没有空闲的椅子,理发师决定要理发或睡觉时,也要判断椅子上有没有顾客。
所以,顾客和理发师之间的关系表现为:(1)理发师和顾客之间同步关系:当理发师睡觉时顾客近来需要唤醒理发师为其理发,当有顾客时理发师为其理发,没有的时候理发师睡觉。
(2)理发师和顾客之间互斥关系:由于每次理发师只能为一个人理发,且可供等侯的椅子有限只有n把,即理发师和椅子是临界资源,所以顾客之间是互斥的关系。
(3)故引入3个信号量和一个控制变量:ⅰ控制变量waiting用来记录等候理发的顾客数,初值为0;ⅱ信号量customers用来记录等候理发的顾客数,并用作阻塞理发师进程,初值为0;ⅲ信号量barbers用来记录正在等候顾客的理发师数,并用作阻塞顾客进程,初值为1;ⅳ信号量mutex用于互斥,初值为1using System;using System.Collections.Generic;using System.Text;using System.Threading;namespace理发师问题2{internal class Program{// Fieldsprivate static Semaphore barbers = new Semaphore(1, 10);private static int chairs;private static int count = 0;private static Semaphore customers = new Semaphore(0, 10);private static int finish = 0;private static Semaphore mtx = new Semaphore(1, 10);private static int waiting = 0;// Methodspublic static void barber(){while (true){customers.WaitOne();mtx.WaitOne();waiting--;barbers.Release();mtx.Release();cuthair();finish++;}}public static void customer(){mtx.WaitOne();count++;Console.WriteLine("叮咚!第{0}个顾客来了", count);if (waiting < chairs){if (waiting > 0){Console.WriteLine("此时有{0}个人在等待理发", waiting);}else{Console.WriteLine("没有人在等待");}waiting++;Console.WriteLine("还有{0}个座位,顾客留下", (chairs - waiting) + 1);mtx.Release();customers.Release();barbers.WaitOne();gethaircut();}else{Console.WriteLine("座位已满,第{0}个顾客离开", count); mtx.Release();}}public static void cuthair(){Console.WriteLine("开始理发!这是理发师的第{0}个顾客.", finish + 1);Thread.Sleep(0x2328);Console.WriteLine("理发完成 !");}public static void gethaircut(){Thread.Sleep(0x238c);Console.WriteLine("第{0}个顾客理发完毕,离开.", finish);}private static void Main(string[] args){string str = string.Empty;Console.WriteLine("请输入椅子的总数目:");chairs = Convert.ToInt32(Console.ReadLine());Console.WriteLine("理发店共有{0}把椅子", chairs);Console.WriteLine("开门接待顾客吗?Y/N");for(string str2 = Console.ReadLine(); (str2 != "Y") && (str2 != "y"); str2 = Console.ReadLine()){Console.WriteLine("********对不起,尚未开门!********");Console.WriteLine("开门接待顾客吗?Y/N");}Console.WriteLine("********营业中,欢迎光临!********");new Thread(new ThreadStart(Program.barber)).Start();while ((str != "y") && (str != "Y")){Random random = new Random(lisecond);Thread.Sleep(random.Next(1, 0x2710));Console.WriteLine("*******************************");new Thread(new ThreadStart(Program.customer)).Start();if ((finish >= 10) && (waiting == 0)){Console.WriteLine("已经为{0}个顾客理发了,要关门下班吗?(Y/N)", finish);str = Console.ReadLine();}if ((str == "Y") || (str == "y")){Console.WriteLine("************暂停营业!**********");break;}}}}}题目: 用多线程同步方法解决睡眠理发师问题(Sleeping-Barber Problem)理发店有一位理发师,一把理发椅和n把用来等候理发的椅子。
操作系统原理课件-第十一讲睡眠理发师问题

线程:引入原因,与进程比较
处理机调度:分为几个层次(作业调度、中级调度、进程调度); 评价调度算法的指标;调度算法各自的特点;采用不同的算法 计算进城的周转时间、调度顺序等;实时调度概念、常见算法
V(seat);
Get_haircut(); }
Process barber {
While(1)
{
P(customers); //接收顾客信号
V(barbers);//向顾客发信号
Cut_hair();
}
}
睡眠理发师问题 方法3
#define CHIRS=5
Var customers,barbers,mutex: Semaphore:=0,0,1
{
P(customers); //接收顾客信号
Cut_hair();
V(seat);
}
}
睡眠理发师问题 方法2
Var customers,barbers,seat: Semaphore:=0,0,5
Process customer
{
P(seat) ;
V(customers); //向理发师发信号
P(barbers); //接收理发师信号
P(customers );//接收顾客信号
Get_haircut();
P(mutex);}Fra bibliotekwaiting=waiting-1;
else
V(barbers);//向顾客发信号
{
V(mutex);
V(mutex);
Cut hair();
}
}
}
}
练习
吸烟者问题(1971,Patil):在一个房间内有三位吸烟者、一位材 料供应者。其中: a) 吸烟者: 需要拥有三种材料“烟草(Tobacco)、卷烟纸 (Cigarette-paper)、火柴(Match)”才能吸烟: 第一位吸烟者有丰富的烟草; 第二位吸烟者有丰富的卷烟纸; 第三位吸烟者有丰富的火柴; ; 当吸烟者拿到所需要的材料后,唤醒供应者进行下一次投放; b) 材料供应者:不吸烟,且有丰富的Tobacco、Cigarette-paper、 Match三种材料; 每次随机地将三种材料中的两种投放到桌子上; 允许拥有另一种材料的吸烟者吸烟。 【要求】编写算法用信号量和P、V操作实现它们之间的同步关系。
实例:同步问题

同步问题2:理发师问题
var waiting : integer:=0; /*等候理发的顾客数*/ CHAIRS:integer:=n; /*为顾客准备的椅子数*/ VAR customers, barbers,mutex : semaphore:=0,0,1; Procedure barber; begin while(TRUE); /*理完一人,还有顾客吗?*/ P(cutomers); /*若无顾客,理发师睡眠*/ P(mutex); /*进程互斥*/ waiting := waiting – 1; /*等候顾客数少一个*/ V(barbers); /*理发师去为一个顾客理发*/ V(mutex); /*开放临界区*/ cut-hair( ); /*正在理发*/ end;
同步问题2:理发师问题
互斥信号量:mutex ,初始值为1; 信号量customers用来记录等候理发的顾客 数,并用作阻塞理发师进程,初值为0; barbers用来记录正在等候顾客的理发师数, 并用作阻塞顾客进程,初值为0; 这里barbers只有两种取值, 0或1; 临界变量:waiting由理发师进程和顾客进程 共同访问,用来记录在椅子上等着的顾客数;
同步问题3
Void mather() { Wait(empty); wait(mutex); put an orange on the disk; signal(mutex); signal(orange); }
同步问题3
Void son() { Wait(apple); Wait(mutex); Get an apple from disk; Signal(mutex); Signal(empty); }
操作系统--理发师问题

操作系统--理发师问题正文:一:背景介绍理发师问题是一个经典的并发编程问题,涉及到同时访问共享资源的多个线程之间的同步问题。
该问题的背景可以描述为:在一个理发店里,有一个理发师和一排等待理发的顾客,每个顾客需要等待一段时间才能坐到理发椅上理发。
当有空闲的理发师时,顾客就会坐到椅子上进行理发,否则就需要等待其他顾客理发结束。
该问题需要设计一个合理的算法,保证每个顾客都能够得到理发椅上的理发服务。
二:问题分析1. 线程模型与同步机制考虑到理发师问题涉及到多个顾客同时访问共享资源(理发椅)的情况,可以使用线程模型来解决该问题。
其中,每个顾客作为一个线程,理发椅作为共享资源。
在本问题中,通过使用信号量进行同步机制的设计,保证每个顾客能够按顺序得到理发师的服务。
2. 线程同步的三个要素在解决理发师问题时,需要考虑线程同步的三个要素:互斥、有序性和死锁避免。
互斥可以通过互斥量来实现,保证只有一个线程同时访问共享资源;有序性可以通过信号量来控制,保证顾客能够按照先来后到的顺序进行理发;死锁避免可以通过设置超时等待时间来解决。
三:算法设计1. 初始条件设置首先,需要确定理发师数量、理发椅数量和顾客数量的初始设置。
可以通过命令行参数或配置文件进行设置,以适应不同场景的需求。
2. 创建线程根据顾客数量创建对应数量的线程,并将每个顾客线程的任务设置为等待理发的状态。
同时,创建理发师线程,并将理发师的任务设置为等待顾客的状态。
3. 理发师任务理发师从等待队列中取出一个顾客进行理发,理发时间可以通过随机数。
当该顾客理发结束后,理发师继续从等待队列中取出下一个顾客进行理发。
如果没有顾客在等待,则理发师进入休息状态。
4. 顾客任务顾客到达理发店后,首先判断是否有空闲的理发椅。
如果有空闲的椅子,则顾客坐下并进行理发;否则,顾客需要等待其他顾客离开理发椅后才能进行理发。
5. 同步机制使用互斥量保证理发师和顾客对共享资源的互斥访问。
理发师问题

Linux系统分析实验报告用信号量解决理发师问题061261008 蒋炎岩(一班)1 实验要求理发师问题:理发店理有一位理发师、一把理发椅和5把供等候理发的顾客坐的椅子。
如果没有顾客,理发师便在理发椅上睡觉一个顾客到来时,它必须叫醒理发师,如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,就坐下来等待,否则就离开。
用Linux线程机制和信号量机制解决这个问题,并且:(1)每个顾客进入理发室后,即时显示“Entered”及其线程标识,还同时显示理发室共有几名顾客及其所坐的位置(2)至少有10个顾客,每人理发至少3秒钟。
(3)多个顾客须共享操作函数代码。
2 背景知识2.1 POSIX线程在一个程序中的多个执行路线称之为线程。
Linux在1996年第一次获得线程支持,现在已经有一套完整的与线程有关的函数库调用,大多数以pthread_开头,编译时需要用-lpthread选项进行连接。
我们用函数pthread_create创建一个新线程:#include <pthread.h>int pthread_create(pthread_t *thread, pthread_attr_t *attr,void *(*start_routine)(void *), void *arg);thread参数表示新线程的标识符;attr用于设置线程属性,如不需要设置,可设置为NULL;start_routine标识了线程启动程序的入口,arg为传入的参数。
调用pthread_create 就可以立即创建一个新的执行路线,与原有线程共享所有的主存空间,但拥有独立的堆栈。
2.2 信号量信号量通过一个计数器控制对共享资源的访问。
如果计数器大于0,则访问被允许,如果为0,则访问被禁止。
计数器计算的结果是允许访问共享资源的通行证。
因此,为了访问共享资源,线程必须从信号量得到通行证(P操作),如果该信号量的计数大于0,则此线程获得一个通行证,这将导致信号量的计数递减,否则,此线程将阻塞直到获得一个通行证为止。
理发师睡觉问题

理发师问题的描述:一个理发店接待室有n张椅子,工作室有1张椅子;没有顾客时,理发师睡觉;第一个顾客来到时,必须将理发师唤醒;顾客来时如果还有空座的话,他就坐在一个座位上等待;如果顾客来时没有空座位了,他就离开,不理发了;当理发师处理完所有顾客,而又没有新顾客来时,他又开始睡觉。
现在各种参考书上比较时兴的解决理发师问题的算法大概其就是下边这个算法,不同版本大同小异吧。
var mutex,barber,wakeup:semaphore:=1,0,0;empty:integer:=n+1; //empty表示空座位的数量,接待室加上工作室共n+1个座位beginparbegincustomer:beginwait(mutex); //mutex控制对empty的互斥访问if empty=0 then begin //如果没有空座,顾客走人,不理发了signal(mutex); exit();endelse beginempty:=emtpy-1;if empty=n-1 then beginsignal(wakeup); //如果是第一个顾客,得叫醒理发师signal(mutex);endelse beginsignal(mutex);wait(barber); //第一个顾客不用等待,后续的顾客需要等待理发师腾出手来end理发;end //对应else beginend //customer进程结束barber: beginwait(wakeup); //初始状态,理发师在睡觉,一旦被唤醒,就进入下边这个无限循环repeat理发; //被唤醒了,直接给第一个顾客理发wait(mutex); //收拾完一个,要修改空座的数量,争夺empty的控制权empty:=empty+1;if empty <n then begin //empty <n表示还有等着的顾客signal(barber); //表示理发师腾出手来了signal(mutex);endelse beginsignal(mutex);wait(wakeup); //没顾客了,睡觉去,等待唤醒end //对应else beginuntil false;end //barber进程结束parendend我感觉这个算法有点问题,因为customer进程中的“理发”语句和barber进程中的“理发”语句并不同步,当两个进程进入执行这两个语句的状态时,实际上已经失去了同步性。
系统调用中的信号量PV操作 理发师问题

⏹理发师问题:一个理发店由一间等候室W和一间工作室B组成。
顾客可以从外面大街上进入W等候理发。
两个房间的入口是并排的,且共享一扇日本式可滑动的推拉门(门总是挡住一个入口)。
顾客在工作室内理完发,可由B 的旁门出去。
W中有N把椅子,顾客必须坐着等候。
理发师可由门上小窗查看W中无人就睡觉,否则开门,并叫一位顾客入内理发。
顾客每进入一位,都拉铃通知理发师。
若把顾客和理发师都视为进程,请用P、V操作写出进程的同步算法。
⏹要求打印:题目中要求描述理发师和顾客的行为,因此需要两类线程barber()和customer ()分别描述理发师和顾客的行为。
其中,理发师有活动有理发和睡觉两个事件;等待和理发二个事件。
店里有固定的椅子数,上面坐着等待的顾客,顾客在到来这个事件时,需判断有没有空闲的椅子,理发师决定要理发或睡觉时,也要判断椅子上有没有顾客。
所以,顾客和理发师之间的关系表现为:(1)理发师和顾客之间同步关系:当理发师睡觉时顾客近来需要唤醒理发师为其理发,当有顾客时理发师为其理发,没有的时候理发师睡觉。
(2)理发师和顾客之间互斥关系:由于每次理发师只能为一个人理发,且可供等侯的椅子有限只有n把,即理发师和椅子是临界资源,所以顾客之间是互斥的关系。
(3)故引入3个信号量和一个控制变量:ⅰ控制变量waiting用来记录等候理发的顾客数,初值为0;ⅱ信号量customers用来记录等候理发的顾客数,并用作阻塞理发师进程,初值为0;ⅲ信号量barbers用来记录正在等候顾客的理发师数,并用作阻塞顾客进程,初值为1;ⅳ信号量mutex用于互斥,初值为1using System;using System.Collections.Generic;using System.Text;using System.Threading;namespace理发师问题2{internal class Program{// Fieldsprivate static Semaphore barbers = new Semaphore(1, 10);private static int chairs;private static int count = 0;private static Semaphore customers = new Semaphore(0, 10);private static int finish = 0;private static Semaphore mtx = new Semaphore(1, 10);private static int waiting = 0;// Methodspublic static void barber(){while (true){customers.WaitOne();mtx.WaitOne();waiting--;barbers.Release();mtx.Release();cuthair();finish++;}}public static void customer(){mtx.WaitOne();count++;Console.WriteLine("叮咚!第{0}个顾客来了", count);if (waiting < chairs){if (waiting > 0){Console.WriteLine("此时有{0}个人在等待理发", waiting);}else{Console.WriteLine("没有人在等待");}waiting++;Console.WriteLine("还有{0}个座位,顾客留下", (chairs - waiting) + 1);mtx.Release();customers.Release();barbers.WaitOne();gethaircut();}else{Console.WriteLine("座位已满,第{0}个顾客离开", count); mtx.Release();}}public static void cuthair(){Console.WriteLine("开始理发!这是理发师的第{0}个顾客.", finish + 1);Thread.Sleep(0x2328);Console.WriteLine("理发完成 !");}public static void gethaircut(){Thread.Sleep(0x238c);Console.WriteLine("第{0}个顾客理发完毕,离开.", finish);}private static void Main(string[] args){string str = string.Empty;Console.WriteLine("请输入椅子的总数目:");chairs = Convert.ToInt32(Console.ReadLine());Console.WriteLine("理发店共有{0}把椅子", chairs);Console.WriteLine("开门接待顾客吗?Y/N");for(string str2 = Console.ReadLine(); (str2 != "Y") && (str2 != "y"); str2 = Console.ReadLine()){Console.WriteLine("********对不起,尚未开门!********");Console.WriteLine("开门接待顾客吗?Y/N");}Console.WriteLine("********营业中,欢迎光临!********");new Thread(new ThreadStart(Program.barber)).Start();while ((str != "y") && (str != "Y")){Random random = new Random(lisecond);Thread.Sleep(random.Next(1, 0x2710));Console.WriteLine("*******************************");new Thread(new ThreadStart(Program.customer)).Start();if ((finish >= 10) && (waiting == 0)){Console.WriteLine("已经为{0}个顾客理发了,要关门下班吗?(Y/N)", finish);str = Console.ReadLine();}if ((str == "Y") || (str == "y")){Console.WriteLine("************暂停营业!**********");break;}}}}}题目: 用多线程同步方法解决睡眠理发师问题(Sleeping-Barber Problem)理发店有一位理发师,一把理发椅和n把用来等候理发的椅子。
理发师问题

设计思想打瞌睡的理发师问题是一种同步问题的抽象描述。
计算机系统中的每个进程都可以消费或生产某类资源,当系统中某一进程使用某一资源时,可以看作是消耗,且该进程称为消费者。
而当某个进程释放资源时,则它就相当一个生产者。
因此此题可看作是n个生产者和1个消费者问题。
顾客作为生产者,每到来一个就使计数器count增加1,以便让理发师理发(相当于消费)至最后一个顾客(相当于产品)。
并且,第1个到来的顾客应负责唤醒理发师;如果不是第1个到达的顾客,则在有空椅子的情况下坐下等待,否则离开理发店(该消息可由计数器count获得)。
所以可以通过一个有界缓冲区把理发师和顾客联系起来。
而其中的信号也具有两种功能:一是跟踪资源的理发师和顾客的计数器;二是协调资源的理发师和顾客之间的同步器。
通过对信号进行P、V 操作来实现有关问题和相关描述。
一、数据结构:1、信号量:int Custom;//所有到达的顾客,包括正在被理发的顾客,所以一般情况下,Custom比Wait_Person大1.int Mutex;//用于实现全局变量Wait—preson访问的互斥int Wait_Leave;//等待离开信号量,用来表示几个顾客等待离开,只要理发师为其理发完毕,他就可以离开了2、PV操作伪代码Int waiting=0;//等候理发的顾客数Int chairs=n//为顾客准备的椅子数Semaphore customers=0, barbers=0,mutex=1;barber(){while(TRUE);//理完一人,还有顾客吗?P(cutomers);//若无顾客,理发师睡眠P(mutex);//进程互斥Waiting-=1;//等候顾客数少一个V(barbers);//理发师去为一个顾客理发V(mutex);//开放临界区cut-hair();//正在理发}、customer(){P(mutex);//进程互斥if(waiting){waiting+=1;//等候顾客数加1V(customers);//必要的话唤醒理发师V(mutex);//开放临界区P(barbers);//无理发师,顾客坐着养神get-haircut( );//一个顾客坐下等理/ }ElseV(mutex);//人满了,离开}。
理发师悖论

理发师悖论什么是理发师悖论理发师悖论是罗素悖论的通俗举例,是由伯特兰·罗素在1901年提出的。
罗素悖论的出现是由于朴素集合论对于元素的不加限制的定义。
由于当时集合论已成为数学理论的基础,这一悖论的出现直接导致了第三次数学危机,也引发了众多的数学家对这一问题的补救,最终形成了现在的公理化集合论。
同时,罗素悖论的出现促使数学家认识到将数学基础公理化的必要性。
[编辑]理发师悖论的内容一个城市里唯一的理发师立下了以下的规定:只帮忙那些自己不打扫卫生的人打扫卫生。
现在问一个问题:理发师必须为自己打扫卫生吗?你会发现理发师处于两难,因为:如果理发师自己不打扫卫生,他须要遵守规则,帮忙自己打扫卫生.如果理发师就是自己打扫卫生的,他须要遵守规则,不帮给自己打扫卫生换用集合语言:可以把子集分成两类,凡不为自身为元素的子集称作第一类子集;凡以自身做为元素的子集称作第二类子集。
似乎每个子集或为第一类子集或为第二类子集。
设立为第一类子集的全体共同组成的子集。
类集合是第一类集合,由集合的定义知:应该是的元素,这表明是第二如果就是第二类子集,那么就是它自身的元素二者皆导出矛盾,而整个讨论逻辑上是没有问题的。
问题只能出现在集合的定义上。
设立对于一类子集,都满足条件但一切这类集合构成新集合,那么是否有如果[]?如果指出就应当就是本子集的元素,即则a必须不是自身子集的元素,即为,所以矛盾。
,补救由于罗素悖论的出现所引发的第三次数学危机,公理化集合论势在必行。
德国数理逻辑学家策梅洛(zermelo,1871年-1953年)应用领域自己的公理系统,使子集在[[公理]]的管制下不能太小,从而防止了罗素悖论。
经过改良,这一系统构成了现在被称作zf系统的公理集合论体系。
这个体系至今没辨认出悖论。
按我们通常对集合的理解,我们可以把集合分成两种,一种是属于自身的,即自己是自己的元素,另一种是不属于自身的。
设s是由所有不自身的集合组成的集合,那么s是否属于它自己?若s属于s,依s的定义,s中的元素都不应该属于自己;而若s不属于s,则按照s的定义,s应该是所有不属于自己的集合构成的集合,那么s又属于s。
同步与互斥实例

(2)每个进程每次只拣一个子,当一个进程在 拣子时不允许另一进程去拣子;
(3)当一个进程拣了一个子(黑或白)以后, 必让另一个进程拣一个子(黑或白) 。
请用P、V操作管理两个并发进程,使其能正 确实现上述功能。
Var S1, S2: semaphore:=1,0;
理发师问题理发师问题l理发店里有一位理发师一把理发椅和n把供等候理发的顾客坐的椅子l如果没有顾客理发师便在理发椅上睡觉l一个顾客到来时它必须叫醒理发师l如果理发师
进程同步与互斥实例
同步实例
1.经典的生产者─消费者问题
生产者
消费者
1.经典的生产者─消费者问题
var B : integer;
empty:semaphore; /* 可以使用的空缓冲区数 */
process 小和尚: begin repeat P(empty); P(count); P(mutex1); 从井中取水; V(mutex1); P(mutex2); 送水入水缸; V(mutex2); V(count); V(full); until false;
end
Var mutex1, mutex2, empty, full, count: semaphore;
④在每个进程中用于实现互斥的PV操作必须成对出现;用于实现 同步的PV操作也必须成对出现,但可以分别出现在不同的进程中; 在某个进程中如果同时存在互斥与同步的P操作,则其顺序不能颠 倒,必须先执行对同步信号量的P操作,再执行对互斥信号量的P 操作,但V操作的顺序没有严格要求。
同步与互斥的解题步骤
full:semaphore;
/* 缓冲区内可以使用的产品数 */
empty := 1;
理发店问题

#include <windows.h> #include "iostream.h" #include "math.h"
#define random (rand()*10000)/RAND_MAX //定义一个随机函数来产生顾客,并且使两个顾客间的时间少于10秒
int long waiting(0); //正在等待的顾客的数目
} 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");
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;
计算机操作系统理发师问题-JAVA模板

课程实验报告题目计算机操作系统理发师问题姓名潘 *学号 2013 ***年级专业2013级*指导教师彭 * 华201*年1*月 30 日一题目假设有个理发店,只有一个理发师和N张可供顾客等待理发的椅子,如果没有顾客,则理发师睡觉,如果有一个顾客进入理发店发现理发师在睡觉,则把他叫醒,试用信号量设计一个协调理发师和顾客的程序。
二 PV操作伪代码C语言的伪代码实现:int waiting=0 ;//等候理发的顾客数int chairs=n;//为顾客准备的椅子数semaphore customers=0, barbers=0,mutex=1;barber() {while(TRUE); //理完一人,还有顾客吗?P(cutomers); //若无顾客,理发师睡眠P(mutex); //进程互斥waiting -= 1;//等候顾客数少一个V(barbers); //理发师去为一个顾客理发V(mutex); //开放临界区cut-hair(); //正在理发}customer() {P(mutex); //进程互斥if(waiting) {waiting += 1; // 等候顾客数加1V(customers); //必要的话唤醒理发师V(mutex); //开放临界区P(barbers); //无理发师, 顾客坐着养神get-haircut( ); //一个顾客坐下等理/}else V(mutex); //人满了,离开}三程序流程图顾客模块:理发师模块:四源程序的实现因为本人对C++的多线程库函数不了解,于是使用JAVA实现理发师问题,假设有5张可供顾客理发的椅子:package com.swxy;import java.util.concurrent.Semaphore;//导入Semaphore,用于控制进程同步互斥的量。
public class BarberShop {static int cnt = 0;// 顾客static int MAX = 5;// 假设5张可供顾客理发的椅子static int busy = 0;static Semaphore mutex= new Semaphore(1);// 临界区互斥访问信号量(二进制信号量),相当于互斥锁。
理发师问题

理发师问题理发师问题:一个理发店有一个入口和一个出口。
理发店内有一个可站5 位顾客的站席区、4 个单人沙发、3 个理发师及其专用理发工具、一个收银台。
新来的顾客坐在沙发上等待;没有空沙发时,可在站席区等待;站席区满时,只能在入口外等待。
理发师可从事理发、收银和休息三种活动。
理发店的活动满足下列条件:1)休息的理发师是坐地自己专用的理发椅上,不会占用顾客的沙发;2)处理休息状态的理发师可为在沙发上等待时间最长的顾客理发;3)理发时间长短由理发师决定;4)在站席区等待时间最长的顾客可坐到空闲的理发上;5)任何时刻最多只能有一个理发师在收银。
试用信号量机制或管程机制实现理发师进程和顾客进程。
原理:(1)customer 进程:首先检查站席区是否已满(stand_capacity),若满选择离开,否则进入站席区,即进入理发店。
在站席区等待沙发的空位(信号量sofa),如果沙发已满,则进入阻塞等待队列,直到出现空位,在站席区中等待时间最长的顾客离开站席区(stand_capacity)。
坐到沙发上,等待理发椅(barber_chair),如果理发椅已满,则进入阻塞等待队列,直到出现空位,在沙发上等待时间最长的顾客离开沙发(释放信号量sofa)。
坐到理发椅上,释放准备好的信号(customer_ready),获得该理发师的编号(0~1 的数字)。
等待理发师理发结束(finished[barber_number])。
在离开理发椅之前付款(payment),等待收据(receipt),离开理发椅(leave_barberchair)。
最后离开理发店。
这里需要注意几点:a) 首先是几个需要进行互斥处理的地方,主要包括:进入站席区、进入沙发、进入理发椅和付款几个地方。
b) 通过barber_chair 保证一个理发椅上最多只有一名顾客。
但这也不够,因为单凭baber_chair 无法保证一名顾客离开理发椅之前,另一位顾客不会坐到该理发椅上,因此增加信号量leave_barberchair,让顾客离开理发椅后,释放该信号,而理发师接收到该信号后才释放barber_chair 等待下一位顾客。
理发师悖论:逻辑学问题的经济学解答·续篇

理发师悖论:逻辑学问题的经济学解答·续篇前一篇文章着重论说的问题是,张三给自己理发≠张三是自己的顾客,形式化表达(也是集合论的基本定义)就是,a∉a,{a}∉{a}。
其含义在现实世界里的表现就是,任一个体、任一集合不可能在自身中保持变化的一致性,个体及集合的自身同一性不是自足的,而是在a 与非a、{a}与{﹁a}的关系中得到维系。
凡个体、集合皆有边界,个体、集合只有与外界发生关系,才能保持其存在的独特性和唯一性。
这样,我们就可以对交易的必然性及其起源做出逻辑解释。
对于个人来说就是,每个人只有与他人进行交往/交流/交易,才能得到收益;对于国家(一种特殊的集合,可称为权力集)来说就是,每个国家只有参与国际贸易,才能发展本国经济。
顺带说明一下,内循环≠自循环,中国目前有无实力以内循环带动外循环,这是一个有待另外论述的问题。
有些读友表示质疑,认为理发师悖论只是与张三给不给自己理发有关,与张三是不是自己的顾客无关。
为此,有必要续写一篇,着重说明其间的内在相关性。
张三的顾客都是不给自己理发的人≠不给自己理发的人都是张三的顾客,张三的顾客都是不给自己理发的人=不给自己理发的人有些是张三的顾客有些不是张三的顾客。
对于张三而言,不给自己理发的人=张三的顾客+非张三的顾客,非张三的顾客=理发师李四、王五等的顾客。
把“不给自己理发的人”划分为“张三的顾客”和“非张三的顾客”两部分,依据的是事理而不是规则。
就是说,张三无法从自己给自己理发的行为中得到收入,他只能以那些不给自己理发的人为顾客;张三也无法成为垄断者,使得某个地区所有不给自己理发的人都是他的顾客。
所有不给自己理发的人都是张三的潜在顾客,而不是张三的实际顾客。
逻辑学家不做潜在与现实的区别(现实的必定都是合理的,合理的必定都是现实的),所有不给自己理发的人都是张三的顾客,如果张三给自己理发,那么张三也是自己的顾客。
这样,“张三给不给自己理发”的问题转换为“张三是不是自己的顾客”问题,张三只有把自己作为自己的顾客,才能给自己理发。
- 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)&nNULL // 不需要获得线程号码);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);//释放互斥量,以便其他线程使用该函数释放由线程拥有的一个互斥体。
3.2 概要设计程序由三部分组成:主函数模块、理发师进程模块和顾客进程模块。
3.2.1 主函数模块在主程序模块中,主要实现线程的操作。
开始创建理发师线程,当有顾客到来时,在创建顾客线程来实现对顾客的操作,即开始理发,当顾客全部理发完成时,判定理发师是否关门,如果是,则结束理发师线程,程序结束;如果不是,则理发师线程继续操作,直到结束。
主程序如图3-1所示。
图3-1 主程序流程图3.2.2 理发师进程模块在理发师模块中,但有顾客来的时候,理发师线程开始申请顾客信号量,顾客减一,理发师理发,释放理发师信号量。
如果没有顾客直接释放理发师信号量。
图3-2 理发师模块流程图3.2.3 顾客进程模块在顾客模块中,当一个顾客来的时候,判断顾客人数要小于椅子数,如果没有空椅子顾客离去,如果有空椅子,顾客等待且顾客人数加1,释放顾客信号量,等待理发师理发。
图3-3 顾客模块流程图3.3 详细设计和代码3.3.1 PV操作伪代码理发师和顾客的进程之间是同步的,利用customer,barbers,mutex三个信号量来实现进程互斥。
对于顾客,顾客到来和顾客在理发是互斥的,对于理发师,理发师理发和理发师睡眠时互斥的。
通过成对出现的P和V操作实现。
具体伪代码如下:int waiting=0 ; //等候理发的顾客数int chairs=n; //为顾客准备的椅子数semaphore customers=0, barbers=0,mutex=1;//申明3个信号量barber(){while(TRUE); //理完一人,还有顾客吗?P(cutomers); //若无顾客,理发师睡眠P(mutex); //进程互斥waiting := waiting - 1; //等候顾客数少一个V(barbers); //理发师去为一个顾客理发V(mutex); //开放临界区cut-hair( ); //正在理发}customer(){P(mutex); //进程互斥if (waiting){waiting := waiting+1; // 等候顾客数加1V(customers); //必要的话唤醒理发师V(mutex); //开放临界区P(barbers); //无理发师, 顾客坐着养神get-haircut( ); //一个顾客坐下等理/}elsep(mutex); //人满了,离开! }3.3.2 理发师进程模块代码理发师进程主要是在理发师为一个顾客理发完成时,理发完毕的顾客数加一,等待理发的顾客数减一。
其代码如下:DWORD WINAPI barber(LPVOID pParm1)//理发师线程{while(true){WaitForSingleObject(customers,INFINITE);//p(customers)等待顾客 WaitForSingleObject(Mutex,INFINITE);//等待互斥量ReleaseSemaphore(barbers,1,NULL);//释放信号量ResumeThread(barbers); //唤醒顾客进程;sleep(2000); //模拟理发(来源于#include<ctime>)finish++; //理发完毕的顾客数目加1cout<<"第"<<finish<<"个顾客理发完毕,离开 "<<endl;waiting--; //等待的人数减1ReleaseMutex(Mutex); //v(mutex);}return 0;}3.3.3 顾客进程模块代码顾客进程是当理发师睡眠时唤醒进行理发,理发师正在进行理发时等待。
如果没有等待的椅子则直接离开。
具体代码如下:DWORD WINAPI customer(LPVOID pParm2)// 顾客线程{if(ReleaseSemaphore(customers,1,NULL))//V(customer){WaitForSingleObject(Mutex ,INFINITE);count++;cout<<"您是第 "<<count<<" 位顾客,欢迎您"<<endl;if (waiting!=0)//(waiting来源于WaitForSingleObject){cout<<"现在有"<<waiting <<" 位顾客在等待理发,请您耐心等待"<<endl;。