操作系统--理发师问题

合集下载

操作系统实验五 理发师问题

操作系统实验五 理发师问题

实验题目:理发师问问题学号: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文件,在里面声明两个消息队列,当沙发空闲时则会将空闲的消息放入相应的队列中,让顾客可以进入沙发中,当理发师空闲时,也会将相应的消息放入队列中,从而可以让顾客到理发椅上进行理发。

linux理发师多线程问题

linux理发师多线程问题

用多线程同步方法解决睡眠理发师问题( Sleeping-Barber Problem)1 .操作系统:Linux2 .程序设计语言:C语言3 .设有1个理发师5把椅子(另外还有一把理发椅),几把椅子可用连续存储单元.1.技术要求:1)为每个理发师/顾客产生一个线程,设计正确的同步算法2)每个顾客进入理发室后,即时显示“Entered”及其线程自定义标识,还同时显示理发室共有几名顾客及其所坐的位置。

3)至少有10 个顾客,每人理发至少3秒钟。

4)多个顾客须共享操作函数代码。

提示:(1) 连续存储区可用数组实现。

(2) 编译命令可用:gcc -lpthread -o 目标文件名源文件名(3) 多线程编程方法参见附件。

)详细代码#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <errno.h>#include <pthread.h>#include <sys/ipc.h>#include <semaphore.h>#include <fcntl.h>#define n 5time_t end_time;sem_t mutex, customers, barbers;int count = 0;int chair [5] = {-1, -1, -1, -1, -1 };void barber(void *arg)while (time (NULL) < end_time || count>0)while (count > 0)sem_wait(&customers);sem_wait(&mutex);count--;printf ("the barber is cutting hair, count is : %d\n", count);sem_post(&mutex);sem_post(&barbers);sleep(3);void customer (void *arg)int i ,id= 0, num=0;while (time (NULL) < end_time)sem_wait(&mutex);if (count< n)count++;num= count % 5;num++;printf("customer entered:the customer %s comes in and sits at %d the chair count is:%d\n", (char *)arg, num, count);sem_post(&mutex);sem_post(&customers);sem_wait(&barbers);elsesem_post(&mutex);sleep(2);int main (int argc, char *argv[])pthread_t id1, id2, id3, id4, id5, id6, id7, id8, id9, id10, id11;int ret= 0;int i;end_time = time (NULL) + 30;sem_init (&mutex, 0, 1);ret = sem_init (&barbers, 0, 1);for (i =0;i<5;i++)chair [i] = -1;if (0!= ret)perror("sem init");ret= pthread_create (&id11, NULL, (void*)barber,"id11"); if (0!= ret)perror("create barber");ret = pthread_create ( &id1,NULL,(void*)customer, "id1"); if (0!= ret)perror("create customers");ret = pthread_create(&id2, NULL, (void*)customer, "id2"); if (0!=ret)perror("create customers");ret = pthread_create(&id3, NULL, (void*)customer, "id3"); if (0!=ret)perror("create customers");ret = pthread_create(&id4, NULL, (void*)customer, "id4"); if (0!=ret)perror("create customers");ret = pthread_create(&id5, NULL, (void*)customer, "id5"); if(0!=ret)perror("create custmers");ret = pthread_create(&id6, NULL, (void*)customer, "id6"); if (0!= ret)perror("create customers");ret = pthread_create ( &id7,NULL,(void*)customer, "id7"); if (0!= ret)perror("create customers");ret = pthread_create(&id8, NULL, (void*)customer, "id8"); if (0!=ret)perror("create customers");ret = pthread_create(&id9, NULL, (void*)customer, "id9"); if (0!=ret)perror("create customers");ret = pthread_create(&id10, NULL, (void*)customer, "id10");if (0!=ret)perror("create customers");pthread_join(id1, NULL);pthread_join(id2, NULL);pthread_join(id3, NULL);pthread_join(id4, NULL); pthread_join(id5, NULL); pthread_join(id6, NULL); pthread_join(id7, NULL); pthread_join(id8, NULL); pthread_join(id9, NULL); pthread_join(id10, NULL); pthread_join(id11, NULL); exit(0);运行结果如下。

山大操作系统实验五

山大操作系统实验五

⼭⼤操作系统实验五⼭东⼤学软件学院操作系统实验报告实验题⽬:进程互斥实验实验⽬的:进⼀步研究与实践操作系统中关于并发进程同步与互斥操作的⼀些经典问题的解法,加深对于⾮对称性互斥问题有关概念的理解。

