ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:114.84KB ,
资源ID:6518099      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6518099.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(操作系统精髓与设计原理第5章 并发性互斥和同步.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

操作系统精髓与设计原理第5章 并发性互斥和同步.docx

1、操作系统精髓与设计原理第5章 并发性互斥和同步第五章 并发性:互斥和同步复习题:5.1列出与并发相关的四种设计问题答:进程间的交互,共享资源之间的竞争,多个进程的同步问题,对进程的处理器时间分配问题5.2列出并发的三种上下文答:多个应用程序,结构化应用程序,操作系统结构5.3执行并发进程的最基本要求是什么?答:加强互斥的能力5.4列出进程间的三种互相知道的程度,并简单地给出各自的定义。答:进程间互相不知道对方:这是一些独立的进程,他们不会一起工作。进程间间接知道对方:这些进程并不需要知道对方的进程ID号,但他们共享访问某些对象,如一个I/O缓冲区。进程间直接知道对方:这些进程可以通过进程ID号

2、互相通信,用于合作完成某些活动。5.5竞争进程和合作进程进程间有什么区别。答:竞争进程需要同时访问相同的资源,像磁盘,文件或打印机。合作进程要么共享访问一个共有的资源,像一个内存访问区,要么就与其他进程相互通信,在一些应用程序或活动上进行合作。5.6列出与竞争进程相关的三种控制问题,并简单地给出各自的定义。答:互斥:竞争进程仅可以访问一个临界资源(一次仅有一个进程可以访问临界资源),并发机制必须满足一次只有一个进程可以访问临界资源这个规则。死锁:如果竞争进程需要唯一的访问多于一个资源,并且当一个进程控制着一个进程,且在等待另一个进程,死锁可能发生。饥饿:一组进程的一个可能会无限期地拒绝进入到一

3、个需要资源,因为其他成员组成垄断这个资源。5.7列出对互斥的要求。答:1.必须强制实施互斥:在具有关于相同资源或共享对象的临界区的所有进程中,一次只允许一个进程进入临界区。2.一个在临界区停止的进程必须不干涉其他进程。3.绝不允许出现一个需要访问临界区的进程被无限延迟的情况,即不会饿死或饥饿。4.当没有进程在临界区中时,任何需要进入临界区的进程必须能够立即进入。5.对相关进程的速度和处理器的数目没有任何要求和限制。6.一个进程驻留在临界区中的时间是有限的。5.8在信号量上可以执行什么操作。答:1.一个信号量可以初始化成非负数。2.wait操作使信号量减1,如果值为负数,那么进程执行wait就会

4、受阻。3signal操作使信号量增加1,如果小于或等于0,则被wait操作阻塞的进程被解除阻塞。5.9.二元信号量与一般信号量有什么区别。答:二元信号量只能取0或1,而一般信号量可以取任何整数。5.10强信号量与弱信号量有什么区别。答:强信号量要求在信号量上等待的进程按照先进先出的规则从队列中移出。弱信号量没有此规则。5.11.什么是管程。答:管程是由一个或多个过程,一个初始化序列和局部数据组成的软件模块。5.12对于消息,有阻塞和无阻塞有什么区别?答:5.13.通常与读者-写者问题相关联的有哪些条件?答:1.任意多的读进程可以同时读这个文件,2.一次只有一个写进程可以往文件中写,3.如果一个

5、写进程正在往文件中写时,则禁止任何读进程读文件。习题:5.1答:b.协同程序read读卡片,将字符赋给一个只有一个字大小的缓冲区rs然后在赋给squash协同程。协同程序Read在每副卡片图像的后面插入一个额外的空白。协同程序squash不需要知道任何关于输入的八十个字符的结构,它简单的查找成对出现的星号,然后将更改够的字符串经由只有一个字符大小的缓冲sp,传递给协同程序print。最后协同程序print简单的接受到来的字符串,并将他们打印在包含125个字符的行中。5.2考虑一个并发程序,它有两个进程p和q,定义如下。A.B.C.D和E是任意的原子语句。假设住程序执行两个进程的parbegin

6、 Void p() void q() A; D; B; E; C; 答:ABCDE;ABDCE;ABDEC;ADBCE;ADBEC;ADEBC;DEABC;DAEBC;DABEC;DABCE;5.3考虑下面的程序 const int n=50; int tally;void total() int count; for(count =1;count =n;count +) tally+; void main() tally =0;parbegin(total(),total();write(tally); 答:a.随意一看,tally值的范围好像是落在50,100这个区间里,因为当没有互斥时可

7、以从0直接增加到50.这一基本论点是当并发的运行这两进程时,我们不可能得到一个比连续执行单一某进程所得tally值还低的一个最终tally值.但是考虑下面由这两进程按交替顺序执行载入,增加,存储的情况,同时变更这个共享变量的取值: 1.进程A载入tally值,tally值加到1,在此时失去处理器(它已经增加寄存器的值到1,但是还没有存储这个值). 2.进程B载入tally值(仍然是0),然后运行完成49次增加操作,在它已经将49这个值存储给共享变量tally后,失去处理器控制权. 3.进程A重新获得处理器控制权去完成它的第一次存储操作(用1去代替先前的49这个tally值),此时被迫立即放弃处

8、理器. 4.进程B重新开始,将1(当前的tally值)载入到它自己的寄存器中,但此时被迫放弃处理器(注意这是B的最后一次载入). 5.进程A被重新安排开始,但这次没有被中断,直到运行完成它剩余的49次载入,增加和存储操作,结果是此时tally值已经是50. 6.进程B在它终止前完成仅有的最后一次增加和存储操作.它的寄存器值增至2,同时存储这个值做为这个共享变量的最终结果. 一些认为会出现低于2这个值的结果,这种情况不会出现.这样tally值的正确范围是2,100. b.对一般有N个进程的情况下,tally值的最终范围是2,N*50,因为对其他所有进程来说,从最初开始运行到在第五步完成.但最后都

9、被进程B破坏掉它们的最终结果.5.4.忙等待是否总是比阻塞等待效率低(根据处理器的使用时间)?请解释。答:就一般情况来说是对的,因为忙等待消耗无用的指令周期.然而,有一种特殊情况,当进程执行到程序的某一点处,在此处要等待直到条件满足,而正好条件已满足,此时忙等待会立即有结果,然而阻塞等待会消耗操作系统资源在换出与换入进程上.5.5考虑下面的程序 boolean blocked2; int rurn; void P(int id) While (true) While(turn!=id); While(blocked1-!id /*do nothing*/; Turn =id; Void mai

10、n () Blocked0=false; Blocked1=false; Turn=0; Parbegin(P(0),P(1); 这是【HYMA66】中提出的解决互斥问题的一种方法。请举出证明该方法不正确的一个反例。答:考虑这种情况:此时turn=0,进程P(1)使布尔变量blocked1的值为true,在这时发现布尔变量blocked0的值为false,然后P(0)会将true值赋予blocked0,此时turn=0,P(0)进入临界区,P(1)在将1赋值给turn后,也进入了临界区.5.6解决互斥的另一种软件方法是lamport的面包店(bakery)算法,之所以起这个名字,是因为它的思想

11、来自于面包店或其他商店中,每个顾客在到达时都得到一个有编号的票,并按票号依次得到服务,算法如下: Boolean choosingn; Int numbern; While (true) Choosingi=true; Numberi=1+getmax(number,n); Choosingi=false; For(int j=0;jn;j+) While (choosingj) While (numberj!=0)&(numberj,j)(numberi,i) /*critical section*/ Numberi=0; /*remainder*/; 数组choosing和number分别

12、被初始化成false和0,每个数组的第i个元素可以由进程i读或写,但其他进程只能读。符号(a,b)(c,d)被定义成 (a,c)或(a=c且bd)A用文字描述这个算法。B说明这个算法避免了死锁。C说明它实施了互斥。答:a.当一个进程希望进入临界区时,它被分配一个票号.分配的票号是通过在目前那些等待进入临界区的进程所持票号和已经在临界区的进程所持票号比较,所得最大票号再加1得到的.有最小票号的进程有最高的优先级进入临界区.当有多个进程拥有同样的票号时,拥有最小数字号进入临界区.当一个进程退出临界区时,重新设置它的票号为0. b.如果每个进程被分配唯一的一个进程号,那么总会有一个唯一的,严格的进程

13、顺序.因此,死锁可以避免. c.为了说明互斥,我们首先需要证明下面的定理:如果Pi在它的临界区,Pk已经计算出来它的numberk,并试图进入临界区,此时就有下面的关系式: ( numberi, i ) ( numberk, k ).为证明定理,定义下面一些时间量: Tw1:Pi最后一次读choosingk, 当 j=k,在它的第一次等待时,因此我们在Tw1处有choosingk = false. Tw2:Pi开始它的最后执行, 当j=k,在它的第二次while循环时,因此我们有Tw1 Tw2. Tk1:Pk在开始repeat循环时;Tk2:Pk完成numberk的计算;Tk3: Pk设置ch

14、oosingk为false时.我们有Tk1Tk2Tk3.因为在Tw1处,choosingk=false,我们要么有Tw1Tk1,要么有Tk3Tw1.在第一种情况中,我们有numberinumberk,因为Pi在Pk之前被分配号码;这个满足定理条件.在第二种情况中,我们有Tk2 Tk3 Tw1 Tw2,因此有Tk2Tw2.这意味着在Tw2时,Pi已经读了当前numberk的值.而且,因为Tw2是当j=k第二次while循环执行发生的时刻,我们有(numberi, i ) ( numberk, k),这样完成了定理的证明.现在就很容易说明实施了互斥.假定Pi在临界区,Pk正试图进入临界区.Pk将不

15、能进入临界区,因为它会发现numberi不等于0,并且( numberi, i ) ( numberk, k ).5.7当按图5.2的形式使用一个专门机器指令提供互斥时,对进程在允许访问临界区之前必须等待多久没有控制。设计一个使用testset指令的算法,且保证任何一个等待进入临界区的进程在n-1个turn内进入,n是要求访问临界区的进程数,turn是指一个进程离开临界区而另一个进程获准访问这个一个事件。答:以下的程序由SILB98提供:var j: 0.n-1;key: boolean;repeatwaitingi := true;key := true;while waitingi and

16、 key do key := testset(lock);waitingi := false;j := i + 1 mod n;while (j i) and (not waitingj) do j := j + 1 mod n;if j = i then lock := falseelse waiting := false;Until这个算法用最普通的数据结构:var waiting: array 0.n 1 of boolean Lock:boolean这些数据结构被初始化成假的,当一个进程离开它的临界区,它就搜索waiting的循环队列5.8考虑下面关于信号量的定义: Void semW

17、ait(s) If (s.count0) s.count-; Else Place this process in s.queue; Block; Void semSignal(s) If (there is at liast one process blocked on semaphore) Remove a process P from s.queue; Place process P on ready list; Else s.count+; 比较这个定义和图5.3中的定义,注意有这样的一个区别:在前面的定义中,信号量永远不会取负值。当在程序中分别使用这两种定义时,其效果有什么不同?也就

18、是说,是否可以在不改变程序意义的前提下,用一个定义代替另一个?答:这两个定义是等价的,在图5.3的定义中,当信号量的值为负值时,它的值代表了有多少个进程在等待;在此题中的定义中,虽然你没有关于这方面的信息,但是这两个版本的函数是一样的。 5.9可以用二元信号量实现一般信号量。我们使用semWaitB操作和semSignalB操作以及两个二元信号量delay和mutex。考虑下面的代码 Void semWait(semaphor s) semWaitB(mutex); s-; if (s0) semSignalB(mutex); semWaitB(delay); Else Semsignalb(

19、mutex) Void semSignal(semaphore s); semWaitB(mutex); s+; if(s=0) semSignalB(delay); semSignalB(mutex); 最初。S被设置成期待的信号量值,每个semwait操作将信号量减1,每个semsignal操作将信号量加1.二元信号量mutex被初始化成1,确保在更新在更新s时保证互斥,二元信号量delay被初始化成0,用于挂起进程,上面的程序有一个缺点,证明这个缺点,并提出解决方案。提示:假设两个进程,每个都在s初始化为0时调用semwait(s),当第一个刚刚执行了semsignalb(mutex)但

20、还没有执行semwaitb(delay),第二个调用semwait(s)并到达同一点。现在需要做的就是移动程序的一行.答:假设两个进程,每个都在s被初始化成0时调用semWait(s),当第一个刚执行了semSignalB(mutex)但还没有执行semWaitB(delay)时,第二个调用semWait(s)并到达同一点。因为s=-2 mutex没有锁定,假如有另外两个进程同时成功的调用semSignal(s),他们接着就会调用semsignalb(delay),但是第二个semsignalb没有被定义。解决方法就是移动semWait程序中end前的else一行到semSignal程序中最后

21、一行之前。因此semWait中的最后一个semSignalB(mutex)变成无条件的,semSignal中的semSignalb(mutex)变成了有条件的。5.10 1978年,dijkstra提出了一个推测,即使用有限数目的弱信号量,没有一种解决互斥的方案,使用于数目未知但有限的进程且可以避免饥饿。1979年,j.m.morris提出 了一个使用三个弱信号量的算法,反驳了这个推测。算法的行为可描述如下,如果一个或多个进程正在semwait(s)操作上等待,另一个进程正在执行semsignal(s),则信号量s的值未被修改,一个等待进程被解除阻塞,并且这并不取决于semwait(s)。除了

22、这三个信号量外,算法使用两个非负整数变量,作为在算法特定区域的进程的计数器。因此,信号量A和B被初始化为1,而信号量M和计数器NA,NM被初始化成0.一个试图进入临界区的进程必须通过两个分别由信号量A和M表示路障,计数器NA和NM分别含有准备通过路障A以及通过路障A但还没有通过路障M的进程数。在协议的第二部分,在M上阻塞的NM个进程将使用类似于第一部分的串联技术,依次进入他们的临界区,定义一个算法实现上面的描述。答:这个程序由RAYN86提供:var a, b, m: semaphore;na, nm: 0 +;a := 1; b := 1; m := 0; na := 0; nm := 0;

23、semWait(b); na na + 1; semSignal(b);semWait(a); nm nm + 1;semwait(b); na na 1;if na = 0 then semSignal(b); semSignal(m)else semSignal(b); semSignal(a)endif;semWait(m); nm nm 1;if nm = 0 then semSignal(a)else semSignal(m)endif;5.11下面的问题曾被用于一个测试中:侏罗纪公园有一个恐龙博物馆和一个公园,有m个旅客和n辆车,每辆车只能容纳一名旅客。旅客在博物馆逛了一会儿,然后

24、派对乘坐旅客车。当一辆车可用时,它载入一名旅客,然后绕公园行驶任意长的时间。如果n辆车都已被旅客乘坐游玩,则想坐车的旅客需要等待;如果一辆车已经就绪,但没有旅客等待,那么这辆车等待。使用信号量同步m个旅客进程和n个进程。下面的代码框架是在教室的地板上发现的。忽略语法错误和丢掉的变量声明,请判定它是否正确。注意,p和v分别对应于semwait和semsignal。 Resource Jurassic_Park()Sem car_avail:=0,car_taken:=0,car_fillde:=0.passenger_released:=0Process passenger(i:=1 to nu

25、m_passengers) Do true-nap(int(random(1000*wander_time) P(car avail);V(car_taken);P(car_filled) P(passenger_released) Od End passenger Process car(j:=1 to num_cars) Do true-V(car_avail);P(car_taken);V(car_filled) Nap(int(random(1000*ride_time) V(passenger_released) Od End car End Jurassic_Park答:这段代码有

26、一个重要问题.在process car中的代码 V(passenger_released)能够解除下面一种旅客的阻塞,被阻塞在P(passenger_released)的这种旅客不是坐在执行V()的车里的旅客.5.12在图5.9和5.3的注释中,有一句话是“仅把消费者临界区(由s控制)中的控制语句移出还是不能解决问题,因为这将导致死锁”,请用类似于表5.3的表说明。答:ProducerConsumersndelay11002SemWaitB(S)0003n+0104If(n=1)(semSignalB(delay)0115semSignalB(s)1116semWaitB(delay)1107

27、semWaitB(s)0108n-009semWaitB(s)If(n=0) (semWaitB(delay)10生产者和消费者都被阻塞。5.13考虑图5.10中定义的无限缓冲区生产者/消费者问题的解决方案。假设生产者和消费者都以大致相同的速度运行,运行情况如下: 生产者:append;semSignal;produce;append;semSignal 消费者:consume;take;semWait;consume;take;semWait;生产者通常管理给换成区一个元素,并在消费者消费了前面的元素后发信号。生产者通常添加到一个空缓冲去中,而消费者通常取走缓冲区中的唯一元素。尽管消费者从不

28、在信号量上阻塞,但必须进行大量的信号量调用,从而产生相当多的开销。构造一个新程序使得能在这种情况下更加有效。提示:允许n的值为-1,这表示不仅缓冲区为空,而且消费者也检测到这个事实并将被阻塞,直到生产者产生新数据。这个方案不需要使用图5.10中的局部变量m。答:这个程序来自于BEN82program producerconsumer;var n: integer;s: (*binary*) semaphore (:= 1);delay: (*binary*) semaphore (:= 0);procedure producer;beginrepeatproduce;semWaitB(s);a

29、ppend;n := n + 1;if n=0 then semSignalB(delay);semSignalB(s)foreverend;procedure consumer;beginrepeatsemWaitB(s);take;n := n 1;if n = -1 thenbeginsemSignalB(s);semWaitB(delay);semWaitB(s)end;consume;semSignalB(s)foreverend;begin (*main program*)n := 0;parbeginproducer; consumerparendend.5.14考虑图5.13.如果发生下面的交换,程序的意义是否会发生改变?a.semWait(e);semWait(s)b.semSignal(s);semSignal(n)c.semWait(n);semWait(s)d.semSignal(s);semSignal(e)答:只要交换顺序都会导致程序错误。信号量s控制进入临界区,你只想让临界区区域包括附加或采取功能。5.15在讨论有限缓冲区(见图5.12)生产者/消费者问题时,注意我们的定义允许缓冲区中最多有n-1个入口? a.这是为什么? b.请修改程序,以不久这种低调?答:如果缓冲区可以容纳n个入口,问题在于如何从一个满

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1