操作系统原理与实践教程(第二版)习题答案 下载本文

P1 1 P2 3 P3 2 P4 0 1 2 0 2 0 1 0 2 0 4 0 2 2 2 4 0 6 1 0 5 3 0 2 5 0 4 0 4 2 3 3 0 然后进行安全性检测:

此时Available向量为(2,3,3,0),所以Work向量初始化为(2,3,3,0),此时的Work小于任意的Need[i]向量,所以系统处于不安全状态,所以不可以为P2分配资源

(13) 三个进程P1、P2、P3都需要5个同类资源才能正常执行直到终止,且这些进程只有在需要设备时才申请,则该系统中不会发生死锁的最小资源数量是多少?请说明理由。

解:

系统中不会发生死锁的最小资源数量是13,这样可以保证当每一个进程都占有4个资源的时候,有一个进程可以获得最后一个资源后被运行,运行完毕后释放资源,于是其余进程也能顺利运行完,所以不会死锁。

(14) 在解决死锁问题的几个方法中,哪种方法最易于实现,哪种方法使资源的利用率最高?

解:

预防死锁这个方法实现简单,效果突出;避免死锁这种方法系统吞吐量和资源利用率较高。

(15) 考虑由n个进程共享的具有m个同类资源的系统,如果对于i=1,2,3,…,n,有Need[i]>0并且所有进程的最大需求量之和小于m+n,试证明系统不会产生死锁。

解:

本题中只有一种资源,不妨设Max[i]为第i个进程的资源总共需要量,Need[i]为第i个进程还需要的资源数量,Allocation[i]表示第i个进程已经分配到的资源数量,Available为系统剩余的资源数,其中i=1,2,3,…,n。

假设此系统可以发生死锁。

系统剩余的资源数量为Available(Available>=0),由假设,因为系统处于死锁状态,所以Available个资源无法分配出去,所以每个进程的Need[i]都大于Available,

即 Need[i]>=Available+1

所以 ∑Need[i]>=n*(Available+1)=n*Available+n, ① 因为剩下的资源数是Available,所以已经分配出去的资源数为m – Available;

即 ∑Allocation[i]=m – Available ② 由①式和②式可以得到:

∑Need[i] + ∑Allocation[i]>=n*Available+n+ m – Available=(n-1)*Available+m+n ③ 又因为n>=1,所以(n-1)>=0,又因为Available>=0,所以(n-1)*Available>=0 ④ 由③式和④式可以得到∑Need[i] + ∑Allocation[i]>=0+m+n=m+n ⑤ 根据题意知: ∑Max[i]

(16) 某车站售票厅,在任何时刻最多可以容纳 20 名购票者进入,当售票厅中少于20名购票者时,厅外的购票者可立即进入,否则需要在外面等待。若把一个购票者看作一个进程,请回答以下问题:

① 用信号量管理这些并发进程时,应该怎样定义信号量,写出信号量的初值以及信号量的各取值的含义。

② 根据所定义的信号量,写出相应的程序来保证进程能够正确地并发执行。

③ 如果购票者最多为n个人,试写出信号量取值的可能变化范围(最大值和最小值)。 解:

①定义信号量S,初值为20,当s > 0时,它表示可以继续进入购票厅的人数,当s = 0时表示厅内已有20人正在购票,当s < 0时| s |表示正等待进入的人数。

②semaphore S=20;

begin

parbegin

procedure:begin repeat wait(s);

Enter and buy ticket; signal(s); until false;

end

parend end

③最大值为20,最小值为20-n

(17) 在测量控制系统中的数据采集任务时,把所采集的数据送往一单缓冲区;计算任务从该单缓冲区中取出数据进行计算。试写出利用信号量机制实现两个任务共享单缓冲区的同步算法。

解:

semaphore mutex = 1;

semaphore full = 0; semaphore empty = 1; begin

parbegin

collect: begin

repeat ??

collect data in nextp; wait(empty); wait(mutex);

buffer:=nextp; signal(mutex); signal(full); until false;

end

compute: begin

repeat ??

wait(full);

wait(mutex);

nextc:=buffer; signal(mutex); signal(empty);

compute data in nextc;

until false;

end parend end

(18) 桌上有一空盘,允许存放一只水果。爸爸可以向盘中放苹果,也可以向盘中放桔子,儿子专等着吃盘中的桔子,女儿专等着吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者用,请用信号量实现爸爸、儿子和女儿3个并发进程的同步。

解:

本题中应设置三个信号量S、So、Sa,信号量S表示盘中是否为空,其初值为1;So表示盘中是否有桔子,其初值为0;Sa表示盘中是否有苹果,其初值为0。同步描述如下: 爸爸: P(S); 儿子:P(So); 女儿:P(Sa);

将水果放入盘中 从盘子中取出桔子 从盘子中取出苹果 if (放入的是桔子) v(So); V(S); V(S); else v(Sa); 吃桔子 吃苹果;

(19) 设某系统中有3个进程Get、Process和Put,共用两个缓冲区buffer1和buffer2。假设buffer1中最多可以放11个信息,现在已经放入了两个信息;buffer2最多可以放5个信息。Get进程负责不断地将输入信息送入buffer1中,Process进程负责从buffer1中取出信息进行处理,并将处理结果送到buffer2中,Put进程负责从buffer2中读取结果并输出。试用信号量机制实现它们的同步与互斥。

解:

semaphore empty1=9; //buffer1空的数量 semaphore full1=2; //buffer1满的数量 semaphore empty2=5; //buffer2空的数量 semaphore full2=0; //buffer2满的数量 in1,in2,out1,out2:integer := 2,0,1,0; Get(){ while(1){

wait(empty1)

in1=(in1+1)mod11 signal(full1) }

}

Process(){

while(1){ wait(full1)

out1=(out1+1)mod11 signal(empty1)

signal(empty2) in2=(in2+1)mod5 signal(full2) }

}

Put(){

while(1){ wait(full2)

out2=(out2+1)mod5 signal(empty2) }

}

(20) 某寺庙有大、小和尚若干,另有一水缸。由小和尚挑水入缸供大和尚饮用。水缸可以容10桶水,水取自同一井。水井很窄,每次只能容一个水桶取水。水桶总数为3。每次入、取缸水仅为1桶,且不可同时进行。试给出取水、入水的同步算法。

解一、问题分析:

从井中取水并放入水缸是一个连续的动作可以视为一个进程,从缸中取水为另一个进程 设水井和水缸为临界资源,引入mutex1,mutex2;三个水桶无论从井中取水还是放入水缸中都一次一个,应该给他们一个信号量count,抢不到水桶的进程只好为等待,水缸满了时,不可以再放水了。设empty控制入水量,水缸空了时,不可取 水 设full

var mutex1,mutex2,empty,full,count:semaphore; mutex1:=mutex2:=1; empty:=10; full:=0; count:=3; cobegin

Procedure Fetch_Water Procedure Drink_Water begin begin while true while true p(empty); p(full); P(count); p(count); P(mutex1); p(mutex2); Get Water; Get water and v(mutex1); Drink water; P(mutex2); p(mutex2); pure water into the jar; v(empty); v(mutex2); v(count); v(count); end