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