观察与体验⾮对称性互斥问题的并发控制⽅法。

进⼀步了解Linux系统中IPC进程同步⼯具的⽤法,训练解决对该类问题的实际编程、调试与分析问题的能⼒。

实验要求:理发店问题:假设理发店的理发室中有3个理发椅⼦与3个理发师,有⼀个可容纳4个顾客坐等理发的沙发。

此外还有⼀间等候室,可容纳13位顾客等候进⼊理发室。

顾客如果发现理发店中顾客已满(超过20⼈),就不进⼊理发店。

在理发店内,理发师⼀旦有空就为坐在沙发上等待时间最长的顾客理发,同时空出的沙发让在等候室中等待时间最长的的顾客就坐。

顾客理完发后,可向任何⼀位理发师付款。

但理发店只有⼀本现⾦登记册,在任⼀时刻只能记录⼀个顾客的付款。

理发师在没有顾客的时候就坐在理发椅⼦上睡眠。

理发师的时间就⽤在理发、收款、睡眠上。

请利⽤linux系统提供的IPC进程通信机制实验并实现理发店问题的⼀个解法。

总结与分析⽰例实验与独⽴实验中观察到的调试与运⾏信息,说明您对与解决⾮对称性互斥操作的算法有哪些新的理解与认识?为什么会出现进程饥饿现象?本实验的饥饿现象就是怎样表现的?怎样解决并发进程间发⽣的饥饿现象?您对于并发进程间使⽤消息传递解决进程通信问题有哪些新的理解与认识?根据实验程序、调试过程与结果分析写出实验报告。

硬件环境:CPU: P4/1、8MHz 内存:256MB 硬盘: 10GB软件环境:Ubuntu08、4-Linux 操作系统Gnome 桌⾯2、18、3BASH_VERSION='3、2、33(1)-releasegcc version 4、1、2vi 3、1、2gedit 2、18、2OpenOffice 2、3实验步骤:1.问题分析假设理发店的理发室中有3个理发椅⼦与3个理发师,有⼀个可容纳4个顾客坐等理发的沙发。

《操作系统》打瞌睡理发师课程设计

《操作系统》打瞌睡理发师课程设计

课程设计(论文)课程名称______操作系统___________题目名称_____打瞌睡理发师问题______学生学部(系)___信息与计算机学部__专业班级_08计算机科学与技术3班____学号____ ____________学生姓名________ _____________指导教师________ _ ___________ 2010 年 12 月 28 日课程设计(论文)任务书一、课程设计(论文)的内容模拟解决打瞌睡的理发师问题:理发店内有一名理发师,一把理发椅,和N把普通的椅子。

如果没有顾客来,那么理发师就坐在理发椅上打瞌睡;当顾客到来时,就唤醒理发师。

如果顾客到来时理发师正在理发,顾客就坐下来等待。

如果N把椅子都坐满了,顾客就离开该理发店到别处去理发。

理发师刚开始理发时,先看看店里有没有顾客,如果没有,则在理发椅上打瞌睡;如果有顾客,则为等待时间最长的顾客理发,且等待人数减1。

顾客来到店里,先看看有无空位,如果没有空位,就不等了。

离开理发店;如果有空位则等待,等待人数加1;如果理发师在打瞌睡,则将其唤醒。

二、课程设计(论文)的要求与数据(1)需求分析(2)系统设计(3)模块代码能正常运行(4)提供合理的测试数据(5)设计说明文档三、课程设计(论文)应完成的工作(1)采用模块化的程序设计方法,程序书写符合规范,代码应完善。

(2)要有运行结果和过程的界面截图。

(3)对系统进行初步的错误和漏洞检测;(4)根据论文规范撰写论文,用A4纸打印并按时提交。

四、课程设计(论文)进程安排五、应收集的资料及主要参考文献[1] 郁红英,李春强.计算机操作系统.北京:清华大学出版社,2008[2] 孟庆昌.操作系统.北京:电子工业出版社,2009[3] 汤子瀛,哲凤屏.计算机操作系统.北京:电子工业出版社,2009[4] 尤晋元,史美林等.windows操作系统原理.北京:机械工业出版社,2001[5] 孟静.计算机操作系统原理教程.北京:清华大学出版社,2005[6] 广树建.新编C/C++程序设计教程.广州:华南理工出版社,2008发出任务书日期: 2010 年 12 月 10 日指导教师签名:计划完成日期: 2011 年 1 月 5 日通过对《操作系统》这门课的学习后,要求我们能够在深刻理解和应用有关经典进程的同步和互斥问题之余,能够模拟解决打瞌睡的理发师问题。

