8计算机操作系统理发师问题 JAVA

合集下载

操作系统经典算法题汇总-分章节综述-56页精选文档

操作系统经典算法题汇总-分章节综述-56页精选文档

Semaphore:=0,0,1
int waiting=0;
Process customer
{
P(mutex);
If (waiting<CHAIRS) then
Process barber
{
{
waiting=waiting+1;
While(1)
V(customers); //向理发师发信号 {
V(mutex);
用信号灯及P、V操作来描述右图 1、说明进程的同步关系: 2、设置信号灯,说明含义、初值。 3、写出程序描述( 用P、V操作描述 P1、P2、P3)。 主函数如下:
main() {int s13=0,s23=0;
cobegin p1; p2; p3; coend}
两个并发执行的进程A和B的程序如下: 进程A Repeat N=N+5; Until false;
P(customers );//接收顾客信号
P(barbers); //接收理发师信号
P(mutex);
Get_haircut();
waiting=waiting-1;
}
V(barbers);//向顾客发信号
else
V(mutex);
{
Cut hair();
V(mutex);
}
}
}
}
类似问题:
吸烟者问题(1971,Patil):在一个房间内有三位吸烟者、一位 材料供应者。其中: a) 吸烟者: 需要拥有三种材料“烟草(Tobacco)、卷烟纸 (Cigarette-paper)、火柴(Match)”才能吸烟: 第一位吸烟者有丰富的烟草; 第二位吸烟者有丰富的卷烟纸; 第三位吸烟者有丰富的火柴; ; 当吸烟者拿到所需要的材料后,唤醒供应者进行下一次投放; b) 材料供应者:不吸烟,且有丰富的Tobacco、Cigarette-paper、 Match三种材料; 每次随机地将三种材料中的两种投放到桌子上; 允许拥有另一种材料的吸烟者吸烟。 【要求】编写算法用信号量和P、V操作实现它们之间的同步关 系。

Java面试常见问题及答案

Java面试常见问题及答案

Java面试常见问题及答案Java是一种广泛使用的编程语言,具有高度的可移植性和可扩展性。

在软件开发和编程领域,Java的应用广泛,因此许多公司在招聘时会对Java相关知识进行面试。

本文将介绍一些常见的Java面试问题,并提供相应的答案。

1. 什么是Java?Java是一种面向对象的编程语言,由Sun Microsystems公司于1995年发布。

它具有“Write once, run anywhere”(一次编写,到处运行)的特性,这意味着一段Java代码可以在不同的计算机上运行。

2. Java有哪些主要特性?Java具有以下主要特性:•面向对象:Java支持面向对象的编程范式,包括类、继承、多态等。

•平台无关性:Java可以在不同的平台上运行,只需编译一次。

•垃圾回收机制:Java具有自动内存管理的特性,开发人员不需要手动释放内存。

•异常处理:Java提供了强大的异常处理机制,帮助开发人员处理错误情况。

•大型程序支持:Java适用于编写大型程序,提供了模块化、灵活的架构。

•多线程支持:Java支持多线程编程,允许程序同时执行多个任务。

3. 解释一下Java的访问修饰符。

Java有四种访问修饰符,分别是:•public:在任何地方都可以访问。

•protected:包内可见,以及继承关系的子类可见。

•默认(或称为包访问):只在同一个包内可见。

•private:只在当前类内可见。

访问修饰符用于控制类、变量、方法等的访问级别。

4. 什么是Java的多态性?Java的多态性是指同一种实体可以具有不同的形式。

在Java中,多态性通过实现继承和方法重写来实现。

多态性提供了灵活性和代码复用。

5. 什么是Java的封装?Java的封装是指将数据隐藏在类的内部,并通过公共方法提供访问数据的接口。

封装提供了数据访问的控制和保护,使得外部代码不能直接访问类的内部实现细节。

6. Java中的抽象类和接口有什么区别?抽象类和接口是Java中两种实现抽象的方式。

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

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

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

java面试题大全带答案

java面试题大全带答案

java面试题大全带答案一、基础知识1. 什么是Java?Java是一种高级编程语言,由Sun Microsystems于1995年推出。

它是一种面向对象的语言,可以在不同的平台上运行。

2. 什么是JDK和JRE?JDK(Java Development Kit)是Java开发工具包,包含了编译器和其他开发工具。

JRE(Java Runtime Environment)是Java运行时环境,包含了JVM和Java类库。

3. 什么是JVM?JVM(Java Virtual Machine)是Java虚拟机,它是Java程序运行的环境。

JVM负责将Java字节码翻译成机器码,并执行程序。

4. 说说Java的特点?- 简单易学:Java采用了类似C++的语法,但去掉了一些复杂的特性,使得代码更加简洁易懂。

- 面向对象:Java支持封装、继承、多态等面向对象的特性,使得代码更加模块化、可重用。

- 跨平台性:由于Java程序是在JVM上运行的,可以在不同的操作系统上运行,提高了程序的可移植性。

- 安全性:Java有内置的安全机制,如沙箱安全机制和字节码校验,可以防止恶意代码的运行。

