习题5答案.docx

上传人:牧羊曲112 文档编号:3229686 上传时间:2023-03-11 格式:DOCX 页数:12 大小:42.45KB
返回 下载 相关 举报
习题5答案.docx_第1页
第1页 / 共12页
习题5答案.docx_第2页
第2页 / 共12页
习题5答案.docx_第3页
第3页 / 共12页
习题5答案.docx_第4页
第4页 / 共12页
习题5答案.docx_第5页
第5页 / 共12页
亲,该文档总共12页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《习题5答案.docx》由会员分享,可在线阅读,更多相关《习题5答案.docx(12页珍藏版)》请在三一办公上搜索。

1、习题5答案习题5答案 习题5 5.1 何谓与时间有关的错误?举例说明之。 答:并发进程的执行实际上是进程活动的某种交叉,某些交叉次序可能得到错误结果。由于具体交叉的形成与进程的推进速度有关,而速度是时间的函数,因而将这种错误称为与时间有关的错误。例子略。 5.2 什么是临界资源?什么是临界区? 答:一次仅允许一个进程使用的资源称为临界资源;在每个进程中,访问临界资源的那段程序称为临界区。 5.3 试分析临界区的大小与系统并发性之间的关系。 答:关于同一组变量的临界区是不能并发执行的代码,临界区越大,并发性越差,因而编写并发程序应尽量缩小临界区域范围。 5.4 为何开关中断进程互斥方法仅在单CP

2、U系统中是有效的? 答:关中断方法不适用于多CPU系统,因为关中断只能保证CPU不由一个进程切换到另外一个进程,从而防止多个进程并发地进入公共临界区域。但即使关中断后,不同进程仍可以在不同CPU上并行执行关于同一组共享变量的临界区代码. 5.5 进程的互斥和同步有什么异同点? 答:进程的同步和互斥是指进程在推进时的相互制约关系。 进程同步源于进程合作,是进程间共同完成一项任务是直接发生相互作用的关系。是进程之间的直接制约关系。进程互斥源于对临界资源的竞争,是进程之间的间接制约关系。 5.6 试说明进程互斥、同步和通信三者之间的关系。 答:进程的同步和互斥是指进程在推进时的相互制约关系,已经在上

3、题中给出了详细的解答。 由于进程间存在制约关系,为了保证进程的正确运行以及相互合作进程间的信息交换,就需要进程之间进行通信。进程通信是指进程间的信息交换,分为高级通信和低级通信,高级通信以较高的效率传送大批数据。进程之间的互斥与同步也是一种通信,由于交换的信息量很小,因此这种进程通信称为低级进程通信。 5.7 同步机构应遵循哪些基本准则? 答:a.空闲让进. b.忙则等待. c.有限等待. d.让权等待. 5.8 试从物理概念上说明信号量P、V操作的含义。 答:P(S)表示申请一个资源,S.value0表示有资源可用,其值为资源的数目;S.value=0表示无资源可用;S.value0, 则|

4、S.value|表示S等待队列中的进程个数。V(S)表示释放一个资源,信号量的初值应该大于等于0。 5.9 由V操作唤醒的进程是否一定能够直接进入运行状态?举例说明之。 答:否。一般来说,唤醒是将进程状态由等待状态变成就绪状态,而就绪进程何时获得处理机则是由系统的处理机调度策略确定的。如果采用抢占式优先级调度算法,并且被唤醒的进程是当前系统中优先级最高的进程,那么该进程将被调度执行,其状态变成运行态。如果该进程不是系统中优先级最高的进程或系统采用其它调度算法,那么该进程不会被调度执行,其状态将维持在就绪态。 5.10 我们为某临界区设置一把锁W,当W=1时,表示关锁;W=0时,表示锁打开。试写

5、出开锁原语和关锁原语,并利用它们去实现互斥。 答:开锁原语: void unlock(W) W=0; 关锁原语: void lock(W) while (W=1) ; W=1; 利用开关锁原语实现互斥: semaphore W=0; main ( ) cobegin Pn ( ) /*并发的进程P1、P2、Pn */ lock(W); 临界区; unlock(W); 其余部分; coend 5.11 试写出相应的程序来描述图5.8所示的前趋图。 S1 S2 S2 S1 S3 S3 S5 S4 S6 S4 S5 S6 S7 S7 图5.8前趋图 S8 答:(a)设6个同步信号量f1、f2、f3、

