第二章 信号量及条件变量(三)——> 重点

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操作,总会改变信号量的状态。
哪有什么胜利可言,坚持意味着一切
原文地址:https://www.cnblogs.com/BY1314/p/12838342.html