(3)若该进程还有子进程,应将所有子孙进程终止,以防它们成为不可控进程。 (4)将被终止进程拥有的全部资源,归还给父进程,或归还给系统。
(5)将被终止进程PCB 从所在队列或列表中移出,等待其它程序搜集信息。 15.试说明引起迚程阻塞戒被唤醒的主要事件是什么?
答:a. 请求系统服务;b. 启动某种操作;c. 新数据尚未到达;d. 无新工作可做. 16.迚程在运行时存在哪两种形式的制约?并丼例说明之。 答:
(1)间接相互制约关系。举例:有两进程A 和B,如果A 提出打印请求,系统已把唯一的 一台打印机分配给了进程B,则进程A 只能阻塞;一旦B 释放打印机,A 才由阻塞改为就 绪。
(2)直接相互制约关系。举例:有输入进程A 通过单缓冲向进程B 提供数据。当缓冲空时, 计算进程因不能获得所需数据而阻塞,当进程A 把数据输入缓冲区后,便唤醒进程B;反
之,当缓冲区已满时,进程A 因没有缓冲区放数据而阻塞,进程B 将缓冲区数据取走后便唤醒A。 17.为什么迚程在迚入临界区之前应先执行“迚入区”代码?而在退出前又要执行“退出区”代码? 答:为了实现多个进程对临界资源的互斥访问,必须在临界区前面增加一段用于检查欲访问的临界资源是否正被访问的代码,如果未被访问,该进程便可进入临界区对资源进行访问,并设臵正被访问标志,如果正被访问,则本进程不能进入临界区,实现这一功能的代码为\在退出临界区后,必须执行\退出区\代码,用于恢复未被访问标志,使其它进程能再访问此临界资源。 18. 同步机构应遵循哪些基本准则?为什么?
答:同步机构应遵循的基本准则是:空闲让进、忙则等待、有限等待、让权等待原因:为实现进程互斥进入自己的临界区。
19. 试从物理概念上说明记录型信号量wait 和signal。
答:wait(S):当S.value>0 时,表示目前系统中这类资源还有可用的。执行一次wait 操作,意味着进程请求一个单位的该类资源,使系统中可供分配的该类资源减少一个,因此描述为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.如何利用信号量机制来实现多个迚程对临界资源的互斥访问?并丼例说明之。 答:为使多个进程互斥访问某临界资源,只需为该资源设臵一互斥信号量mutex,并设其 初值为1,然后将各进程访问该资源的临界区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 seetion 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)戒signal(empty),对执行结果有何影 响?
答:如果缺少signal(full),那么表明从第一个生产者进程开始就没有改变信号量full 值,即使缓冲池产品已满,但full 值还是0,这样消费者进程执行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)来唤醒自己,在此之前,它不可能执行signal(mutex)操作,从而使试图通过执行wait(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); /* 应为wait(empty),而且还应该在wait(mutex)的前面 */ buffer(in):=nextp;
/* 缓冲池数组游标应前移: in:=(in+1) mod n; */ signal(mutex); /* signal(full); */ until false; end consumer: begin repeat wait(mutex);
wait(empty); /* 应为wait(full),而且还应该在wait(mutex)的前面 */ nextc:=buffer(out);
out:=out+1; /* 考虑循环,应改为: out:=(out+1) mod n; */ signal(mutex);/* signal(empty); */ consumer item in nextc; until false; end
27.试利用记录型信号量写出一个丌会出现死锁的哲学家迚餐问题的算法. 答:Var chopstick:array[0,?,4] of semaphore;
所有信号量均被初始化为1,第i 位哲学家的活动可描述为: Repeat
Wait(chopstick[i]);
Wait(. chopstick[(i+1) mod 5]); ? Ea.t ; ?
Signal(chopstick[i]);
Signal(chopstick[(i+1) mod 5]) Ea.t ; ? Think; 11 Until false;
28.在测量控制系统中的数据采集仸务,把所采集的数据送一单缓冲区;计算仸务从该单 缓冲中叏出数据迚行计算.试写出利用信号量机制实现两者共享单缓冲的同步算法。 答:
a. Var mutex, empty, full: semaphore:=1, 1, 0; gather: begin
repeat ??
gather 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
b. Var empty, full: semaphore:=1, 0; gather: begin repeat ??
gather data in nextp; wait(empty); buffer:=nextp; signal(full); until false; end compute: begin repeat ?? wait(full); nextc:=buffer; signal(empty); compute data in nextc; until false; end
29.画图说明管程由哪几部分组成,为什么要引入条件发量?