6、f4、f5、f6分别表示进程S1、S2、S3、S4、S5、S6是否执行完成,其初值均为0。这7个进程的同步描述如下: 主程序如下: semaphore fl=f2=f3=f4=f5=f6=0; main ( ) cobegin S1; S2; S3; S4; S5; S6; S7; coend 各个进程的语句形式如下: void S1 V(f1); V(f1); void S4 P(f2); V(f4); void S2 P(f1); V(f2); V(f2); void S5 P(f2); V(f5); void S3 P(f1); V(f3); void S6 P(f3); V(f6);

7、void S7 P(f4); P(f5); P(f6); (b)另一种做法: 设7个同步信号量f2、f3、f4、f5、f6、f7、f8分别表示进程S2、S3、S4、S5、S6、S7、S8是否可以开始执行,其初值均为0。 semaphore f2=f3=f4=f5=f6=f7=f8=0; 主程序:略 这8个进程的语句形式如下: void S1 V(f2); V(f3); void S5 P(f5); V(f8); void S2 P(f2); V(f4); V(f5); void S6 P(f6); V(f8); void S3 P(f3); V(f6); V(f7); void S7 P(f7

8、); V(f8); void S4 P(f4); V(f8); void S8 P(f8); P(f8); P(f8); P(f8); 5.12 在生产者一消费者问题中,如果缺少了V,对执行结果会有何影响? 答:生产者可以不断地往缓冲池送消息,如果缓冲池满,会覆盖原有数据,造成数据混乱。而消费者始终因P(full)操作将消费进程直接送入进程链表进行等待,无法访问缓冲池,造成无限等待。 5.13 在生产者一消费者问题中,如果将两个P操作即P和P(mutex)互换位置;或者是将V和V(mutex)互换位置,结果会如何? 答:a.容易造成死锁。 b从逻辑上来说应该是一样的。 5.14 画图说明管程由

9、哪几部分组成?为什么要引入条件变量? 答:图略。因为调用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)。这些操作涉及不同信号量,属于关于不同组共享变量的临界区。不

10、能同时进行的包括:(5)、(6)、(7)、(8)。这些操作涉及相同的信号量,属于关于同一组共享变量的临界区。 5.16 对于生产者消费者问题,假设缓冲区是无界的,试用信号灯与PV操作给出解法。 答:由于是无界缓冲区,所以生产者不会因得不到缓冲区而被阻塞,不需要对空缓冲区进行管理,可以去掉在有界缓冲区中用来管理空缓冲区的信号量及其PV操作。 Semaphore mutex_in=1; Semaphore mutex_out=1; Semaphore empty=0; int in=0, out=0; 生产者活动: 消费者活动: while(1) while(1) produce next pro

11、duct; P(empty); P(mutex_in); P(mutex_out); Add the product to bufferin; Take the product from bufferout; in+; out+; V(mutex_in); V(mutex_out); V(empty); 5.17 试用信号灯与PV操作实现司机与售票员之间的同步问题。设公共汽车上有一个司机和一个售票员,其活动如下图所示. 司机的活动P1: While 启动车辆; 正常行车; 到站停车; 售票员的活动P2: While 关车门; 售票; 开车门; 为了安全起见,显然要求:(1)关车门后方能启动车辆

12、;(2)到站停车后方能开车门。 答:定义两个信号量,一个信号量start表示是否允许司机启动车辆,另一个信号量open表示是否允许售票员开车门。初始状态是车停在始发站,车门开着,等待乘客上车。因此,两个信号量的初值都是0。 semaphore start=0; semaphore open=0; 司机的活动P1: 售票员的活动P2: while(1) while(1) P(start); 关车门; 启动车辆; V(start); 正常行车; 售票; 到站停车; P(open); V(open); 开车门; 5.18 考虑一个理发店,只有一个理发师,只有N张可供顾客等待理发的椅子,如果没有顾客,

13、则理发师睡觉;如果有一顾客进入理发店发现理发师在睡觉,则把他叫醒,试用信号量设计一个协调理发师和顾客的程序。 答:题目中要求描述理发师和顾客的行为,因此需要两类进程Barber 和Customer分别描述理发师和顾客的行为。当理发师睡觉时顾客进来需要唤醒理发师为其理发,当有顾客时理发师为其理发,没有的时候理发师睡觉,因此理发师和顾客之间是同步的关系,由于每次理发师只能为一个人理发,且可供等侯的椅子有限只有n个,即理发师和椅子是临界资源,所以顾客之间是互斥的关系。 引入3个信号量和一个控制变量: 1)控制变量waiting记录等候理发的顾客数,初值均为0; 2)信号量customers记录等候理

