计算机操作系统(第四版)汤小丹课后答案完整版

13 .在创建一个进程时所要完成的主要工作是什么?答:

(1 ) OS 发现请求创建新进程事件后,调用进程创建原语 (2 )申请空白 PCB ; (3 )为新进程分配资源; (4 )初始化进程控制块; (5 )将新进程插入就绪队列 .

14 .在撤销一个进程时所要完成的主要工作是什么?答:

(1 )根据被终止进程标识符,从

PCB 集中检索出进程 PCB ,读出该进程状态。

Creat() ;

(2 )若被终止进程处于执行状态,立即终止该进程的执行,置调度标志真,指示该进程被终止后重新调度。

(3 )若该进程还有子进程,应将所有子孙进程终止,以防它们成为不可控进程。 (4 )将被终止进程拥有的全部资源,归还给父进程,或归还给系统。

(5 )将被终止进程 PCB 从所在队列或列表中移出,等待其它程序搜集信息。 15 .试说明引起进程阻塞或被唤醒的主要事件是什么?

答: a. 请求系统服务; b. 启动某种操作; c. 新数据尚未到达; d. 无新工作可做 . 16 .进程在运行时存在哪两种形式的制约?并举例说明之。 答:

(1 )间接相互制约关系。举例:有两进程 的

一台打印机分配给了进程 绪。

(2 )直接相互制约关系。举例:有输入进程 时,

计算进程因不能获得所需数据而阻塞,当进程 之,当缓冲区已满时,进程 唤醒 A 。

17 .为什么进程在进入临界区之前应先执行 区”代码?

答:为了实现多个进程对临界资源的互斥访问,

必须在临界区前面增加一段用于检查欲访问“进入区 ”代码?而在退出前又要执行

“退出

A 把数据输入缓冲区后,便唤醒进程

B ;反

A 通过单缓冲向进程 B 提供数据。当缓冲空

B,则进程 A 只能阻塞; 一旦 B 释放打印机, A 才由阻塞改为就

A 和 B,如果 A 提出打印请求,系统已把唯一

A 因没有缓冲区放数据而阻塞,进程 B 将缓冲区数据取走后便

的临界资源是否正被访问的代码,如果未被访问,该进程便可进入临界区对资源进行访问, 并设置正被访问标志,如果正被访问,则本进程不能进入临界区,实现这一功能的代码为 进入区 \代码;在退出临界区后,必须执行 进程能再访问此临界资源。

\退出区 \代码,用于恢复未被访问标志,使其它

\

18. 同步机构应遵循哪些基本准则?为什么?

答:同步机构应遵循的基本准则是:空闲让进、忙则等待、有限等待、让权等待原因:为实现进程互斥进入自己的临界区。 19. 试从物理概念上说明记录型信号量

wait 和 signal 。

wait 操

答: wait(S) :当 S.value>0 时,表示目前系统中这类资源还有可用的。执行一次

作,意味着进程请求一个单位的该类资源, 使系统中可供分配的该类资源减少一个, 因此描述为 S.value:=S.value-1 ;当 S.value<0 时,表示该类资源已分配完毕,进程应调用 block 原语自我阻塞,放弃处理机,并插入到信号量链表

S.L 中。

signal(S) :执行一次 signal 操作,意味着释放一个单位的可用资源,使系统中可供分配 的该类资源数增加一个,故执行

S.value:=S.value+1

操作。若加 1 后 S. value ≤0,则表

wakeup 原语,将 S.L

示在该信号量链表中,仍有等待该资源的进程被阻塞,因此应调用 链表中的第一个等待进程唤醒。

20 .你认为整型信号量机制是否完全遵循了同步机构的四条准则? 答:整型信号量机制不完全遵循同步机制的四条准则,它不满足

“让权等待 ”准则。

21 .如何利用信号量机制来实现多个进程对临界资源的互斥访问?并举例说明之。 答:为使多个进程互斥访问某临界资源,只需为该资源设置一互斥信号量 初值为 1 ,然后将各进程访问该资源的临界区

mutex ,并设其

CS 置 于 wait(mutex) 和 signal(mutex) 操 作

mutex 执行

之间即可。这样,每个欲访问该临界资源的进程在进入临界区之前,都要先对

wait 操作,若该资源此刻未被访问, 本次 wait 操作必然成功, 进程便可进入自己的临界区, 这时若再有其他进程也欲进入自己的临界区,此时由于对 因而该进程阻塞, 从而保证了该临界资源能被互斥访问。

