zoukankan      html  css  js  c++  java
  • 进程间通信(一):竞争条件与相互排斥方案

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

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

         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)、不得使进程无限期等待进入临界区

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

     

                

  • 相关阅读:
    SCI写作经典替换词,瞬间高大上!(转)
    最佳化常用测试函数 Optimization Test functions
    算法复杂度速查表
    VS 代码行统计
    CPLEX IDE 菜单栏语言设置( 中文 英文 韩文 等多国语言 设置)
    如何从PDF文件中提取矢量图
    Matlab无法打开M文件的错误( Undefined function or method 'uiopen' for input arguments of type 'char)
    visual studio 资源视图 空白 解决方案
    MFC DialogBar 按钮灰色不响应
    嗨翻C语言笔记(二)
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/7363100.html
Copyright © 2011-2022 走看看