操作系统-理发师问题的java模拟
- 格式:doc
- 大小:23.00 KB
- 文档页数:4
练习1第一章1.什么是操作系统2.什么是多道程序设计技术?多道程序设计技术的特点是什么?3.简述并发与并行的区别4.设内存中有三道程序A、B、C。
他们按的优先顺序执行。
他们的计算和I/O操作的时间如图表所示(单位:ms)假设三道程序使用相同设备进行I/O操作,即程序以串行方式使用设备,试画出单道运行和多道运行的时间关系图(调度程序的执行时间忽略不计)。
在两种情况下,完成这三道程序各要花多少时间?第二章第一节1.进程与线程的主要区别是什么?2.什么是PCB,它的作用?3.进程与程序的主要区别?4.已知一个求值公式(A2+3B)/(B+5A)。
若A、B已赋值,试画出该公式求值过程的前趋图。
5.某系统的进程状态转换图如图,请说明1)引起各种状态转换的典型事件有哪些?2)当我们观察系统中某些进程时,能够看到某一进程产生的一次状态转换能引起另一进程作一次状态转换,。
在什么情况下,当一个进程发生转换3时能立即引起另一进程发生转换1。
3)试说明是否会发生下述因果转换:2→1 3→2 4→1第二节1.下图为四个进程合作完成某一任务的前趋图,说明这四个进程间的同步关系,并用P、V操作描述它。
2.设有n各进程共享一个程序段,对如下两种情况:1)如果每次只允许一个进程进入该程序段2)如果每次最多允许m(m<n)个进程同时进入该程序段试问:所采用的信号量初值是否相同?信号量值的变化范围如何?3.有一单向行使的的公路桥,每次只允许一辆汽车通过。
当汽车到达桥头时,若桥上无车,便可上桥;否则需等待,直到桥上的汽车下桥为止。
若每一辆汽车为一个进程,请用P、V操作保证汽车按要求过桥。
第三节1.假定有一个信箱可以存放N封信,当信箱不满时,发信这可把信件送入信箱,当信箱性信时,收信者可从信箱中取信。
用指针R、K分别表示可存信和取信的位置,请用管程来管理这个信箱,是发信者和收信者能正确的工作。
2.一个理发店由一个有n张椅子的等候室和一个放有一张理发椅的理发室组成。
Java模拟试题(一)一、单项选择题(每题2分,共20分)2.paint()方法使用哪种类型的参数?A Graphics 硬记g.drawString(“Hello World”) G gB Graphics2DC StringD Color3.指出正确的表达式A byte=128; 整数型默认为int btyte的范围-2的8次方到2的8次方-1 超过范围B Boolean=null; 没有变量名,Boolean b=null;C long l=0xfffL;D double=0.9239d; 没有变量名4.指出下列程序运行的结果public class Example{String str=new String("good");char[]ch={'a','b','c'};public static void main(String args[]){Example ex=new Example();ex.change(ex.str,ex.ch);System.out.print(ex.str+" and ");Sytem.out.print(ex.ch);}public void change(String str,char ch[]){str="test ok";ch[0]='g'; 下标为0的位置变为g,}}String字符串不能被改变,数组可以改变A good and abcB good and gbcC test ok and abcD test ok and gbc5.运行下列程序, 会产生什么结果public class X extends Thread implements Runable{public void run(){System.out.println("this is run()");}public static void main(String args[]){Thread t=new Thread(new X());t.start();}}A 第一行会产生编译错误怀疑人生B 第六行会产生编译错误C 第六行会产生运行错误D 程序会运行和启动7.容器被重新设置大小后,哪种布局管理器的容器中的组件大小容器大小的变化而改变?A CardLayoutB FlowLayout 硬记C BorderLayoutD GridLayout8.给出下面代码:public class Person{static int arr[] = new int[10];public static void main(String a[]){System.out.println(arr[1]);}}那个语句是正确的?A 编译时将产生错误;B 编译时正确,运行时将产生错误;C 输出零;写在方法外面的变量都会初始化,默认值为int 是0D 输出空。
操作系统原理复习题一一、选择题1、操作系统是对进行C管理的软件。
A、计算机软件B、计算机硬件C、计算机资源D、应用程序2、配置了操作系统的计算机是一台比原来的物理计算机功能更强的计算机,这样的一台计算机只是一台逻辑上的计算机,称为C计算机。
A、并行B、真实C、虚拟D、共享3、操作系统提供给程序员的接口是B。
A、进程B、系统调用C、库函数D、B和C4、下面关于操作系统的叙述中正确的是A。
A、批处理作业必须具有作业控制信息。
B、分时系统不一定都具有人机交互功能。
C、从响应时间的角度看,实时系统与分时系统差不多。
D、由于采用了分时技术,用户可以独占计算机的资源。
5、在操作系统中,P、V操作是一种D。
A、机器指令B、系统调用命令C、作业控制命令D、低级进程通讯原语6、若信号量S的初值为2,当前值为-1,则表示有B等待进程。
A、0个B、1个C、2个D、3个7、下列进程状态变化中,C变化是不可能发生的。
A、运行→就绪B、运行→等待C、等待→运行D、等待→就绪8、当B时,进程从执行状态变为就绪状态。
A、进程被调度程序选种B、时间片到C、等待某一事件D、等待的事件发生9、用P、V操作管理临界区时,信号量的初值定义为C。
A、-1B、0C、1D、任意值10、临界区是C。
A、一个缓冲区B、一段共享数据区C、一段程序D、一个互斥资源11、操作系统通过B对进程进行管理。
A、JCBB、PCBC、DCTD、CHCT12、下述哪个选项不是管程的组成部分A。
A、局部于管程的数据结构B、对管程内数据结构进行操作的一组过程C、管程外过程调用管程内数据结构的说明D、对局部于管程的数据结构设置初始的语句13、下面所述步骤中,A不是创建进程所必须的。
A、由调度程序为进程分配CPUB、建立一个进程控制块C、为进程分配内存D、将进程控制块链入就绪队列14、多道程序环境下,操作系统分配资源以C为基本单位。
A、程序B、指令C、进程D、作业15、对于两个并发进程,设互斥信号量为mutex,若mutex=0,则B。
信号量应用问题:1.写出程序描述下列前趋关系。
S1->S2, S1->S3, S2->S4, S2->S5 , S3->S6, S4->S7, S5->S7, S6->S7Var s1,s2, s3,s4:semaphore:=0, 0, 0, 0;BeginParbeginP1: begin….;V(s1);V(s1);End;P2: beginP(s1);…;V(s2);V(s2);End;P3: beginP(s1)…V(s3)End;P4: beginP(s2);…V(s4);P5: beginP(s2);..;V(s4);End;P6: beginP(s3)..V(s4)End;P7:beginP(s4);P(s4);P(s4);…End;Parendend2. 请用信号量实现4×100(4人,每人100米)接力赛的同步过程。
提示:前趋图同步问题,可设4个进程,三个信号量,进程1只设V操作,进程4只设P操作,其余进程先做P 操作再做V操作。
Var s1,s2,s3:semaphore:=0, 0, 0; BeginParbeginAthlete1: beginRun 100m;V(s1);End;Athlete2: beginP(s1)Run 100m;V(s2);End;Athlete3: beginP(s2) ;Run 100m;V(s3);End;Athlete4: beginP(s3);Run 100m;End;Parendend3.设公共汽车上,司机和售票员的活动分别是:司机:售票员:启动车辆上乘客正常行车关车门到站停车售票开车门下乘客在汽车不断地到站、停车、行驶过程中,这两个活动有什么同步关系?请用信号量机制实现他们的同步。
/-假定初始状态为停车状态,引入信号量Stop和Run:BEGINsemaphore Stop,Run;Stop:=Run:=0;CoBeginDriver: BEGINRepea tWa it(Run);启动车辆;正常行驶;到站停车;Si gnal(Stop);Until False;END;Conductor:BEGINRepea t上乘客;关车门;Si gnal(Run);售票;Wa it(Stop);开车门;下乘客;Until False;END;CoEnd;END;生产者消费者问题:1.桌上有一个可以容纳两个水果的盘子,每次只能放或取一个水果。
P就是请求资源,V就是释放资源。
问题1 一个司机与售票员的例子在公共汽车上,为保证乘客的安全,司机和售票员应协调工作:停车后才能开门,关车门后才能行车。
用PV操作来实现他们之间的协调。
S1:是否允许司机启动汽车的变量S2:是否允许售票员开门的变量driver()//司机进程{while (1)//不停地循环{P(S1);//请求启动汽车启动汽车;正常行车;到站停车;V(S2); //释放开门变量,相当于通知售票员可以开门}}busman()//售票员进程{while(1){关车门;V(S1);//释放开车变量,相当于通知司机可以开车售票P(S2);//请求开门开车门;上下乘客;}}注意:busman() driver() 两个不停循环的函数问题2 图书馆有100个座位,每位进入图书馆的读者要在登记表上登记,退出时要在登记表上注销。
要几个程序?有多少个进程?(答:一个程序;为每个读者设一个进程)(1)当图书馆中没有座位时,后到的读者在图书馆为等待(阻塞)(2)当图书馆中没有座位时,后到的读者不等待,立即回家。
解(1 )设信号量:S=100; MUTEX=1P(S)P(MUTEX)登记V(MUTEX)阅读P(MUTEX)注销V(MUTEX)V(S)问题3 有一座东西方向的独木桥;用P,V操作实现:(1)每次只允许一个人过桥;(2)当独木桥上有行人时,同方向的行人可以同时过桥,相反方向的人必须等待。
(3)当独木桥上有自东向西的行人时,同方向的行人可以同时过桥,从西向东的方向,只允许一个人单独过桥。
(此问题和读者与写者问题相同,东向西的为读者,西向东的为写者)。
(1)解设信号量MUTEX=1P (MUTEX)过桥V (MUTEX)(2)解设信号量:MUTEX=1 (东西方互斥)MD=1 (东向西使用计数变量互斥)MX=1 (西向东使用计数变量互斥)设整型变量:CD=0 (东向西的已上桥人数)CX=0 (西向东的已上桥人数)从东向西:P (MD)IF (CD=0){P (MUTEX) }CD=CD+1V (MD)过桥P (MD)CD=CD-1IF (CD=0){V (MUTEX) }V (MD)从西向东:P (MX)IF (CX=0){P (MUTEX) }CX=CX+1V (MX)过桥P (MX)CX=CX-1IF (CX=0){V (MUTEX) }V (MX)(3) 解:从东向西的,和(2)相同;从西向东的和(1)相同。
计算机考试java模拟试题计算机考试java模拟试题一知半解的人,多不谦虚;见多识广有本领的人,一定谦虚。
以下是店铺为大家搜索整理的计算机考试java模拟试题,希望能给大家带来帮助!一、选择题1、下面哪些是java语言中的关键字?A sizeofB abstractC NULLD Native答:B2、下面语句哪个是正确的?A char='abc';B long l=oxfff;C float f=0.23;D double=0.7E-3;答:D3、以下程序测试String 类的各种构造方法,试选出其运行效果。
class STR{public static void main(String args[]){String s1=new String();String s2=new String("String 2");char chars[]={'a',' ','s','t','r','i','n','g'};String s3=new String(chars);String s4=new String(chars,2,6);byte bytes[]={0,1,2,3,4,5,6,7,8,9};StringBuffer sb=new StringBuffer(s3);String s5=new String(sb);System.out.println("The String No.1 is "+s1); System.out.println("The String No.2 is "+s2); System.out.println("The String No.3 is "+s3); System.out.println("The String No.4 is "+s4); System.out.println("The String No.5 is "+s5); }}A The String No.1 isThe String No.2 is String 2The String No.3 is a stringThe String No.4 is stringThe String No.5 is a stringB The String No.1 isThe String No.2 is String 2The String No.3 is a stringThe String No.4 is tringThe String No.5 is a stringC The String No.1 isThe String No.2 is String 2The String No.3 is a stringThe String No.4 is strinThe String No.5 is a stringD 以上都不对答:A4、下面语句段的输出结果是什么?int i = 9;switch (i) {default:System.out.println("default");case 0:System.out.println("zero");break;case 1:System.out.println("one");case 2:System.out.println("two"); }A defaultB default, zeroC error default clause not definedD no output displayed答:B二、不定项选择题(在每小题的五个备选答案中选出正确答案,并将正确答案的序号填入题干后面的括号内,错选多选,漏选均不得分。
java考前模拟练习题2017年java考前模拟练习题故天将降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,增益其所不能。
以下是店铺为大家搜索整理2017年java考前模拟练习题,希望能给大家带来帮助!1). 某二叉树结点的前序序列为E、A、C、B、D、G、F,对称序列为A、B、C、D、E、F、G。
该二叉树结点的后序序列为A.B、C、F、G、EB.C、F、A、G、EC.E、G、F、A、BD.E、G、A、C、F、B正确答案:A2). 在Java中,一个类可同时定义许多同名的方法,这些方法的形式参数的个数、类型或顺序各不相同,传回的值也可以不相同,这种面向对象程序特性称为A.隐藏B.覆盖C.重载D.Java不支持此特性正确答案:C3). 若要把变量声名为多个线程共用的变量,应使用如下哪种修饰符?A.protectedB.provateC.transientD.volatile正确答案:D4). 下列程序段的输出结果是public classoperatorsandExpressions{void stringPlus(){int a=3,b=4,c=5;System.out.println("abc"+3);}}A.15B.abc3C.256D.63正确答案:B5). 下述关于数据库系统的.叙述中正确的是A.数据库数据可以为经DBA认可的各用户所共享B.数据库系统避免了一切冗余C.数据库系统的存储模式如有改变,则概念模式应予调整,否则用户会在执行中出错D.数据库系统比文件系统能管理更多的数据正确答案:A6). 下列关于栈的叙述中正确的是A.在栈中只能插入数据B.在栈中只能删除数据C.栈是先进先出的线性表D.栈是先进后出的线性表正确答案:D7). 编译运行以下程序后,关于输出结果的说法正确的是public class Conditional{public static void main(String args[]){int x=4;System.out.println("value is "+((x>4)?99.9:9));}}A.输出结果为value is 99.99B.输出结果为value is 9C.输出结果为value is 9.0D.编译错误正确答案:C8). 线性表若采用链表存储结构时,要求内存中可用存储单元的地址____。
3.3 经典的进程同步问题3.3.1 生产者-消费者问题3.3.2 读者-写者问题3.3.3 哲学家进餐问题3.3.4 理发师问题1生产者-消费者问题生产者--消费者问题是操作系统中并发进程内在关系的一种抽象生产者进程可以是计算进程、发送进程;而消费者进程可以是打印进程、接收进程等等2生产者消费者问题①一个生产者、一个消费者共享一个缓冲区②一个生产者、一个消费者共享多个缓冲区③多个生产者、多个消费者共享多个缓冲区④多个生产者、多个消费者共享一个缓冲区⑤多个生产者、一个消费者共享多个缓冲区⑥一个生产者、多个消费者共享多个缓冲区3一个生产者、一个消费者共享一个缓冲区的解(1)var B : integer;empty : semaphore;full : semaphore;empty : = 1;full := 0;4一个生产者、一个消费者共享一个缓冲区的解(2)process consumerBeginL2:P(full);Product:= B;V(empty);Consume a product;Goto L2;end;Process producerbeginL1:Produce product;P(empty);put B product in;V(full);Goto L1;end;5多个生产者、多个消费者共享多个缓冲区的解(1)n个生产者和m个消费者,连接在一个有k个单位缓冲区的有界缓冲池上只要缓冲区未满,Pi生产的产品就可投入缓冲区;只要缓冲区不空,消费者进程Cj就可从缓冲区取走并消耗产品Pi和Cj是并发进程(i=1 n,j=1 m),Pi作为生产者生产产品,Cj作为消费者消费产品6多个生产者、多个消费者共享多个缓冲区的解(2)var B:array[0..k-1] of item;empty:semaphore:=k;full:semaphore:=0;mutex:semaphore:=1;in,out:integer:= 0;cobegin7多个生产者、多个消费者共享多个缓冲区的解(3)process producer_i process consumer_jBegin beginL1:produce a product; L2:P(full);P(empty); P(mutex);P(mutex); Product:= B[out];B[in]:= product; out:=(out+1) mod k;in:=(in+1) mod k; V(mutex);V(mutex); V(empty);V(full); Consume a product;Goto L1; Goto L2;end; end;coend9读者-写者问题有两组并发进程:读者和写者,共享一个文件F,要求:允许多个读者可同时执行读操作任一写者在完成写操作之前不允许其它读者或写者工作当有读者执行读操作时,不允许其它写者去修改(写)文件10解决读者-写者问题的思路多个读者可同时读写者与写者之间要互斥写者与读者之间要互斥即:11解决读者-写者问题的步骤(1)第一步:Begins:semaphore;S:=1;Rc:integer;Rc:=0;cobegin12解决读者-写者问题的步骤(2) Process Writerjbeginp(s);write file F;V(s) ;endProcess Readeribeginrc:=rc+1if rc=1 then p(s)read file F;rc:=rc-1;if rc=0 then v(s)endcoendend13解决读者-写者问题的步骤(3)存在问题的原因:忽略了rc也是个供多个读者共享的共享资源14解决读者-写者问题的步骤(4)解决方法:beginS,Sr:semaphore;rc:integer;S:=1; Sr:=1;rc:=0;cobegin15解决读者-写者问题的步骤(5) Process Writerjbeginp(s);write file F;V(s)end;coend;endProcess Readeribeginp(Sr);rc:=rc+1;if rc=1 then p(s);v(Sr);read file F;p(Sr);rc:=rc-1;if rc=0 then v(s);v(Sr);end16解决读者-写者问题的解释信号量Sr仅用于管理计数器rc的互斥使用17哲学家吃通心面问题(1)有五个哲学家围坐在一圆桌旁,桌中央有一盘通心面,每人面前有一只空盘子,每两人之间放一支筷子。
理发师问题的java语言模拟
对于操作系统经典的理发师问题,给出一种基于java代码的解决方案。
一、问题分析:
我们首先需要考虑以下的情况:
1.没有顾客时:理发师休息
2.顾客到来但理发师在睡觉时:唤醒理发师
3.顾客到来理发师在理发:有空椅子,坐上去等待;没有空椅子,离开,过一会儿再回来
二、代码情况说明:
设计类 Cust 实现接口Runnable,用来表示编号为index的顾客的执行情况。
类Barbershop中包含主函数,使用方法isEmpty();isBusy();isFull();分别用来检验是否有顾客,
理发师的状态,是否有空椅子;使用全局变量sleep来表示理发师是否在睡觉。主函数中使
用for循环new Thread(new Cust(b, i)).start();开始一个进程的执行申请,在haircut()方法之中
进行以上三种情况的判断与处理。
测试时只需运行BarberShop根据提示输入对应的顾客和椅子数量即可
三、具体代码:
import java.util.Scanner;
import java.util.concurrent.Semaphore;
public class Barbershop {
int customer = 0; //顾客的数量
static int chair = 2; //椅子的数量
int busy = 0; //理发师是否繁忙
boolean sleep = true;
Semaphore mutex = new Semaphore(1); //信号量的初始值为1
public static void main (String[] args) throws InterruptedException {
Barbershop b =new Barbershop();
System.out.println("睡觉的理发师问题:\r\n一个理发店包含了一个有n把椅子的
等待室,店里有一把椅子供顾客理发。\r\n没有顾客的时候理发师就会睡觉。\r\n如果顾客
到来时发现椅子"
+ "满了,就会离开。\r\n如果理发师正在忙但是还有空椅子,顾客就会坐
在椅子上等候。\r\n如果顾客到来时理发师正在睡觉,那么顾客就会唤醒理发师。");
System.out.println("让我们来模拟一下:\r\n会有多少个顾客到来呢?");
int cust = Integer.valueOf((new Scanner(System.in)).nextLine());
System.out.println("理发店里一共有多少把椅子呢?(包括正在理发的那个顾客的椅
子)");
chair = Integer.valueOf((new Scanner(System.in)).nextLine());
System.out.println("好的,"+cust+"名顾客和"+chair+"把椅子。现在,我们开始吧。
\r\n--------------------------------------------------------------------------");
for (int i = 1; i < cust+1; i++) {
new Thread(new Cust(b, i)).start();
Thread.sleep((int) (400 - Math.random() * 300));// 使得当前线程休眠 随机
0-0.1s
}
}
public synchronized boolean isFull() {
//检验有没有空椅子
if (customer>=chair) {
return true;}
return false;
}
public synchronized boolean isEmpty() {
//检验是否有顾客
if (customer<= 0) {
return true;}
return false;
}
public synchronized boolean isBusy() {
//检验理发师的状态
if (busy >= 1) {
return true;}
return false;
}
public void haircut(int index) throws InterruptedException {
boolean haveHaircut = false;
while(!haveHaircut) {
System.out.println("顾客" + index + ":我来理发啦~");
customer++;
// 判断是否满
if (isFull()) {
System.out.println("顾客" + index + ":嘤嘤嘤,没有椅子了,我一会儿再
过来看看吧……");
customer--;
Thread.sleep((int) (6000 - Math.random() *3000)); //顾客在一定的时间
之后会回来
}
else {
if (busy == 1) {
System.out.println("顾客" + index + ":有空椅子!我先坐上去!");
System.out.println("顾客" + index + ":等啊等,怎么还不到我呀?");}
mutex.acquire();
synchronized (this) {
while (busy == 1) {
wait();
}
}
if(sleep) {
System.out.println("顾客" + index + ":理发师,醒来啦~ ");
sleep = false;
}
System.out.println("顾客" + index + ":好开心,开始理发了!");
busy = 1;
Thread.sleep(1000); //理发需要一定的时间
System.out.println("顾客" + index + ":我的新发型好漂亮!我走啦!");
haveHaircut = true;
customer--;
mutex.release();
synchronized (this) {
busy = 0;
notify();
}
}
if (customer == 0&&(!sleep)) {
sleep = true;
System.out.println("理发师:诶呀现在没有人来理发,可把我给累坏
了,让我打个盹儿~");
}
}
}
}
package operationSystem;
public class Cust implements Runnable {
Barbershop dohair;
int index;
public Cust(Barbershop dohair, int index) {
this.dohair = dohair;
this.index = index;
}
public void run() {
try {
dohair.haircut(index);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}