习题5答案word文档良心出品Word文档格式.docx
《习题5答案word文档良心出品Word文档格式.docx》由会员分享,可在线阅读,更多相关《习题5答案word文档良心出品Word文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
d.让权等待.
5.8试从物理概念上说明信号量P、V操作的含义。
P(S)表示申请一个资源,S.value>
0表示有资源可用,其值为资源的数目;
S.value=0表示无资源可用;
S.value<
0,则|S.value|表示S等待队列中的进程个数。
V(S)表示释放一个资源,信号量的初值应该大于等于0。
5.9由V操作唤醒的进程是否一定能够直接进入运行状态?
否。
一般来说,唤醒是将进程状态由等待状态变成就绪状态,而就绪进程何时获得处理机则是由系统的处理机调度策略确定的。
如果采用抢占式优先级调度算法,并且被唤醒的进程是当前系统中优先级最高的进程,那么该进程将被调度执行,其状态变成运行态。
如果该进程不是系统中优先级最高的进程或系统采用其它调度算法,那么该进程不会被调度执行,其状态将维持在就绪态。
5.10我们为某临界区设置一把锁W,当W=1时,表示关锁;
W=0时,表示锁打开。
试写出开锁原语和关锁原语,并利用它们去实现互斥。
开锁原语:
voidunlock(W)
{W=0;
}
关锁原语:
voidlock(W)
{while(W==1){};
W=1;
}
利用开关锁原语实现互斥:
semaphoreW=0;
main()
{cobegin
Pn()/*并发的进程P1、P2、……Pn*/
{lock(W);
临界区;
unlock(W);
其余部分;
}
……
coend}
5.11试写出相应的程序来描述图5.8所示的前趋图。
(a)设6个同步信号量f1、f2、f3、f4、f5、f6分别表示进程S1、S2、S3、S4、S5、S6是否执行完成,其初值均为0。
这7个进程的同步描述如下:
主程序如下:
semaphorefl=f2=f3=f4=f5=f6=0;
S1();
S2();
S3();
S4();
S5();
S6();
S7();
各个进程的语句形式如下:
voidS1()
{
V(f1);
voidS2()
P(f1);
V(f2);
voidS3()
V(f3);
voidS4()
P(f2);
V(f4);
voidS5()
V(f5);
voidS6()
P(f3);
V(f6);
voidS7()
P(f4);
P(f5);
P(f6);
……}
(b)另一种做法:
设7个同步信号量f2、f3、f4、f5、f6、f7、f8分别表示进程S2、S3、S4、S5、S6、S7、S8是否可以开始执行,其初值均为0。
semaphoref2=f3=f4=f5=f6=f7=f8=0;
主程序:
略(类似a)
这8个进程的语句形式如下:
V(f7);
V(f8);
P(f7);
voidS8()
P(f8);
5.12在生产者一消费者问题中,如果缺少了V(full)或V(empty),对执行结果会有何影响?
生产者可以不断地往缓冲池送消息,如果缓冲池满,会覆盖原有数据,造成数据混乱。
而消费者始终因P(full)操作将消费进程直接送入进程链表进行等待,无法访问缓冲池,造成无限等待。
5.13在生产者一消费者问题中,如果将两个P操作即P(full)和P(mutex)互换位置;
或者是将V(full)和V(mutex)互换位置,结果会如何?
a.容易造成死锁。
b.从逻辑上来说应该是一样的。
5.14画图说明管程由哪几部分组成?
为什么要引入条件变量?
图略。
因为调用wait原语后,使进程等待的原因有多种,为了区别它们,引入了条件变量。
5.15设S1和S2为两个信号灯变量,下列八组P、V操作哪些可以同时进行?
哪些不能同时进行?
为什么?
(1)P(S1),P(S2)
(2)P(S1),V(S2)
(3)V(S1),P(S2)(4)V(S1),V(S2)
(5)P(S1),P(S1)(6)P(S2),V(S2)
(7)V(S1),P(S1)(8)V(S2),V(S2)
能同时进行的包括:
(1)、
(2)、(3)、(4)。
这些操作涉及不同信号量,属于关于不同组共享变量的临界区。
不能同时进行的包括:
(5)、(6)、(7)、(8)。
这些操作涉及相同的信号量,属于关于同一组共享变量的临界区。
5.16对于生产者—消费者问题,假设缓冲区是无界的,试用信号灯与PV操作给出解法。
由于是无界缓冲区,所以生产者不会因得不到缓冲区而被阻塞,不需要对空缓冲区进行管理,可以去掉在有界缓冲区中用来管理空缓冲区的信号量及其PV操作。
Semaphoremutex_in=1;
Semaphoremutex_out=1;
Semaphoreempty=0;
intin=0,out=0;
生产者活动:
while
(1){
producenextproduct;
P(mutex_in);
Addtheproducttobuffer[in];
in++;
V(mutex_in);
V(empty);
消费者活动:
P(empty);
P(mutex_out);
Taketheproductfrombuffer[out];
out++;
V(mutex_out);
5.17试用信号灯与PV操作实现司机与售票员之间的同步问题。
设公共汽车上有一个司机和一个售票员,其活动如下图所示.
司机的活动P1:
While
(1)
{启动车辆;
正常行车;
到站停车;
售票员的活动P2:
{关车门;
售票;
开车门;
为了安全起见,显然要求:
(1)关车门后方能启动车辆;
(2)到站停车后方能开车门。
定义两个信号量,一个信号量start表示是否允许司机启动车辆,另一个信号量open表示是否允许售票员开车门。
初始状态是车停在始发站,车门开着,等待乘客上车。
因此,两个信号量的初值都是0。
semaphorestart=0;
semaphoreopen=0;
司机的活动P1:
while
(1)
{P(start);
启动车辆;
正常行车;
到站停车;
V(open);
售票员的活动P2:
while
(1)
{关车门;
V(start);
售票;
P(open);
开车门;
5.18考虑一个理发店,只有一个理发师,只有N张可供顾客等待理发的椅子,如果没有顾客,则理发师睡觉;
如果有一顾客进入理发店发现理发师在睡觉,则把他叫醒,试用信号量设计一个协调理发师和顾客的程序。
题目中要求描述理发师和顾客的行为,因此需要两类进程Barber()和Customer()分别描述理发师和顾客的行为。
当理发师睡觉时顾客进来需要唤醒理发师为其理发,当有顾客时理发师为其理发,没有的时候理发师睡觉,因此理发师和顾客之间是同步的关系,由于每次理发师只能为一个人理发,且可供等侯的椅子有限只有n个,即理发师和椅子是临界资源,所以顾客之间是互斥的关系。
引入3个信号量和一个控制变量:
1)控制变量waiting记录等候理发的顾客数,初值均为0;
2)信号量customers记录等候理发的顾客数,并用作阻塞理发师进程,初值为0;
3)信号量barbers记录正在等候顾客的理发师数,并用作阻塞顾客进程,初值为0;
4)信号量mutex用于互斥,初值为1.
PV操作代码如下:
intwaiting=0;
//等候理发的顾客数
intchairs=n;
//为顾客准备的椅子数
semaphorecustomers=0,barbers=0,mutex=1;
barber()
{
while(TRUE);
//理完一人,还有顾客吗?
P(cutomers);
//若无顾客,理发师睡眠
P(mutex);
//进程互斥
waiting=waiting-1;
//等候顾客数少一个
V(barbers);
//理发师去为一个顾客理发
V(mutex);
//开放临界区
cut-hair();
//正在理发
customer()
{
P(mutex);
//进程互斥
if(waiting<
chairs)
{waiting=waiting+1;
//等候顾客数加1
V(customers);
//必要的话唤醒理发师
V(mutex);
P(barbers);
//无理发师,顾客坐着养神
get-haircut();
//一个顾客坐下理发/
}
else
//人满了,走吧!
5.19进程之间有哪些基本的通信方式?
它们分别有什么特点?
适用于哪些场合?
进程通信根据交换信息量的多少分为高级通信和低级通信。
低级通信一般只传送一个或几个字节的信息,以达到控制进程执行速度的作用(如PV操作);
高级通信则要传送大量数据,目的不是为了控制进程的执行速度,而是为了交换信息。
高级进程通信方式有很多种,大致可归并为三类:
共享存储器、管道文件和消息传递。
共享存储器:
在内存种分配一片空间作为共享存储区。
需要进行通信的进程把它附加到自己的地址空间中,不需要时则把它取消。
管道文件:
它是连接两个命令的一个打开文件。
一个命令向该文件中写入数据,为写者;
另一个命令从该文件中读出数据,为读者。
消息传递:
它以消息为单位在进程间进行数据交换。
5.20试比较进程间的低级通信工具与高级通信工具。
用户用低级通信工具实现进程通信很不方便,因为其效率低,通信对用户不透明,所有的操作都必须由程序员来实现。
而高级通信工具则可弥补这些缺陷,用户可直接利用操作系统所提供的一组通信命令,高效地传送大量的数据。
5.21试用信箱通信方式解决生产者-消费者问题。
在本题解决方案中,使用了两个信箱mayproduce和mayconsume,两个信箱的大小均为N,即其中最多可以存放N条消息。
当生产者生产了数据时,它将数据作为消息发送到信箱mayconsume,只要该信箱中有一条消息,消费者就可以开始消费。
信箱mayproduce最初填满了空消息,空消息的条数等于信箱的容量与mayconsume信箱中消息条数之差(其作用类似于用信号量机制解决生产者一消费者问题中的empty)。
当生产者向消费者发送一条消息时,mayproduce信箱中的消息条数减少,mayconsume信箱中的消息条数增加;
当消费者接收一条消息时,mayconsume信箱中的消息条数减少,而mayproduce信箱中的消息条数增加。
系统中的消息总条数保持不变。
constintcapacity=N;
/*N为信箱容量*/
null=...;
/*这里“...”为空消息*/
inti;
main()/*主程序*/
create_mailbox(mayproduce);
/*创建信箱mayproduce*/
create_mailbox(mayconsume);
for(i=1;
i<
=capacity;
i++)
send(mayproduce,null);
cobegin
producer();
consumer();
coend
}
producer()/*生产者进程*/
messagepmsg;
/*message为消息类型*/
while(true)
receive(mayproduce,pmsg);
/*等待空消息*/
pmsg=produce();
/*生产一条消息*/
send(mayconsume,pmsg);
consumer()/*消费者进程*/
messagecmsg;
receive(mayconsume,cmsg);
consume(cmsg);
/*取出一条消息供消费*/
5.22在消息传递通信方式下:
(1)发送进程和接收进程在通信过程中可以采用哪3种同步方式?
(2)试以下面给出的发送进程和接收进程(将接收到的数据存入S)为例,说明当接收进程执行到标号为L2的语句时,采用这3种同步方式,X的值可能各是多少?
发送进程P:
M=10;
L1:
sendMTOQ;
L2:
M=20;
GotoLl;
接收进程Q:
S=-100;
receiveSfromP;
X=S+1;
(1)发送进程阻塞,接收进程阻塞。
发送进程不阻塞,接收进程阻塞。
发送进程不阻塞,接收进程也不阻塞。
(2)在第1种同步方式下,无论进程P还是Q都必须等到对方执行完标号为L1的语句后才可往下执行,S的值一定为M的初值10,所以X只能为11。
在第2种同步方式下,如果进程P先执行到标号为L1的语句,由于无需阻塞,仍可往下执行,而进程Q在执行到标号为L1的语句时,可能进程P尚未来得及向Q发出第2条消息,也可能进程P已经向Q发出了多条消息。
在前一种情况下,S的值为10;
在后一种情况下,S的值为20,故X的值可能为11或21。
在第3种同步方式下,如果进程P先执行到标号为L1的语句,由于无需阻塞,仍可往下执行,而进程Q在执行到标号为L1的语句时,可能进程P尚未来得及向Q发出第1条消息,也可能进程P已经向Q发出了一条或多条消息。
在前一种情况下,S的值为—100;
在中间一种情况下,S的值为10;
在后一种情况下,S的值为20。
故X的值可能为-99、11或21。