mutex 执行 wait 操作定会失败, 当访问临界资源的进程退出临界区

后,应对 mutex 执行 signal 操作,释放该临界资源。利用信号量实现进程互斥的进程描述 如下:

Var mutex: semaphore:=1 begin parbegin process 1: begin repeat wait(mutex) ; critical section signal(mutex) ; remainder section until false ; end

process 2: begin

repeat wait(mutex) ; critical section signal(mutex) ; remainder section until false ; end parend

22 .试写出相应的程序来描述图 2-17 所示的前驱图。

答:( a)Var a, b, c, d, e, f, g, h; semaphore:= 0, 0,0, 0, 0, 0, 0, 0; begin parbegin

begin S1; signal(a); signal(b); end; begin wait(a); S2; signal(c); signal(d); end; begin wait(b); S3; signal(e); end; begin wait(c); S4; signal(f); end; begin wait(d); S5; signal(g); end; begin wait(e); S6; signal(h); end; begin wait(f); wait(g); wait(h); S7; end; parend end

(b ) Var a, b, c, d, e, f, g, h,i,j; semaphore:= 0,0, 0, 0, 0, 0, 0,0,0, 0; begin parbegin

begin S1; signal(a); signal(b); end; begin wait(a); S2; signal(c); signal(d); end; begin wait(b); S3; signal(e); signal(f); end; begin wait(c); S4; signal(g); end; begin wait(d); S5; signal(h); end; begin wait(e); S6; signal(i); end; begin wait(f); S7; signal(j); end;

begin wait(g);wait(h); wait(i); wait(j); S8;end;

parend end

23 .在生产者消费者问题中,如果缺少了 响?答:

如果缺少 signal(full) ,那么表明从第一个生产者进程开始就没有改变信号量 即使缓冲池产品已满,但

full 值还是 0,这样消费者进程执行

full 值,

signal(full) 或 signal(empty),

对执行结果有何影

wait(full) 时认为缓冲池是空

而取不到产品,消费者进程一直处于等待状态。

如果缺少 signal(empty) ,在生产者进程向 n 个缓冲区投满产品后消费者进程才开始从 中取产品,这时 empty=0 ,full=n ,那么每当消费者进程取走一个产品

empty 值并不改变,

直到缓冲池取空了, empty 值也是 0 ,即使目前缓冲池有 n 个空缓冲区,生产者进程要想 再往缓冲池中投放产品也会因为申请不到空缓冲区被阻塞。 24 .在生产消费者问题中,如果将两个

wait 操作即 wait(full) 和 wait(mutex) 互换位置,

或者将 signal(mutex) 与 signal ( full )互换位置,结果如何?

答:将 wait(full) 和 wait(mutex) 互换位置后,可能引起死锁。考虑系统中缓冲区全满时, 若一生产者进程先执行了

wait(mutex) 操作并获得成功,则当再执行

wait(empty) 操作时,

它将因失败而进入阻塞状态, 它期待消费者进程执行 signal(empty) 来唤醒自己, 在此之前,

wait(mutex) 操作而进入自己的临界

它不可能执行 signal(mutex) 操作,从而使试图通过执行

区的其他生产者和所有消费者进程全部进入阻塞状态,这样容易引起系统死锁。 若 signal(mutex) 和 signal(full) 互换位置后只是影响进程对临界资源的释放次序,而不会引起系统死锁,因此可以互换位置。 25 .我们在为某一临界资源设置一把锁

W,当 W=1 时表示关锁, 当 W=0 时表示锁已打开。

试写出开锁和关锁的原语,并利用他们实现互斥。 答:整型信号量: lock(W): while W=1 do no-op W:=1;

unlock(W): W:=0;

记录型信号量: lock(W): W:=W+1; if(W>1) then block(W, L) unlock(W): W:=W-1; if(W>0) then wakeup(W, L) 例子:

Var W:semaphore:=0 ; begin repeat lock(W);

critical section unlock(W); remainder section until false; end

26 .试修改下面生产者-消费者问题解法中的错误 :

答: producer: begin repeat

producer an item in nextp; wait(mutex); wait(full); buffer(in):=nextp;

signal(mutex);

until false; end consumer: begin repeat wait(mutex); wait(empty); nextc:=buffer(out); out:=out+1; signal(mutex);

consumer item in nextc; until false; end

27 .试利用记录型信号量写出一个不会出现死锁的哲学家进餐问题的算法答: Var chopstick:array[0,

,4] of semaphore;

.

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4