操作系统部分课后习题答案 联系客服

发布时间 : 星期二 文章操作系统部分课后习题答案更新完毕开始阅读3bfa5d139fc3d5bbfd0a79563c1ec5da51e2d684

控制和管理的。

8.试说明进程在三个基本状态之间转换的典型原因。 1 2 3 4

就绪状态→执行状态执行状态→就绪状态执行状态→阻塞状态阻塞状态→就绪状态

进程分配到CPU资源 时间片用完 I/O请求 I/O完成

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

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

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

(1)根据被终止进程标识符,从PCB集中检索出进程PCB读出该进程状态。(2)若被终止进程处于执行状态,立即终止该进程的执行,置调度标志真指示该进程被终止后重新调度。(3)若该进程还有子进程,应将所有子孙进程终止,以防它们成为不可控进程。(4)将被终止进程拥有的全部资源,归还给父进程,或归还给系统。(5)将被终止进程PCB 从所在队列或列表中移出,等待其它程序搜集信息。

15.试说明引起进程阻塞或被唤醒的主要事件是什么 16.进程在运行时存在哪两种形式的制约?并举例说明之。

(1)间接相互制约关系。举例:有两进程A和B,如果A 提出打印请求,系统已把唯一的一台打印机分配给了进程B,则进程A只能阻塞,一旦B释放打印机,A才由阻塞改为就绪。(2)直接相互制约关系。举例:有输入进程A通过单缓冲向进程B提供数据。当缓冲空时,计算进程因不能获得所需数据而阻塞,当进程A把数据输入缓冲区后,便唤醒进程B,反之,当缓冲区已满时,进程A因没有缓冲区放数据而阻塞,进程B将缓冲区数据取走后便唤醒A。 17.为什么进程在进入临界区之前应先执行“进入区”代码,而在退出前又要执行“退出区”代码

为了实现多个进程对临界资源的互斥访问,必须在临界区前面增加一段用于检查欲访问的临界资源是否正被访问的代码。如果未被访问,该进程便可进入临界区对资源进行访问,并设置正被访问标志;如果正被访问,则本进程不能进入临界区,实现这一功能的代码为\进入区\代码,在退出临界区后,必须执行\退出区\代码,用于恢复未被访问标志,使其它进程能再访问此临界资源。 18. 同步机构应遵循哪些基本准则?为什么

同步机构应遵循的基本准则是:空闲让进、忙则等待、有限等待、让权等待 原因,为实现进程互斥进入自己的临界区。

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)互换位置后只是影响进程对临界资源的释放次序,而不会引起系统死锁,因此可以互换位置。

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; */