zoukankan      html  css  js  c++  java
  • 信号量机制

    信号量和P、V操作

    *信号量:是一种特殊的数据结构。

    功能:表示资源的实体。例如:设mutex是一个信号量,它有两部分,分别是:mutex.value (数值)     mutex.L(指针)

    特殊之处:

      **每个信号量与一个队列关联

      **其值只能通过初始化和P、V操作来访问

    *信号量的类型

      **公用信号量:用于进程间的互斥,初值通常为1

      mutex.value=1;表示资源空闲,可供使用

            =0;表示资源已被占用,无其他等待进程

            =-n;表示资源已被占用,还有n个进程因等待资源而阻塞

      **私有信号量:用于进程间的同步,初值通常为0或n

    P、V操作(均是原语):

    P操作:请求分配一个单位资源

    P(S):   //S为信号量

    {

      S=S-1;

      if(S<0)

      {

      调用进程被阻塞

      进入S的等待队列

      }

    }

    V操作:释放一个单位资源

    V(S):  //S为信号量

    {

      S=S+1;

      if(S<=0)

      {

      从S的等待队列中唤醒一个进程

      使其进入就绪状态

      }

    }

    信号量及P、V操作的应用

    进程的互斥:

     

     进程的同步:

    利用信号量机制解决进程间的同步问题,这里以下图所示的计算进程c和打印进程P通过缓冲区Buffer传送数据的同步问题为例说明

    C和P进程算法如下:

    C:begin

         repeat

      Compute  next  nember;

      add to Buffer;

      until  false

    end

    P:begin

      repeat

      take from  Buffer;

      print  last  number;

      until  false

    end

    C和P两进程并发执行,必须在执行序列上遵循以下规则,才能避免错误。

      只有当C进程把数据送入Buffer后,P进程才能从Buffer中取出数据来打印,否则P进程只能等待。

      只有当P进程从Buffer中取走数据后,C进程才能将新计算的数据再存入Buffer,否则C进程也只能等待。 

    为了实现进程同步,需采用同步信号量。为了满足第一条同步规则,设置一个同步信号量full,它代表的资源是缓冲器满,它的初值为0.这个资源是P进程所拥有,P进程可以申请该资源,对它施加P操作,如条件满足P进程可从Buffer中取数。而P进程的合作进程C对full信号量施加V操作,即它可释放该资源。当C进程将数据存入Buffer后,即可释放该资源供P进程再使用。

    同样为了满足第二条同步规则,设置另一个同步信号量empty,它代表的资源是缓冲器空,它的初值为1.缓冲器空这个资源是进程C所拥有。它可以申请该资源,对它施加P操作。而它的合作进程P对empty信号量施加V操作。

    实现C和P两进程同步的类PASCAL程序:

    var: empty ,full:semaphore:=1,0;

    begin

      parbegin

       c:begin

      repeat

       Compute  next  number;

       P(empty);

       add to buffer;

       V(full);

       until false

      end

    P:begin

      repeat

       P(full)

        Take from  Buffer

      V(empty)

       Print  last  number

      until  false

     end

     parend

    end

  • 相关阅读:
    Java8性能优化之字符串拼接
    Java8字符串分割的几种方式及性能比较
    【Collections:集合工具类:常用方法】
    【ArrayList嵌套HashMap】
    【集合工具类:Collections】
    【HashMap 嵌套 HashMap】
    【HashMap 嵌套 ArrayList】
    【TreeMapDemo】
    【LinkedHashMap】
    【TreeMap】
  • 原文地址:https://www.cnblogs.com/fate-/p/12463601.html
Copyright © 2011-2022 走看看