操作系统课后习题答案 3 进程同步与通信
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
习题 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);