五、应用题
1.画出有挂起操作的操作系统中进程状态转换图,标出引起进程状态变化的主要原因。
2.有一个可以存放消息的缓冲池BUF,由指针IN和OUT分别指示当前可存取消息的缓冲区位置。每存入一消息,执行IN:=(IN+1 )mod 128,每取出一消息,执行OUT:=(OUT+1 )mod 128,现在有多个进程并 发共享该缓冲池BUF,试用信号量机制协调诸进程正确地工作。
1 int mutex=1; //互斥量:in和out 2 int empty=128,full=0; //buf容量 3 void write(){ 4 while(true){ 5 p(mutex); 6 p(empty); 7 IN:=(IN+1)mod 128; 8 v(full); 9 v(mutex); 10 } 11 } 12 void read(){ 13 while(true){ 14 p(mutex); 15 p(full); 16 OUT:=(OUT+1)mod 128; 17 v(empty); 18 v(mutex); 19 } 20 }
3.某集装箱仓库共有100个仓位,用同一辆吊车负责集装箱的吊进和吊出。现有一批集装箱运来进仓,另有货主不断前来提货(按仓位顺序进出),设进仓用过程PUTIN表示,出仓用过程GETOUT表示,请用 P、V操作协调上述工作。
1 int mutex=1; //互斥量:进仓出仓(有无吊车) 2 int empty=100,full=0; //仓库容量 3 void in(){ 4 while(){ 5 p(mutex); 6 p(empty); 7 PUTIN; 8 v(full); 9 v(mutex); 10 } 11 } 12 void out(){ 13 while(){ 14 p(mutex); 15 p(full); 16 PUTOUT; 17 v(empty); 18 v(mutex); 19 } 20 }
4.有一独木桥,每次只允许一人过桥,现在桥的南北两端随时有人要过桥(PASS),为保证安全,请用P、V操作解决如下问题:
(1)只要桥上无人则允许任一方的一人过桥,桥上有人则等待。
1 int mutex=1; 2 void south(){ 3 while(ture){ 4 p(mutex); 5 pass; 6 v(mutex); 7 } 8 } 9 void north(){ 10 while(ture){ 11 p(mutex); 12 pass; 13 v(mutex); 14 } 15 }
(2)两边的人交替过桥。即某一方一人过桥后要让另一方的一个人过桥,桥上有人则等待。
1 int mutex=1; //桥上是否有人 2 int mutex_s=1,mutex_n=0; //设置南边先通行 3 void south(){ 4 while(ture){ 5 p(mutex); 6 p(mutex_s); 7 pass; 8 v(mutex_n); 9 v(mutex) 10 } 11 } 12 void north(){ 13 while(ture){ 14 p(mutex); 15 p(mutex_n); 16 pass; 17 v(mutex_s); 18 v(mutex) 19 } 20 }
5.假设有一个成品仓库,总共能存放100台成品,生产者进程生产成品放入仓库,消费者进程从仓库中取出成品消费,为了防止积压,仓库满时就停止生产。由于仓库搬运设备只有一套,故成品的进出只能分别 进行。使用P、V操作来实现该方案。
1 int mutex=1; //互斥量:进仓出仓 2 int empty=100,full=0; //仓库容量 3 void Producter(){ 4 while(){ 5 p(empty); 6 生产 7 p(mutex); 8 v(full); 9 入库 10 v(empty); 11 v(mutex); 12 } 13 } 14 void Consumer(){ 15 while(){ 16 p(mutex); 17 p(full); 18 出库 19 v(mutex); 20 } 21 }
6.设进程A每次产生一个记录依次存入缓存,进程B依次从缓存取出一个记录加以处理;又设缓存由N个缓存块(每块存放一个记录)组成,对缓存的两个操作(add_to_buffer,take_from_buffer)属临界区,请 用信号量控制上述并发进程。
1 int empty=N,full=0; 2 void A(){ 3 while(ture){ 4 p(empty); 5 add_to_buffer; 6 v(full); 7 } 8 } 9 void B(){ 10 while(ture){ 11 p(full); 12 take_from_buffer; 13 v(empty); 14 } 15 }
7.桌上有一空盘,允许存放一只水果。妈妈可以向盘中放苹果,也可以向盘中放桔子,儿子专等吃盘中的苹果,女儿专等吃盘中的桔子。规定当盘空时只能放一只水果供孩子取用,请用P、V原语实现母子三人 的同步。
1 int mutex_p=1,mutex_o=0,mutex_a=0; 2 void mom(){ 3 while(ture){ 4 p(mutex_p); 5 放水果 6 if(放桔子) 7 v(mutex_o) 8 else 9 v(mutex_a) 10 } 11 } 12 void son(){ 13 while(ture){ 14 p(mutex_a); 15 吃苹果 16 v(mutex_a); 17 v(mutex_p); 18 } 19 } 20 void daughter(){ 21 while(ture){ 22 p(mutex_o); 23 吃桔子 24 v(mutex_o); 25 v(mutex_p); 26 } 27 }
8.有三个进程PA、PB、PC合作解决文件打印问题:PA将文件记录从磁盘读入主存的缓冲区1,每执行一次读一个记录;PB将缓冲区1的内容复制到缓冲区2,每执行一次复制一个记录;PC将缓冲区2的内容打 印出来,每执行一次打印一个记录。缓冲区的大小等于一个记录的大小。请用P、V操作协调三个进程的工作。
1 int mutex_1=1,mutex_2=1; 2 void PA(){ 3 while(ture){ 4 p(mutex_1); 5 从磁盘读入 6 } 7 } 8 void PB(){ 9 while(mutex_1==0){ 10 p(mutex_2); 11 复制 12 v(mutex_1); 13 } 14 } 15 void PC(){ 16 while(mutex_2==0){ 17 打印 18 v(mutex_2); 19 } 20 }
9.请写出一个不会死锁的哲学家进餐问题的算法。
1 /*方法一:至多只允许四位哲学家同时去拿同侧筷子,最终能保证至少有一位哲学家能进餐,并在用完后释放两只筷子供他人使用。*/ 2 int s[5]={1,1,1,1,1}; //筷子 3 int mutex=4; 4 void zhexue_i(int i){ //i=1,2,3,4,5 5 while(ture){ 6 思考 7 p(mutex); //申请吃饭 8 p(s[i]); //拿和自己同号的筷子 9 p(s[(i+1)mod 5]); //拿旁边筷子 10 吃饭 11 v(s[i]); 12 v(s[(i+1)mod 5]); 13 v(mutex); 14 } 15 }
1 /*方法二:规定偶数号哲学家先拿比自己大一号的筷子,再拿和自己同号筷子;奇数号哲学家先拿和自己同号筷子,再拿比自己大一号的筷子;总有一人拿到两只筷,使用后4人争夺5只筷子不会死锁*/ 2 int a[5]={1,1,1,1,1}; 3 void zhexue_i(int i){ 4 while(ture){ 5 思考 6 if(i%2==0){ //偶数号 7 p(a[(i+1)mod 5]); 8 p(a[i]); 9 吃饭 10 v(a[(i+1)mod 5]); 11 v(a[i]); 12 } 13 if(i%2==1){ //奇数号 14 p(a[i]); 15 p(a[(i+1)mod 5]); 16 吃饭 17 v(a[(i+1)mod 5]); 18 v(a[i]); 19 } 20 } 21 }
10.某计算机系统有A、B、C三种资源,其中A共有10台,B共有12台,C共有7台,T0时刻,系统中有P1、P2、P3、P4、P5五个进程,各进程的资源分配和请求情况如下:
Allocation Need Available
A B C A B C A B C
P1 5 1 1 2 3 2 2 10 4
P2 2 0 1 3 2 3
P3 1 0 0 2 3 3
P4 0 1 0 6 3 1
P5 0 0 1 4 1 2
(1)T0时刻系统安全吗?
work | need | allcation | work=work+allcation | finish | |||||||||
A | B | C | A | B | C | A | B | C | A |
B | C | (10,12,7) | |
p1 | 2 | 10 | 4 | 2 | 3 | 2 | 5 | 1 | 1 | 7 | 11 | 5 | ture |
p2 | 7 | 11 | 5 | 3 | 2 | 3 | 2 | 0 | 1 | 9 | 11 | 6 | ture |
p3 | 9 | 11 | 6 | 2 | 3 | 3 | 1 | 0 | 0 | 10 | 11 | 6 | ture |
p4 | 10 | 11 | 6 | 6 | 3 | 1 | 0 | 1 | 0 | 10 | 12 | 6 | ture |
p5 | 10 | 12 | 6 | 4 | 1 | 2 | 0 | 0 | 1 | 10 | 12 | 7 | ture |
T0时刻系统安全;
(2)设T0时刻P4发出请求(2,3,1),能否实施分配?
request4(2,3,1)<=need4(6,3,1)
request4(2,3,1)<=available(2,10,4)
假定为p4分配资源:
Allocation Need Available
A B C A B C A B C
P1 5 1 1 2 3 2 0 7 3
P2 2 0 1 3 2 3
P3 1 0 0 2 3 3
P4 2 4 1 4 0 0
P5 0 0 1 4 1 2
安全性检查不通过;
不能实施分配
(3)设T0时刻P3发出请求(2,3,1),能否实施分配?
request3(2,3,1)<=need3(2,3,3)
request3(2,3,1)<=available(2,10,4)
假定为p3分配资源:
Allocation Need Available
A B C A B C A B C
P1 5 1 1 2 3 2 0 7 3
P2 2 0 1 3 2 3
P3 3 3 1 0 0 2
P4 0 1 0 6 3 1
P5 0 0 1 4 1 2
work | need | allcation | work=work+allcation | finish | |||||||||
A | B | C | A | B | C | A | B | C | A |
B | C | (10,12,7) | |
p1 | 3 | 10 | 4 | 2 | 3 | 2 | 5 | 1 | 1 | 8 | 11 | 5 | ture |
p2 | 8 | 11 | 5 | 3 | 2 | 3 | 2 | 0 | 1 | 10 | 11 | 6 | ture |
p3 | 0 | 7 | 3 | 0 | 0 | 2 | 3 | 3 | 1 | 3 | 10 | 4 | ture |
p4 | 10 | 11 | 6 | 6 | 3 | 1 | 0 | 1 | 0 | 10 | 12 | 6 | ture |
p5 | 10 | 12 | 6 | 4 | 1 | 2 | 0 | 0 | 1 | 10 | 12 | 7 | ture |
安全性检查通过;
能实施分配
11. 设系统中有A、B、C三种资源和P1、P2、P3、P4、P5五个进程,A资源的数量为17,B资源的数量为5,C资源的数量为20。(剩余资源数为2,3,3)T0 时刻系统状态如下:
|
最大需求 |
已分配资源数量 |
||||
A |
B |
C |
A |
B |
C |
|
P1 |
5 |
5 |
9 |
2 |
1 |
2 |
P2 |
5 |
3 |
6 |
4 |
0 |
2 |
P3 |
4 |
0 |
11 |
4 |
0 |
5 |
P4 |
4 |
2 |
5 |
2 |
0 |
4 |
P5 |
4 |
2 |
4 |
3 |
1 |
4 |
a) T0时刻系统是否安全?若是,请给出一个安全序列。
work | need | allcation | work=work+allcation | finish | order | |||||||||
A | B | C | A | B | C | A | B | C | A |
B | C | (17,5,20) | ||
p1 | 7 | 4 | 11 | 3 | 4 | 7 | 2 | 1 | 2 | 9 | 5 | 13 | ture | 3 |
p2 | 9 | 5 | 13 | 1 | 3 | 4 | 4 | 0 | 2 | 13 | 5 | 15 | ture | 4 |
p3 | 13 | 5 | 15 | 0 | 0 | 6 | 4 | 0 | 5 | 17 | 5 | 20 | ture | 5 |
p4 | 2 | 3 | 3 | 2 | 2 | 1 | 2 | 0 | 4 | 4 | 3 | 7 | ture | 1 |
p5 | 4 | 3 | 7 | 1 | 1 | 0 | 3 | 1 | 4 | 7 | 4 | 11 | ture | 2 |
安全序列:<p4,p5,p1,p2,p3>
b) T0时刻P2请求资源(0,3,4),是否可以实施资源分配?为什么?
request2(0,3,4)<=need2(1,3,4)
request2(c=4)>available(c=3)
不可以实施资源分配,剩余的C资源不够;
c) T0时刻P4请求资源(2,0,1),是否可以实施资源分配?为什么?
request4(2,0,1)<=need4(2,2,1)
request4(2,0,1)<=available(17,5,20)
假定为p4分配资源:
work | need | allcation | work=work+allcation | finish | |||||||||
A | B | C | A | B | C | A | B | C | A |
B | C | (17,5,20) | |
p1 | 7 | 4 | 11 | 3 | 4 | 7 | 2 | 1 | 2 | 9 | 5 | 13 | ture |
p2 | 9 | 5 | 13 | 1 | 3 | 4 | 4 | 0 | 2 | 13 | 5 | 15 | ture |
p3 | 13 | 5 | 15 | 0 | 0 | 6 | 4 | 0 | 5 | 17 | 5 | 20 | ture |
p4 | 0 | 3 | 2 | 0 | 2 | 0 | 4 | 0 | 5 | 4 | 3 | 7 | ture |
p5 | 4 | 3 | 7 | 1 | 1 | 0 | 3 | 1 | 4 | 7 | 4 | 11 | ture |
安全性检查通过;
能实施分配
12.单道批处理系统中,一批作业的到达和要求运行时间如下:
作业 |
到达时间(时) |
所需运行时间(小时) |
1 |
8.0 |
0.5 |
2 |
8.2 |
0.4 |
3 |
8.2 |
0.2 |
4 |
8.4 |
0.3 |
5 |
8.5 |
0.2 |
(1)采用SJF算法进行调度
(2)采用HRF算法进行调度
分别指出调度顺序,计算平均周转时间T和平均带权周转时间W。(同等条件下,按FCFS原则调度)
(1)调度顺序:1→3→1→5→4→2
T=(0.7+1.4+0.5+0.8+0.4)/5=0.6
W=(0.7/0.5+1.4/0.4+0.5/0.2+0.8/0.3+0.4/0.2)/5=2.413
(2)调度顺序:1→3→2→5→4
T=(0.5+0.9+0.5+1.2+0.8)/5=0.78
W=(0.5/0.5+0.9/0.4+0.5/0.2+1.2/0.3+0.8/0.2)/5=2.75