zoukankan      html  css  js  c++  java
  • 第二章 信号量及条件变量(三)——> 重点

    2.4.4 信号量的应用

    1. 利用信号量实现进程互斥

      为使多个进程能互斥的访问某临界资源,只需为该资源设置一个互斥信号量mutex,并设置其初值为 1 ,然后讲个进程访问该资源的临界区CS置于wait(mutex)和signal(mutex)操作之间即可。

    • 利用信号量实现进程互斥,mutex作为互斥锁使用
    semaphore mutex=1; //只有一个资源
    void P1(void)
    {
          while(1)
          {
                P(mutex);  //当 mutex < 0 时停止
                      critical section // 进入临界区
                V(mutex); 
          }
    }
    void P2(void)
    {
          while(1)
          {
                P(mutex);
                      critical section
                V(mutex);
          }
    }
    

    (1)wait 和 signal必须成对出现
    (2)缺少 wait 会导致系统混乱,不能保证对临界区资源的互斥
    (3)缺少 signal 将会使临界资源永远不被释放,从而使因等待的资源阻塞进程不被唤醒


    2. 利用信号量实现前趋关系(同步关系)——>(自主命题常考前趋图)

      为实现先后执行 ——> 这种前趋关系,只需要使进程P1和P2共享一个公用信号量S,其初值为0将 signal 操作放在语句S1后面,而在S2语句前面插入 wait 操作。由于S被初始化为0,若P2先执行必定阻塞,只有在进程P1执行完S1、signal(S)后使S++,P2进程方能执行S2在执行S2前先等待,故初值为0做wait操作


    前趋图要点:首先,你要知道该进程被谁阻塞;其次,你要知道要唤醒哪个进程;


    2.4.5 管程机制(408出过2次选择,自主命题看学校

    1. 管程的定义(进程的秘书)

      用少量信息和对资源所执行的操作来表征该资源,而忽略它们的内部结构和实现细节。
      一个管程定义了一个数据结构和能为并发进程所执行的一组操作,这组操作能同步进程和改变管程中的数据


    1.1 管程四部分————> 类似C++中的类

    • 管程的名称;
    • 局部与管程的共享数据结构说明
    • 对该数据结构进行操作的一组过程
    • 对局部与管程的共享数据设置初值的语句
    Monitor monitor_name //管程名
    {
          share variable declarations;
          cond declarations;  //条件变量
    public:
          void P1(){} //PV操作
          void P2(){}
    {initialization code;//初始化} 
    }
    

    2.条件变量

      利用管程实现进程同步时,必须设置同步工具,如两个同步操作原语 wait 和 signal。
      当某进程通过管程请求获得临界资源而未能满足时,管程便调用 wait 原语使该进程等待,并将其排在等待队列上。仅当另一个进程访问完成并释放该资源后,管程才又调用signal原语,唤醒等待队列中的队首进程


    注意事项:
    (1)管程对每个条件变量,都须予以说明,其形式为:condition x,y
    (2)该变量应置于wait 和 signal 之前,可表示为X.wait 和 X.signal


    例如:由于共享数据被占用而使调用进程等待,该条件变量形式为:condition nonbusy
    wait 原语 ————> nonbusy.wait 或 cwait(nonbusy)
    signal 原语 ————> nonbusy.signal

    • X.signal 操作的作用:重启一个被阻塞的进程,如果没有被阻塞进程,则X.signal操作不产生任何后果。这与信号量机制中的signal操作不同,这是由于信号量机制总要执行s=s+1操作,总会改变信号量的状态。
    哪有什么胜利可言,坚持意味着一切
  • 相关阅读:
    Java中的位运算符、移位运算符
    数据结构——树
    Java Collections工具类
    Map集合
    博客园插入bilibili视频
    TreeSet练习 根据字符串长度排序
    Java Set集合
    规划极限编程读后感(3)
    规划极限编程读后感(2)
    规划极限编程读后感(1)
  • 原文地址:https://www.cnblogs.com/BY1314/p/12838342.html
Copyright © 2011-2022 走看看