- 垃圾回收:Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的内存,减轻了开发人员的负担。

二、面向对象1. Java中的类和对象有什么区别?类是对象的模板,描述了对象具有的属性和方法。

而对象则是类的一个实例,它具有类定义的属性和方法。

2. 什么是继承?继承是面向对象编程的一种特性,它允许一个类继承另一个类的属性和方法。

子类通过继承可以重用父类的代码,并且可以在此基础上添加新的功能。

3. 什么是多态性?多态性是指对象在不同的情况下表现出不同的行为。

在Java中,通过继承和方法重写可以实现多态性。

4. 什么是封装?封装是一种将数据和代码包装在一起的机制,通过访问修饰符来限制对数据和代码的访问。

它可以隐藏实现细节,提高代码的安全性和可维护性。

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

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

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

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

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

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

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

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

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

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

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

操作系统--理发师问题

操作系统--理发师问题

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

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

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

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

二:问题分析1. 线程模型与同步机制考虑到理发师问题涉及到多个顾客同时访问共享资源(理发椅)的情况,可以使用线程模型来解决该问题。

其中,每个顾客作为一个线程,理发椅作为共享资源。

在本问题中,通过使用信号量进行同步机制的设计,保证每个顾客能够按顺序得到理发师的服务。

2. 线程同步的三个要素在解决理发师问题时,需要考虑线程同步的三个要素:互斥、有序性和死锁避免。

互斥可以通过互斥量来实现,保证只有一个线程同时访问共享资源;有序性可以通过信号量来控制,保证顾客能够按照先来后到的顺序进行理发;死锁避免可以通过设置超时等待时间来解决。

三:算法设计1. 初始条件设置首先,需要确定理发师数量、理发椅数量和顾客数量的初始设置。

可以通过命令行参数或配置文件进行设置,以适应不同场景的需求。

2. 创建线程根据顾客数量创建对应数量的线程,并将每个顾客线程的任务设置为等待理发的状态。

同时,创建理发师线程,并将理发师的任务设置为等待顾客的状态。

3. 理发师任务理发师从等待队列中取出一个顾客进行理发,理发时间可以通过随机数。

当该顾客理发结束后,理发师继续从等待队列中取出下一个顾客进行理发。

如果没有顾客在等待,则理发师进入休息状态。

4. 顾客任务顾客到达理发店后,首先判断是否有空闲的理发椅。

如果有空闲的椅子,则顾客坐下并进行理发;否则,顾客需要等待其他顾客离开理发椅后才能进行理发。

5. 同步机制使用互斥量保证理发师和顾客对共享资源的互斥访问。

操作系统第二章习题

操作系统第二章习题

1.正在等待他人释放临界资源的进程处于___阻塞______状态;已分配到CPU外的所有资源的进程处_______状态;已获得CPU的进程处于____执行___状态;正在执行的进程由于时间片用完时转为____就绪__状态;因发生某种事件而暂时不能继续执行时转为___阻塞______状态;应终端用户请求而暂停执行时转为______状态。

2.不会发生的状态转换有_________,为什么?就绪-执行;执行-就绪;就绪—阻塞;阻塞-就绪;阻塞—执行;执行-阻塞;3.对于记录型信号量,在执行一次wait操作时,信号量的count值应当_______;当count 值为_______时,应唤醒阻塞队列中的进程。

在记录型信号量机制中,S. count>0时的值表示_______;每次用wait操作意味着_______,因此应将S. count_______;当S. count_______时,进程应阻塞;每次signal操作意味着_______,因此应将S. count_______;当S. count<=0时,表示_______,此时应_______。

4.在每个进程中访问_______的那段代码称为临界区;为实现对它的共享,应保证进程_______地进入自己的临界区;为此,在每个进程的临界区前应设置_______;临界区后应设置_______。

5.在利用信号量实现进程互斥时,应将_______置于_______和_______之间。

6.用信号量S实现对系统中4打印机的互斥使用,S.value的初值应设置为—1—。

7.若S.value当前值为-1,则表示S.L队列中有____1___个等待进程。

8.设有10个进程共享一个互斥段,如果最多允许一个进程进入互斥段,则所采用的互斥信号量应设置为___1____,而该信号量的取值范围为_1~(n-1)______;9.如果最多允许3个进程同时进入互斥段,则所采用的互斥信号量初值应设置为—3—。

操作系统--理发师问题

操作系统--理发师问题

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

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

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

因此此题可看作是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++中处理进程、信号的函数不熟,所以有许多参考了网上的代码。

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