14、发的顾客数,并用作阻塞理发师进程,初值为0; 3)信号量barbers记录正在等候顾客的理发师数,并用作阻塞顾客进程,初值为0; 4)信号量mutex用于互斥,初值为1. PV操作代码如下: int waiting=0; /等候理发的顾客数 int chairs=n; /为顾客准备的椅子数 semaphore customers=0, barbers=0,mutex=1; barber while(TRUE); /理完一人,还有顾客吗? P(cutomers); /若无顾客,理发师睡眠 P(mutex); /进程互斥 waiting = waiting-1; /等候顾客数少一个 V(barbe

15、rs); /理发师去为一个顾客理发 V(mutex); /开放临界区 cut-hair( ); /正在理发 customer P(mutex); /进程互斥 if (waitingchairs) waiting= waiting+1; / 等候顾客数加1 V(customers); /必要的话唤醒理发师 V(mutex); /开放临界区 P(barbers); /无理发师, 顾客坐着养神 get-haircut( ); /一个顾客坐下理发/ else V(mutex); /人满了,走吧! 5.19 进程之间有哪些基本的通信方式?它们分别有什么特点?适用于哪些场合? 答:进程通信根据交换信息量的

16、多少分为高级通信和低级通信。低级通信一般只传送一个或几个字节的信息,以达到控制进程执行速度的作用;高级通信则要传送大量数据,目的不是为了控制进程的执行速度,而是为了交换信息。 高级进程通信方式有很多种,大致可归并为三类:共享存储器、管道文件和消息传递。 共享存储器:在内存种分配一片空间作为共享存储区。需要进行通信的进程把它附加到自己的地址空间中,不需要时则把它取消。 管道文件:它是连接两个命令的一个打开文件。一个命令向该文件中写入数据,为写者;另一个命令从该文件中读出数据,为读者。 消息传递:它以消息为单位在进程间进行数据交换。 5.20 试比较进程间的低级通信工具与高级通信工具。 答:用户用

17、低级通信工具实现进程通信很不方便,因为其效率低,通信对用户不透明,所有的操作都必须由程序员来实现。而高级通信工具则可弥补这些缺陷,用户可直接利用操作系统所提供的一组通信命令,高效地传送大量的数据。 5.21 试用信箱通信方式解决生产者消费者问题。 答:在本题解决方案中,使用了两个信箱mayproduce和mayconsume,两个信箱的大小均为N,即其中最多可以存放N条消息。当生产者生产了数据时,它将数据作为消息发送到信箱mayconsume,只要该信箱中有一条消息,消费者就可以开始消费。信箱mayproduce最初填满了空消息,空消息的条数等于信箱的容量与mayconsume信箱中消息条数之

18、差(其作用类似于用信号量机制解决生产者一消费者问题中的empty)。当生产者向消费者发送一条消息时,mayproduce信箱中的消息条数减少,mayconsume信箱中的消息条数增加;当消费者接收一条消息时,mayconsume信箱中的消息条数减少,而mayproduce信箱中的消息条数增加。系统中的消息总条数保持不变。 const int capacity=N; /*N为信箱容量*/ null=.; /*这里“.”为空消息*/ int i; main( ) /*主程序*/ create_mailbox(mayproduce); /*创建信箱 mayproduce*/ create_mailb

19、ox(mayconsume); for(i=1; i=capacity; i+) send(mayproduce, null); cobegin producer( ); consumer; coend producer( ) /*生产者进程*/ message pmsg; /* message 为消息类型*/ while (true) receive(mayproduce, pmsg); /*等待空消息*/ pmsg=produce; /*生产一条消息*/ send(mayconsume, pmsg); consumer( ) /*消费者进程*/ message cmsg; while (t

20、rue) receive(mayconsume, cmsg); consume(cmsg); /*取出一条消息供消费*/ send(mayproduce, null); 5.22 在消息传递通信方式下: (1)发送进程和接收进程在通信过程中可以采用哪3种同步方式? (2)试以下面给出的发送进程和接收进程(将接收到的数据存入S)为例,说明当接收进程执行到标号为L2的语句时,采用这3种同步方式,X的值可能各是多少? 发送进程P: M=10; L1:sendMTOQ; L2:M=20; GotoLl; 接收进程Q: S=-100; L1:receiveSfromP; L2:X=S+1; 答: 发送进

21、程阻塞,接收进程阻塞。 发送进程不阻塞,接收进程阻塞。 发送进程不阻塞,接收进程也不阻塞。 (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。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号