操作系统习题全解

操作系统习题全解

操作系统复习题考试必备!●进程同步1进程P1和进程P2并发执行时满足一定的时序关系,P1的代码段S1执行完后,才能执行P2的代码段S2.为描述这种同步关系, :试设计相应的信号量, :给出信号量的初始值,●:给出进程P1和P2的结构解答: 信号量变量申明为Typedef struct {int value; //信号量中的值,表示资源的数量struct PCB *L; //等待该信号量的队列}semaphore;设信号量semaphore synch;初始值为:synch.value=0●进程P1和P2的结构为P1: { P2: {⋮⋮S1 wait(synch);signal(synch); S2⋮⋮} }●进程同步2问题描述:(理发店问题)一个理发店有一间配有n个椅子的等待室和一个有理发椅的理发室。

如果没有顾客,理发师就睡觉;如果顾客来了二所有的椅子都有人,顾客就离去;如果理发师在忙而有空的椅子,顾客就会坐在其中一个椅子;如果理发师在睡觉,顾客会摇醒他。

①给出同步关系②设计描述同步关系的信号量;③给出满足同步关系的进程结构(请完成满足同步关系的进程结构)。

解答: 顾客customer应满足的同步关系为:a:顾客来时要等空的椅子,否则不进理发室b:座椅上的顾客要等理发椅空才有可能与别的顾客竞争理发椅,如果顾客坐上理发椅,就要腾空其座椅给新来顾客,同时叫理发师给其理发。

c:一旦顾客理发完,就要让别的等待顾客有机会理发。

理发师应满足的同步关系为:一旦顾客唤醒,就给顾客理发,之后进入睡觉。

信号量定义如下:Typedef struct {int value; //信号量中的值,表示资源的数量struct PCB *L; //等待该信号量的队列}semaphore;互斥信号量定义如下:Typedef struct {bool flag;struct PCB *L;}binary_semaphore;理发店问题的解决需要信号量和互斥信号量为:semaphore chair; binary_semaphore barber_chair, hair_cut;它们的初始值为:chair.value=n; barber_chair.flag=1; hair_cut.flag=0;●顾客和理发师进程分别为:customer { barber {wait(chair); do {waiting in the chair;wait(hair_cut);wait(barber_chair); cutting hair;signal(hair_cut); signal(barber_chair);sitting in barber chair for haircut; }while(1)signal(chair); }}●进程同步2设公共汽车上,司机和售票员的活动分别为:司机的活动为启动车辆,正常行车,到站停车;售票员的活动为关车门,售票,开车门。

操作系统课程设计---理发师问题的实现

操作系统课程设计---理发师问题的实现

操作系统课程设计---理发师问题的实现(总18页)本页仅作为文档封面,使用时可以删除This document is for reference only-rar21year.March*******************实践教学*******************兰州理工大学计算机与通信学院2011年秋季学期操作系统课程设计题目:理发师问题的实现专业班级:计算机科学与技术姓名:学号:指导教师:成绩:摘要理发师问题是一个利用信号量进行PV操作的经典问题。

设计程序实现此问题,要使得理发师的活动与顾客的活动得到各自真实的模拟。

所执行的程序应体现:理发师在没有顾客的时候去睡觉,有顾客则工作;顾客在理发师工作时坐下等待,无座时离开,直至等到理发师自己理发。

关键字:理发师,顾客,PV操作。

目录摘要................................................................................................................. 错误!未定义书签。

1 设计要求........................................................................................................ 错误!未定义书签。

初始条件 ........................................................................................ 错误!未定义书签。

技术要求 ........................................................................................ 错误!未定义书签。

2 总体设计思想及开发环境与工具................................................................ 错误!未定义书签。

理发师问题操作系统课程设计

理发师问题操作系统课程设计

理发师问题操作系统课程设计河南城建学院《操作系统》课程设计报告课程名称: 《操作系统》课程设计设计题目: 理发师问题指导教师: 李蓓耿永军班级:学号:学生姓名:同组人员:成绩:评语:计算机科学与工程学院2014年6月19日前言现在计算机更新如此迅速的时代要学好计算机软件技术,特别是操作系统的学习,不仅要努力学好课本上的基础知识,还要经常在图书馆看些有关这方面的书籍,而更重要的是要有足够的实践经验,也要注重和同学的交流,经常尝试性的做些小的操作系统,对自己技术的提升会有很大的帮助。

同时,学习计算机操作系统技术,除了需要刻苦努力外,还需要掌握软件和操作系统的原理与设计技巧。

如何学习和掌握操作系统技术的原理与实际技巧呢?除了听课和读书之外,最好的方法恐怕就是在实践中练习。

例如,自己设计一个小型操作系统,多使用操作系统,多阅读和分析操作源代码等。

但由于我们的条件和学时有限,在理论学习过程中没有给同学们提供更多的实验机会。

本操作系统课程设计,是给同学提供一个集中实验的机会。

希望同学们通过该设计加深对所学习课程的理解。

本设计的内容是基于《操作系统原理》、《C语言程序设计》和《数据结构》等内容。

本设计是基于课程中学到的UNIX系统调用,使用操作系统环境是Red Hat Linux 9,言语开发环境是Linux的GNU C或C++。

完成本次课程设计,首先必须配置操作系统编写的所需的环境,包括虚拟机的建立和相应环境建立。

用VI编辑器编写相应得程序,以实现理发师进程的同步与互斥。

目录第一章.系统环境 ..................................................................... .. (1)1.1硬件环境 ..................................................................... . (1)1.2软件环境 ..................................................................... . (1)第二章.设计目的及要求 ..................................................................... .. (2)2.1设计目的 ..................................................................... . (2)2.2 要求 ..................................................................... .. (2)2.3 内容 ..................................................................... .. (2)第三章.总体设计 ..................................................................... .. (3)3.1程序设计组成框图 ..................................................................... (3)3.2 主函数流程图 ..................................................................... . (4)3.3理发师进程流程图 ..................................................................... (5)3.4 顾客进程流程图 ..................................................................... (5)3.5函数调用 ..................................................................... . (6)第四章.详细设计 ..................................................................... .. (7)4.1概要设计 ..................................................................... . (7)4.1.1 数据结构 ..................................................................... .. (7)4.1.2 多线程编译原理 ..................................................................... .. (7)4.1.3 创建线程 ..................................................................... .. (7)4.1.4 信号量 ..................................................................... (8)4.2 头文件声明 ..................................................................... .. (8)4.3函数定义 ..................................................................... . (9)4.4 变量定义 ..................................................................... (9)4.5函数实现 ..................................................................... . (9)第五章.调试与测试 ..................................................................... .. (11)5.1调试方法 ..................................................................... .. (11)5.2结果分析 ..................................................................... ..................................................... 13 第六章.设计中遇到的问题及解决方法 ..................................................................... (14)6.1出现的问题 ..................................................................... . (14)6.2解决方法 ..................................................................... ..................................................... 14 第七章.源程序清单和执行结果 ..................................................................... (16)7.1源程序清单 ..................................................................... . (16)7.2程序执行结果 ..................................................................... ............................................. 19 第八章.心得体会 ..................................................................... (20)第九章.参考文献 ..................................................................... (21)1 《操作系统》课程设计第一章.系统环境1.1硬件环境内存1GB,处理器1,硬盘(SCSI)50GB,网络适配器NAT。

操作系统--理发师问题

操作系统--理发师问题

操作系统--理发师问题正文:一:背景介绍理发师问题是一个经典的并发编程问题,涉及到同时访问共享资源的多个线程之间的同步问题。

该问题的背景可以描述为:在一个理发店里,有一个理发师和一排等待理发的顾客,每个顾客需要等待一段时间才能坐到理发椅上理发。

当有空闲的理发师时,顾客就会坐到椅子上进行理发,否则就需要等待其他顾客理发结束。

该问题需要设计一个合理的算法,保证每个顾客都能够得到理发椅上的理发服务。

二:问题分析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个消费者问题。

顾客作为生产者,每到来一个就使计数器count增加1,以便让理发师理发(相当于消费)至最后一个顾客(相当于产品)。

并且,第1个到来的顾客应负责唤醒理发师;如果不是第1个到达的顾客,则在有空椅子的情况下坐下等待,否则离开理发店(该消息可由计数器count获得),所以可以通过一个有界缓冲区把理发师和顾客联系起来通过对信号进行P、V操作来实现有关问题和相关描述。

源程序文件:#include<windows.h>#include<stdio.h>#include<iostream>#include<process.h>#include<conio.h>#include<ctime>using namespace std;#define CHAIRS 3 //椅子的个数#define BARBERS 1 //理发师的个数#define CUSTOMESTOCOME 7 //将要来的顾客的数目typedef HANDLE semaphore;static int count=0; //记录理发店顾客的总数,初始化为0int leaved=0; //记录理发店顾客的总数,初始化为0int waiting=0;time_t endtime; //关闭营业的时间//coustomers初始化为0,最大顾客数为3semaphore customers=CreateSemaphore(NULL,0,CHAIRS,TEXT("customers")); //barbers的数量初始化为1,假设一共有1个barbersemaphorebarbers=CreateSemaphore(NULL,BARBERS,BARBERS,TEXT("barbers"));//建立互斥变量,用于保护共享资源HANDLE mutex=CreateMutex(NULL,FALSE,TEXT("mutex"));DWORD WINAPI barber(LPVOID lparameter);DWORD WINAPI customer(LPVOID lparameter);//理发师理发void cutHair();//顾客坐到椅子上等待void getChair();//等待顾客到来void wait();//顾客离开void customerLeave();//顾客进入void customerEnter();void up(HANDLE hHandle){//对指定信号量增加指定的值ReleaseSemaphore(hHandle,1,NULL);//恢复线程ResumeThread(hHandle);}void upMutex(HANDLE hMutex){//释放线程拥有的互斥体ReleaseMutex(hMutex);}void down(HANDLE hHandle){ //DOWN operation//线程挂起,等待信号WaitForSingleObject(hHandle,INFINITE);}int main(){//结束时间endtime=time(0)+20000;//创建理发师线程HANDLE barberThread=CreateThread(NULL,0,barber,NULL,0,NULL);HANDLE customerThread;//产生10个客户进程,每两个进程之间间隔一个随见时间1000~1050 while(count<CUSTOMESTOCOME){//创建客户进程customerThread=CreateThread(NULL,0,customer,NULL,0,NULL);srand(unsigned(time(0)));int time=rand()%1000+50;Sleep(time);}//释放资源CloseHandle(barberThread);CloseHandle(customerThread);CloseHandle(barbers);CloseHandle(customers);CloseHandle(mutex);cout<<"离开的顾客总数为:"<<leaved<<endl;return 0;}DWORD WINAPI barber(LPVOID lparameter) {while(time(0)<endtime){//没有客户,则进入睡眠状态down(customers);//临界区操作down(mutex);waiting=waiting-1;upMutex(mutex);//开始理发cutHair();//理发结束,理发师信号量加1up(barbers);}return 0;}DWORD WINAPI customer(LPVOID lparameter){ //客户到来customerEnter();//临界区操作down(mutex);cout<<"等̨¨待äy的Ì?顾?客¨ª数ºy: "<<waiting<<endl;cout<<"空?椅°?子Á¨®数ºy: "<<CHAIRS-waiting<<endl;if(waiting<CHAIRS){ //如果有空椅子,客户等待,否则离开if(waiting!=0){//等待顾客到来wait();}waiting=waiting+1;//客户信号量加1up(customers);upMutex(mutex);//离开临界区//理发师进程等待唤醒down(barbers);//顾客坐下来等待getChair();}else{//释放互斥锁upMutex(mutex);//顾客离开customerLeave();}return 0;}void cutHair(){static int served=0;served++;cout<<理发师帮第"<<served<<"位被服务的顾客理发"<<endl;Sleep(1000);cout<<"第"<<served<<"位被服务的顾客理完发"<<endl;}void getChair(){Sleep(1050);}void customerEnter(){count++;SYSTEMTIME sys;GetLocalTime( &sys );cout<<endl<<"第"<<count<<"位顾客进来"<<endl;}void wait(){cout<<"有空位,第"<<count<<"位顾客就坐"<<endl;}void customerLeave(){cout<<"没有空椅子,第"<<count<<"位顾客离开 ."<<endl;leaved++;}输出截图:PS:由于我对c++中处理进程、信号的函数不熟,所以有许多参考了网上的代码。

系统调用中的信号量PV操作 理发师问题

系统调用中的信号量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把用来等候理发的椅子。

操作系统算法复习题以及各题标准答案

操作系统算法复习题以及各题标准答案

操作系统算法各题标准答案真经之理发师问题扩展(电子科技大学2000)有一个理发师,一把理发椅和n把供等候理发的顾客坐的椅子,若没有顾客,则理发师睡觉,当一个顾客到来时,必须唤醒理发师进行理发, 若理发师正在理发,又有顾客到来,则若有空椅子可坐就坐下来等,若没有空椅子就离开.问题分析:需要设置一个信号量barber,初值为0,用于控制理发师和顾客之间的同步关系.还需要设置一个信号量customer,初值为0,用于离开顾客与等候顾客之间的同步控制,为了记录等候的顾客数, 应该设置一个计数器count,初值为0.当一个顾客到达时,需要在count上做加1操作,并根据count值的不同分别采取不同的动作,当顾客离开时,要对count上做减1操作,并根据count值的不同分别采取不同的动作;由于count是共享变量,因此要互斥使用,为此设置一个互斥信号量mutex;beginvarbarber=0,customer=0,count=0,mutex=1:s emaphore;cobeginprocess barberbeginrepeatp(customer);p(mutex);count = count -1;v(barber);v(mutex);理发;until falseEndprocess customer beginrepeat;p(mutex);if(count<n){count = count +1;v(customer);p(barber);理发;}else{v(mutex);离开;}until falseendcoendEnd真经之生产消费问题扩展(浙江大学2001) 假设缓冲区buf1和缓冲区buf2无限大,进程p1向buf1写数据,进程p2向buf2写数据,要求buf1数据个数和buf2数据个数的差保持在(m,n)之间(m<n,m,n都是正数).问题分析:题中没有给出两个进程执行顺序之间的制约关系,只给出了一个数量上的制约关系,即m·—buf1数据个数-buf2数据个数·n.不需要考虑缓冲区的大小,只需要考虑两个进程的同步和互斥.p2向buf2写数据比p1向buf1写数据的次数最少不超过m次,最多不能超过n次,反之也成立.所以是一个生产者和消费者问题。

理发师问题的Linux解决

理发师问题的Linux解决

调试成功,仅供参考。

理发师进程Barbers(){While(true){P(customers)P(mutex)Count--;V(mutex)V(barbers)理发师理发;}}顾客进程Customer(){While(true){P(mutex);If(count<N){Count++V(mutex);V(customer) P(barbers);顾客被理发}elseV(mutex);}}Linux实现#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <pthread.h>#include <errno.h>#include <sys/ipc.h>#include <semaphore.h>#include <fcntl.h>#define n 5time_t end_time; /*end time*/sem_t mutex,customers,barbers;int count = 0;//等待理发的顾客数void barber(void* arg);void customer(void* arg);int main(int argc, char *argv[]){pthread_t id1,id2;int ret = 0;end_time = time(NULL)+20;//初使化信号量的个数sem_init(&mutex,0,1);sem_init(&customers,0,0);ret = sem_init(&barbers,0,1);if(0!=ret)perror("sem init.");//初使化两个线程ret = pthread_create(&id1,NULL,(void *)barber,NULL);if(0!=ret)perror("create barbers.");ret = pthread_create(&id2,NULL,(void *)customer,NULL);if(0!=ret)perror("create customers.");//让顾客进程先阻塞pthread_join(id2,NULL);pthread_join(id1,NULL);exit(0);}/*理发师进程*/void barber(void *arg){while(time(NULL)<end_time||count>0){sem_wait(&customers);//p(customers)sem_wait(&mutex);//p(mutex)count--;printf("Barber:cut hair,count is:%d.\n",count);sem_post(&mutex);//v(mutex);sem_post(&barbers);//v(barbers) 通知已进来的,在等理发师的顾客进程sleep(3);}}/*customer*//*顾客进程*/void customer(void *arg){while(time(NULL)<end_time){sem_wait(&mutex);//p(mutex)if(count<n){count++;printf("Customer:add count,count is:%d.\n",count);sem_post(&mutex);//v(mutex)sem_post(&customers);//v(customers)sem_wait(&barbers);//p(barbers)}else{//v(mutex)注意如果个客户数已满了,则把互斥锁放掉,sem_post(&mutex);}sleep(1);}/*end of while(time()<end_time)*/}/*customer*/。

进程之间的同步互斥与通信理发师问题操作系统课程设计说明书(含源程程序)-推荐下载

进程之间的同步互斥与通信理发师问题操作系统课程设计说明书(含源程程序)-推荐下载

操作系统课程设计、管路敷设技术通过管线不仅可以解决吊顶层配置不规范高中资料试卷问题,而且可保障各类管路习题到位。

在管路敷设过程,要加强看护关于管路高中资料试卷连接管口处理高中资料试卷弯扁度固定盒位置保护层防腐跨接地线弯曲半径标高等,要求技术交底。

管线敷设技术包含线槽、管架等多项方式,为解决高中语文电气课件中管壁薄、接口不严等问题,合理利用管线敷设技术。

线缆敷设原则:在分线盒处,当不同电压回路交叉时,应采用金属隔板进行隔开处理;同一线槽内,强电回路须同时切断习题电源,线缆敷设完毕,要进行检查和检测处理。

、电气课件中调试对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料试卷相互作用与相互关系,根据生产工艺高中资料试卷要求,对电气设备进行空载与带负荷下高中资料试卷调控试验;对设备进行调整使其在正常工况下与过度工作下都可以正常工作;对于继电保护进行整核对定值,审核与校对图纸,编写复杂设备与装置高中资料试卷调试方案,编写重要设备高中资料试卷试验方案以及系统启动方案;对整套启动过程中高中资料试卷电气设备进行调试工作并且进行过关运行高中资料试卷技术指导。

对于调试过程中高中资料试卷技术问题,作为调试人员,需要在事前掌握图纸资料、设备制造厂家出具高中资料试卷试验报告与相关技术资料,并且了解现场设备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。

、电气设备调试高中资料试卷技术电力保护装置调试技术,电力保护高中资料试卷配置技术是指机组在进行继电保护高中资料试卷总体配置时,需要在最大限度内来确保机组高中资料试卷安全,并且尽可能地缩小故障高中资料试卷破坏范围,或者对某些异常高中资料试卷工况进行自动处理,尤其要避免错误高中资料试卷保护装置动作,并且拒绝动作,来避免不必要高中资料试卷突然停机。

因此,电力高中资料试卷保护装置调试技术,要求电力保护装置做到准确灵活。

理发师问题的实现说明书

理发师问题的实现说明书

*******************实践教学*******************兰州理工大学计算机与通信学院2012年秋季学期操作系统原理课程设计题目:理发师问题的实现专业班级:计算机科学与技术4班姓名:曹文波学号:10240406指导教师:王燕成绩:目录目录 (2)摘要 (3)关键字 (3)设计思想 (4)正文 (4)一、数据结构 (5)1、信号量 (5)2、全局变量 (5)3、函数 (5)二、程序模块 (6)1、理发师模块流程图 (6)2、顾客模块流程图 (7)3、主程序流程图 (8)4、PV操作伪代码 (9)三、运行结果 (10)1、代码编辑 (10)2、编译运行 (12)3、运行结果 (10)设计总结 (13)参考文献 (14)致谢 (15)附录:源代码 (16)摘要理发师问题是一个利用信号量进行PV操作的经典问题。

设计程序实现此问题,要使得理发师的活动与顾客的活动得到各自真实的模拟。

所执行的程序应体现:理发师在没有顾客的时候去睡觉,有顾客则工作;顾客在理发师工作时坐下等待,无座时离开,直至等到理发师自己理发。

关键字:理发师,顾客,PV操作。

设计思想打瞌睡的理发师问题是一种同步问题的抽象描述。

计算机系统中的每个进程都可以消费或生产某类资源,当系统中某一进程使用某一资源时,可以看作是消耗,且该进程称为消费者。

而当某个进程释放资源时,则它就相当一个生产者。

因此此题可看作是n个生产者和1个消费者问题。

顾客作为生产者,每到来一个就使计数器count增加1,以便让理发师理发(相当于消费)至最后一个顾客(相当于产品)。

并且,第1个到来的顾客应负责唤醒理发师;如果不是第1个到达的顾客,则在有空椅子的情况下坐下等待,否则离开理发店(该消息可由计数器count获得)。

所以可以通过一个有界缓冲区把理发师和顾客联系起来。

而其中的信号也具有两种功能:一是跟踪资源的理发师和顾客的计数器;二是协调资源的理发师和顾客之间的同步器。

计算机操作系统理发师问题-JAVA模板

计算机操作系统理发师问题-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 等待下一位顾客。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

设计思想的说明:
打瞌睡的理发师问题是一种同步问题的抽象描述。

计算机系统中的每个进程都可以消费或生产某类资源,当系统中某一进程使用某一资源时,可以看作是消耗,且该进程称为消费者。

而当某个进程释放资源时,则它就相当一个生产者。

因此此题可看作是n个生产者和1个消费者问题。

顾客作为生产者,每到来一个就使计数器count增加1,以便让理发师理发(相当于消费)至最后一个顾客(相当于产品)。

并且,第1个到来的顾客应负责唤醒理发师;如果不是第1个到达的顾客,则在有空椅子的情况下坐下等待,否则离开理发店(该消息可由计数器count获得),所以可以通过一个有界缓冲区把理发师和顾客联系起来通过对信号进行P、V操作来实现有关问题和相关描述。

源程序文件:
#include<windows.h>
#include<stdio.h>
#include<iostream>
#include<process.h>
#include<conio.h>
#include<ctime>
using namespace std;
#define CHAIRS 3 //椅子的个数
#define BARBERS 1 //理发师的个数
#define CUSTOMESTOCOME 7 //将要来的顾客的数目
typedef HANDLE semaphore;
static int count=0; //记录理发店顾客的总数,初始化为0
int leaved=0; //记录理发店顾客的总数,初始化为0
int waiting=0;
time_t endtime; //关闭营业的时间
//coustomers初始化为0,最大顾客数为3
semaphore customers=CreateSemaphore(NULL,0,CHAIRS,TEXT("customers")); //barbers的数量初始化为1,假设一共有1个barber
semaphore
barbers=CreateSemaphore(NULL,BARBERS,BARBERS,TEXT("barbers"));
//建立互斥变量,用于保护共享资源
HANDLE mutex=CreateMutex(NULL,FALSE,TEXT("mutex"));
DWORD WINAPI barber(LPVOID lparameter);
DWORD WINAPI customer(LPVOID lparameter);
//理发师理发
void cutHair();
//顾客坐到椅子上等待
void getChair();
//等待顾客到来
void wait();
//顾客离开
void customerLeave();
//顾客进入
void customerEnter();
void up(HANDLE hHandle){
//对指定信号量增加指定的值
ReleaseSemaphore(hHandle,1,NULL);
//恢复线程
ResumeThread(hHandle);
}
void upMutex(HANDLE hMutex){
//释放线程拥有的互斥体
ReleaseMutex(hMutex);
}
void down(HANDLE hHandle){ //DOWN operation
//线程挂起,等待信号
WaitForSingleObject(hHandle,INFINITE);
}
int main(){
//结束时间
endtime=time(0)+20000;
//创建理发师线程
HANDLE barberThread=CreateThread(NULL,0,barber,NULL,0,NULL);
HANDLE customerThread;
//产生10个客户进程,每两个进程之间间隔一个随见时间1000~1050 while(count<CUSTOMESTOCOME)
{
//创建客户进程
customerThread=CreateThread(NULL,0,customer,NULL,0,NULL);
srand(unsigned(time(0)));
int time=rand()%1000+50;
Sleep(time);
}
//释放资源
CloseHandle(barberThread);
CloseHandle(customerThread);
CloseHandle(barbers);
CloseHandle(customers);
CloseHandle(mutex);
cout<<"离开的顾客总数为:"<<leaved<<endl;
return 0;
}
DWORD WINAPI barber(LPVOID lparameter) {
while(time(0)<endtime)
{
//没有客户,则进入睡眠状态
down(customers);
//临界区操作
down(mutex);
waiting=waiting-1;
upMutex(mutex);
//开始理发
cutHair();
//理发结束,理发师信号量加1
up(barbers);
}
return 0;
}
DWORD WINAPI customer(LPVOID lparameter){ //客户到来
customerEnter();
//临界区操作
down(mutex);
cout<<"等̨¨待äy的Ì?顾?客¨ª数ºy: "<<waiting<<endl;
cout<<"空?椅°?子Á¨®数ºy: "<<CHAIRS-waiting<<endl;
if(waiting<CHAIRS)
{ //如果有空椅子,客户等待,否则离开
if(waiting!=0)
{
//等待顾客到来
wait();
}
waiting=waiting+1;
//客户信号量加1
up(customers);
upMutex(mutex);//离开临界区
//理发师进程等待唤醒
down(barbers);
//顾客坐下来等待
getChair();
}
else
{
//释放互斥锁
upMutex(mutex);
//顾客离开
customerLeave();
}
return 0;
}
void cutHair(){
static int served=0;
served++;
cout<<理发师帮第"<<served<<"位被服务的顾客理发"<<endl;
Sleep(1000);
cout<<"第"<<served<<"位被服务的顾客理完发"<<endl;
}
void getChair(){
Sleep(1050);
}
void customerEnter(){
count++;
SYSTEMTIME sys;
GetLocalTime( &sys );
cout<<endl<<"第"<<count<<"位顾客进来"<<endl;
}
void wait(){
cout<<"有空位,第"<<count<<"位顾客就坐"<<endl;
}
void customerLeave(){
cout<<"没有空椅子,第"<<count<<"位顾客离开 ."<<endl;
leaved++;
}
输出截图:
PS:由于我对c++中处理进程、信号的函数不熟,所以有许多参考了网上的代码。

我尽量去读懂代码,并自己写上注释。

相关文档
最新文档