码迷,mamicode.com
首页 > 系统相关 > 详细

进程间通信(一):竞争条件与相互排斥方案

时间:2017-08-15 10:00:31      阅读:287      评论:0      收藏:0      [点我收藏+]

标签:共享数据   未能   共享   http   周期性   条件   term   不为   原因   

                                进程间通信(一):进程之间的冲突与处理方式

                                                           ——《现代操作系统第二章第三节》

     1、问题的提出

     我们想象一个假脱机打印程序。当一个进程须要打印一个文件时,它会将该文件放在一个假脱机文件夹下。还有一个进程负责周期性地检查是否有文件须要被打印,如果有就打印并将其在文件夹中删除。

简单设想。脱机文件夹中有非常多槽位,每一个槽位中存放文件名称,如果它们有两个共享的变量:out,指向下一个要被打印的文件;in,指向下一个空暇的槽位。

如图,下一个被打印的应该是4号槽,下一个入队的应该是7号槽。

                                      技术分享

      如今,如果进程A、B将把文件A、B入队,如果A先读到的信息是7,而且A将7存入自己的一个记忆变量中,而这时,系统觉得已经分给了A足够的时间,于是中断A切换置进程B。进程读到的信息是7,将7存入自身的一个记忆变量中,并将int更新至8。至此B已经完毕了全部的入队操作。转而去干其它的事情。当A继续运行时。它还觉得应该将文件存到7号槽。于是A文件成功地覆盖住了B文件,而我们的B文件,永远都不会被打印。问题就出现了。

      2、抽象一些概念

      竞争条件:类似于上述情况,即两个或者多个进程读写某些共享数据。而最后的结果取决于进程的执行的精确时序,称为竞争条件。

(把条件理解成情况,竞争情况,貌似更加easy理解一些=。=)

      相互排斥:相互排斥是一种手段。它使共享数据的进程无法同一时候对其共享的数据进行处理。

      临界区:即訪问共享内存的程序片。也就是说,通过合理的安排。使得两个进程不可能同一时候处在临界区中,就能避免竞争条件。

      忙等待:连续測试一个变量直至某值出现位止。(如语句while(t!=0){},那么当t不为零时。while()之后的语句将永远不会运行,这样的情况书中好像也叫挂起)

      自旋锁:用于忙等待的锁。(在3-(3)中,turn即使自旋锁)

             

          3、忙等待的相互排斥(几种实现相互排斥的方法)

         (1)屏蔽中断

          原理:进程进入临界区后马上屏蔽全部中断,离开后打开中断。

          缺点:a、多核的系统无效(其它进程任然能够占用其它的CPU继续訪问公共内              

                   存)

                b、用户程序来控制中断会非常危急(使想一下。一个进程屏蔽中断后不再       

                   打开中断。那你的系统就GG了)

          结论:屏蔽中断对系统本身是一项非常实用的技术。但对用户进程不是一种合适的

                通用相互排斥机制。

         (2)锁变量

          原理:屏蔽中断的软件实现机制。

                假定一个共享(锁)变量,初值为0。代表临界区内无进程,进程进入临                

             界区后将其改变为1,代表临界区内有进程;倘若进程在进入临界区之前。              

             锁变量值为1。该进程将等待其值变为0。

未能实现的原因:与假脱机文件夹的疏漏一样。假设一个进程进入临界区,可是在       

             它把锁变量置1之前被中断,还有一个进程进入临界区后将0置1,这样。

             当前一个进程再次执行时它也将锁变量置1,这样临界区内依旧存在两

             个进程。

         (3)严格轮换

          原理:共享turn变量。用来记录轮到那个进程进入临界区。

                   技术分享

           当turn=0时,仅仅有进程0能进入临界区,进程0在离开临界区前将turn 

              置1。从而标志。轮到进程1进入临界区。

           缺点:严格地轮换,可能导致临界区外的进程堵塞须要进入临界区的进程(例 

               如:当turn=0时。意味着仅仅有进程0能进入临界区,这时假设进程0还要

               100年才会进入临界区,而进程1须要立即进入,那进程1还要白白等100 

               年.)

          总结:当一个进程比还有一个进程慢了很多的情况下,不宜用这样的方式。

         (4)Peterson解法

          这是Peterson本人发明的一种简单的相互排斥算法。

 

             技术分享    

          我们分情况跑一遍程序:

          a、进程0通过调用enter_region()进入临界区。此时1也想调用enter_region() 

         来进入临界区。但interested[0]为TRUE,因此被while循环挂起,当进程0出临

         界区时调用leave_region()。将interested[0]设为FALSE,进程1就可以及时进入临界

         区。

          b、当进程0在调用enter_region()过程的随意时刻被中断,进程1进入临界区

          后进程0再次进行时,依旧会被挂起。(实际上while循环体中的两条推断句就 

          保证了,当一个进程在临界区中时,还有一个想进入临界区的进程必定会被挂起)。

 

         (5)TSL指令

          原理简述:

          TSL(test and set lock),是十分适合多处理器计算机实现相互排斥的硬件支持。它会 

         在一个进程进入临界区时。锁住内存总线,从而禁止其它CPU在本指令结束之前 

         訪问内存。

         对于TSL指令,本文之做简单的原理性描写叙述(尽管老师上课讲的比較具体),想进

         一步了解关于TSL指令,能够看一下书中本节内容,有具体阐述。

    4、综述

        要想拟定一个方案,使它既能避免竞争条件,又能保证进程执行与协作的效率,必需要满足4个条件。

         (1)、不论什么两个进程不能同一时候处于临界区

         (2)、不应对CPU的速度和数量做不论什么假定

         (3)、临界区外执行的进程不能堵塞其它进程

         (4)、不得使进程无限期等待进入临界区

    (下图为避免竞争条件的模型图)

 

            技术分享

 

进程间通信(一):竞争条件与相互排斥方案

标签:共享数据   未能   共享   http   周期性   条件   term   不为   原因   

原文地址:http://www.cnblogs.com/brucemengbm/p/7363100.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!