进程互斥

1010 篇文章 11 订阅
831 篇文章 15 订阅

进程互斥

目录

定义
实现进程互斥

编辑本段定义

  两个或两个以上的进程,不能同时进入关于同一组共享变量的临界区域,否则可能发生与时间有关的错误,这种现象被称作进程互斥.   在多道程序环境下,存在着 临界资源,它是指多进程存在时必须互斥访问的资源。也就是某一时刻不允许多个进程同时访问,只能单个进程的访问。我们把这些程序的片段称作临界区或临界段,它存在的目的是有效的防止竞争条件又能保证最大化使用共享数据。而这些并发进程必须有好的解决方案,才能防止出现以下情况:多个进程同时处于临界区,临界区外的进程阻塞其他的进程,有些进程在临界区外无休止的等待。除此以外,这些方案还不能对CPU的速度和数目做出任何的假设。只有满足了这些条件,才是一个好的解决方案。   访问临界资源的循环进程可以这样来描述:   Repeat   entry section   Critical sections;   exit section   Remainder sectioni;   Until false

编辑本段实现进程互斥

  为实现进程互斥,可以利用软件的方法,也可以在系统中设置专门的同步机制来协调多个进程,但是所有的同步机制应该遵循四大准则:   1.空闲让进 当临界资源处于空闲状态,允许一个请求进入临界区的进程立即进入临界区,从 而有效的利用资源。   2.忙则等待 已经有进程进入临界区时,意味着相应的临界资源正在被访问,所以其他准备进 入临界区的进程必须等待,来保证多进程互斥。   3.有限等待 对要求访问临界资源的进程,应该保证该进程能在有效的时间内进入临界区,防 止死等状态。   4.让权等待 当进程不能进入临界区,应该立即释放处理机,防止进程忙等待。   早期解决进程互斥问题有软件的方法和硬件的方法,如:严格轮换法,Peterson的解决方案,TSL指令,Swap指令都可以实现进程的互斥,不过它们都有一定的缺陷,这里就不一一详细说明,而后来Dijkstra提出的信号量机制则更好的解决了互斥问题。   解决进程互斥还有管程,进程消息通信等方式。

4.5 进程互斥

4.5.1 资源共享所引起的制约

  在计算机系统中,由于资源有限而导致了进程之间的资源竞争和共享,因此,进程的并发执行不仅仅是用户程序的执行开始时间的随机性和提高资源利用率的结果,也是资源有限性导致资源的竞争与共享对进程的执行过程进行制约所造成的。那么,在进程的并发执行过程中存在哪些制约呢?


    
4.5.1.1临界区
    
我们在描述一个程序或算法时,总是认为存在一个伪处理机,可以按程序或算法所规定的步骤来执行该程序或算法的。但是,事实上,在实际的系统中则往往不 是这样。这里来看下面的例子:
   
     设有两个计算进程PA、PB共享内存MS。其中MS分为三个领域,即系统区、进程工作区和数据区。这里数据区被划分大小相等的块,每个块中既可能放有数据,也有可能未放有数据。系统区主要是堆栈S,其中存放那些空数据块的地址。

 

图   多进程共享内存栈区示例

    当进程PA或PB要求空数据块时,从堆栈最顶部(top指针所指的位置)取出所需数据块。当进程PA或PB释放数据块时,则把所释放数据块的地址放入堆栈顶部。getspace为取空数据块过程,release(ad)为释放数据块过程。这里,ad为待释放数据块的地址,如果堆栈S非空的话,进程PA或PB是可以用任意的顺序释放和获取数据块的。执行getspace就是获取一个空数据,而执行release(ad)就是释放一个地址为ad的数据块,然而,由下面的描述可以看到,在进程并发执行时,getspace或release(ad)将有可能完不成所要求的功能。
    getspace和release(ad)可进一步描述为:


        

  getspace: begin local g
              
                                g<--stack[top]
                               
top<--top-1

           end

release(ad): begin

                            top<--top+1
                            stack[top]<--ad
           end

设时刻t0时,top=h0,则getspace和release(ad)可能按以下顺序执行:

首选release(ad)的第一句执行,

      t0:top<--top+1 -->top=ho+1;

接着 getspace执行,得:

         t1:g<--stack[top] -->g=stack[h0+1];

         t2:top<--top-1 -->top=h0;

再是release(ad)的第二句执行,得:

         t3:stack[top]<--ad -->stack[h0]<--ad;

其结果是调用getspace的进程取到的是h0+1中的一个未定义值,而调用release(ad)的进程把所有释放的空块ad重复了h0中。

如果将getspace和release(ad)抽象为两个各以一个动作完成的顺序执行单位,那么执行结果的正确性是可以保证的。
  
   临界区
critical section)我们把不允许多个并发进程交叉执行的一段程序称为临界部分(critical section)或临界区(critical region)。
临界区是由属于不同并发进程的程序段共享公用数据或公用数据变量而引起的。临界区也可以被称为访问公用数据的那段程 序。

4.5.1.2 间接制约

   间接制约indirect condition)是指被制约进程共享某个一次只能供一个进程使用的系统资源,只有得到该资源的进程才那继续往前执行,其他进程在获得资源进程执行期间不允许交叉执行。

4.5.1.3  什么是互斥
  
   互斥
:一组并发进程中的一个或多个程序段,因共享某一公有资源而导致它们必须以一个不允许交叉执行的单位执行。也就是说,不允许两个以上的共享该资源的并发进程同时进入临界区称为互斥。

    一组并发进程互斥执行时必须满足如下准则:

²    不能假设各并发进程的相对执行速度。即各并发进程享有平等的、独立的竞争共有资源的权利,且在不采取任何措施的条件下,在临界区内任一指令结束时,其它并发进程可以进入临界区。

²    并发进程中的某个进程不在临界区时,它不阻止其它进程进入临界区。

²    并发进程中的若干个进程申请进入临界区时,只能允许一个进程进入。

²    并发进程中的某个进程申请进入临界区时开始,应在有限时间内得以进入临界区。

4.5.2 互斥的加锁实现

要实现互斥,一种可能的办法是对临界区加锁以实现互斥。当某个进程进入临界区之后,它将锁上临界区,直到它退出临界区时为止。并发进程在申请进入临界区时,首先测试该临界区是否是上锁的。如果该临界区已被锁住,则改进程要等到该临界区开锁之后才有可能获得临界区。
    设临界区的类名为s。为了保证每一次临界区中只能有一个程序段被执行,又设锁定位key[s]。key[s]表示该锁定位属于类名为s的临界区。加锁后的临界区程序描述如下:

lock(key[S])

<临界区>

unlock(key[S])

  设key[S]=1时表示类名为S的临界区可用,key[S]=0时表示类名为S的临界区不可用。则,unlock(key[S])只用一条语句即可实现。即:

key[S]<--1

  不过,由于lock(key[S])必须key[S]=0时,不允许任何进程进入临界区,而key[S]=1时仅允许一个进程进入临界区的准则,因而实现起来较为困难。

一种简便的实现方法是:

lock(x)=begin local v

repeat

v<--x

until v=1

x<--0

end

不过,这种实现方法是不能保证并发进程 互斥执行所要求的准则(3)的。

这里,有一点需要注意的是:在系统实现是锁定位key[S]问题总是设置在公有资源所对应的数据结构中的。

 

  

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值