顾客 11 来了 没有可供顾客等待的椅子了,顾客 11 离开了 顾客 3 离开了 顾客 4 正在理发 顾客 12 来了 顾客 12 正在等待理发师 顾客 13 来了 没有可供顾客等待的椅子了,顾客 13 离开了 顾客 14 来了 没有可供顾客等待的椅子了,顾客 14 离开了 顾客 15 来了 没有可供顾客等待的椅子了,顾客 15 离开了 顾客 4 离开了 顾客 5 正在理发 顾客 16 来了 顾客 16 正在等待理发师 顾客 17 来了 没有可供顾客等待的椅子了,顾客 17 离开了 顾客 18 来了 没有可供顾客等待的椅子了,顾客 18 离开了 顾客 19 来了 没有可供顾客等待的椅子了,顾客 19 离开了 顾客 5 离开了 顾客 9 正在理发 顾客 20 来了 顾客 20 正在等待理发师 顾客 9 离开了 顾客 12 正在理发 顾客 12 离开了 顾客 16 正在理发 顾客 16 离开了 现在理发店只有顾客 20,理发师是清醒的 顾客 20 正在理发 顾客 20 离开了 没有顾客了,理发师开始睡觉
busy = 0; notify();// 唤醒 } if (cnt == 0) { System.out.println("没有顾客了,理发师开始睡觉"); } } } }
class Barber implements Runnable { BarberShop ob; int index;
public Barber(BarberShop ob, int i) { this.ob = ob; index = i;
}
public synchronized boolean isBusy() { if (busy == 1) { return true; } return false;
}
public void Gobar(int index) throws InterruptedException {
System.out.println("顾客 " + index + " 来了"); cnt++; // 判断是否满 if (isFull()) {
三 程序流程图
顾客模块:
理发师模块:
四 源程序的实现
因为本人对 C++的多线程库函数不了解,于是使用 JAVA 实现理发师问题,假设有 5 张可供顾客理发的椅子:
package com.swxy;
import java.util.concurrent.Semaphore;//导入 Semaphore,用于控制进程同步互斥的量。
while (busy == 1) { // 若有人在理发,则等待 wait();
} }
if (cnt == 1) { System.out.println("现在理发店只有顾客" + index + ",理发师是清醒的");
} busy = 1; System.out.println("顾客" + index + " 正在理发"); Thread.sleep(1000); System.out.println("顾客" + index + " 离开了"); cnt--; mutex.release();// 信号量加操作 synchronized (this) {
二 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; // 等候顾客数加 1 V(customers); //必要的话唤醒理发师 V(mutex); //开放临界区 P(barbers); //无理发师, 顾客坐着养神 get-haircut( ); //一个顾客坐下等理/ } else V(mutex); //人满了,离开 }
运行截图:
六 实验总结
本次课程设计完成了多进程同步方法理发师问题全部过程,结果满足设计要求,验证 无误。设计过程中也遇到不少困难,尤其是关于多线程程序的设计实现。让我明白了自 己的不足之处,在 C++语言这一块自己存在着短板。
System.out.println("没有可供顾客等待的椅子了," + "顾客 " + index + " 离 开了");
cnt--; } else {
if (busy == 1) { System.out.println("顾客" + index + " 正在等待理发师");
} mutex.acquire();// 信号量减操作,防止其他进程再进入 synchronizedHale Waihona Puke (this) {课程实验报告
题目 姓名 学号 年级专业 指导教师
计算机操作系统理发师问题 潘*
2013 *** 2013 级* 彭*华
201*年 1*月 30 日
一 题目
假设有个理发店,只有一个理发师和 N 张可供顾客等待理发的椅子,如果没有顾客, 则理发师睡觉,如果有一个顾客进入理发店发现理发师在睡觉,则把他叫醒,试用信号 量设计一个协调理发师和顾客的程序。
public class BarberShop { static int cnt = 0;// 顾客 static int MAX = 5;// 假设 5 张可供顾客理发的椅子 static int busy = 0; static Semaphore mutex = new Semaphore(1);// 临界区互斥访问信号量(二进制信号量),
}
public void run() { // TODO Auto-generated method stub try { ob.Gobar(index); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }
相当于互斥锁。
public static void main(String args[]) throws InterruptedException { BarberShop bar = new BarberShop(); for (int i = 1; i <= 20; i++) {// 假设一共有 20 个顾客来访 new Thread(new Barber(bar, i)).start(); Thread.sleep((int) (400 - Math.random() * 300));// 使得当前线程休眠 随
}
}
五 运行结果
顾客 1 来了 现在理发店只有顾客 1,理发师是清醒的 顾客 1 正在理发 顾客 2 来了 顾客 2 正在等待理发师 顾客 3 来了 顾客 3 正在等待理发师 顾客 4 来了 顾客 4 正在等待理发师 顾客 1 离开了 顾客 2 正在理发 顾客 5 来了 顾客 5 正在等待理发师 顾客 6 来了 没有可供顾客等待的椅子了,顾客 6 离开了 顾客 7 来了 没有可供顾客等待的椅子了,顾客 7 离开了 顾客 8 来了 没有可供顾客等待的椅子了,顾客 8 离开了 顾客 2 离开了 顾客 3 正在理发 顾客 9 来了 顾客 9 正在等待理发师 顾客 10 来了 没有可供顾客等待的椅子了,顾客 10 离开了
机 0-0.1s }
}
public synchronized boolean isFull() { if (cnt == MAX) { return true; } return false;
}
public synchronized boolean isEmpty() { if (cnt == 0) { return true; } return false;
相关文档
最新文档