操作系统课后习题答案 3 进程同步与通信

习题 3 进程同步与通信

一、选择题

题号 1 2 3 4 5 6 7 8 9 10 答案 A D D C B C A B A A 题号 11 12 答案 D C 二、综合题 1、答:临界资源也称独占资源、互斥资源,它是指某段时间内只充许一个进程使用的资源。 比如打印机等硬件资源,以及只能互斥使用的变量、表格、队列等软件资源。各个进程中访 问临界资源的、必须互斥执行的程序代码段称为临界区,各进程中访问同一临界资源的程序 代码段必须互斥执行。

为防止两个进程同时进入临界区,可采用软件解决方法或同步机构来协调它们。但是,不论是 软件算法还是同步机构都应遵循下述准则:

① 空闲让进。② 忙则等待。③ 有限等待。④ 让权等待。

2、答:忙等待意味着一个进程正在等待满足一个没有闲置处理器的严格循环的条件。因为 只有一个CPU 为多个进程服务,因此这种等待浪费了CPU 的时钟。

其他类型的等待:与忙等待需要占用处理器不同,另外一种等待则允许放弃处理器。如进 程阻塞自己并且等待在合适的时间被唤醒。忙等可以采用更为有效的办法来避免。例如:执 行请求(类似于中断)机制以及PV 信号量机制,均可避免“忙等待”现象的发生。 3、答:

在生产者—消费者问题中,Producer 进程中P(empty)和P(mutex)互换先后次序。先

执行P(mutex),假设成功,生产者进程获得对缓冲区的访问权,但如果此时缓冲池已满,没 有空缓冲区可供其使用,后续的P(empty)原语没有通过,Producer 阻塞在信号量empty 上,而此时mutex 已被改为0,没有恢复成初值1。切换到消费者进程后,Consumer 进程执行 P(full)成功,但其执行P(mutex)时由于Producer 正在访问缓冲区,所以不成功,阻塞 在信号量mutex 上。生产者进程和消费者进程两者均无法继续执行,相互等待对方释放资源, 会产生死锁。

在生产者和消费者进程中,V 操作的次序无关紧要,不会出现死锁现象。 4、答:

5、答:

设信号量sp 用于控制对盘子的互斥操作,信号量sg1 用于计数,表示盘子中的苹果数 目,信号量sg2 用于计数,表示盘子中的桔子数目。 Semaphore sp=1,sg1=0,sg2=0

dad() {

while(1)

{ prepare an apple; p(sp);

put an apple on the plate; v(sg2);} } mom() {

while(1)

{prepare an orange; p(sp);

put an orange on the plate; v(sg1);} } son() {

while(1) {

p(sg1);

take an orange from the plate; v(sp);

eat the orange; } }

daughter() {

while(1) {

p(sg2);

take an apple from the plate; v(sp);

eat the apple; } }

6、答:

本题是生产者-消费者问题的一个扩展,P1 是生产者,生产的产品分为两种,P2、P3 是消 费者,分别消费这两种产品。

(1)缓冲区是一互斥资源,每次只允许一个进程进入,所以设互斥信号量mutex,其初始 值为1。

(2)P1、P2 因为奇数的放置与取用而同步,设该信号量为odd,初始值为0;P1、P3 因为 偶数的放置与取用而同步,设该信号量为even,初始值为0,P1、P2、P3 因为共享缓冲区, 设同步信号量为empty,初始值为N。

semaphore mutex=1,odd=0,even=0,empty=N main() cobegin{ Process P1 while(true)

{ number=produce(); P(empty); P(mutex); put(); V(mutex);

if number%2==0 V(even); else

V(odd); }

Process P2 while(true) { P(odd); P(mutex); getodd(); V(mutex); V(empty); countodd(); }

Process P3 while(true) { P(even); P(mutex); geteven(); V(mutex); V(empty); counteven(); }

}coend 7、答:

Semaphore max; //初始n+1,表示理发店可以容纳的总人数 Semaphore chair; //初始n,空闲的椅子

Semaphore barber; //初始1,表示理发椅空闲 Semaphore finished; //初始0,表示一次理发结束 Semaphore ready; //初始0,表示客人准备就绪 Customer: While(1) {

wait(max);

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