管程

#引入原因

  • 解决信号量机制编程麻烦,易出错的问题
  • #组成

  • 像极了C++和java里的类
  • 将共享资源(类成员)及其操作(public函数)封装为一体,自动保证互斥访问,程序员无需显式编写互斥代码;
  • 通过条件变量实现灵活的进程同步,有效降低死锁风险
  • #管程与进程的区别

  • 1.进程拥有私有数据结构(PCB),而管程管理的是公共数据结构
  • 2.进程执行通用计算任务,而管程专注于同步控制与资源管理
  • 3.引入进程是为了实现并发,而引入管程是为了解决共享资源互斥访问
  • 4.进程是主动执行的实体,而管程是被调用的模块,即进程通过调用管程中的过程来操作共享数据
  • 5.多个进程可并发执行,但对于同一管程的多个调用是互斥的,即同一时刻仅一个进程可在改管程内执行
  • 6.进程具有动态的生命周期,而管程是操作系统中的静态资源管理模块,仅供进程调用
  • #条件变量

  • 进程进入管程后,若因条件不足需要等待,必须释放对管程的占用,故引入条件变量
  • 条件变量将不同的阻塞原因分别抽象为独立的条件变量
  • 条件变量仅支持两种操作:wait,signal
  • 如设置一个条件变量x
  • x.wait,即x代表的条件不满足,当前执行管程的进程调用x.wait就会将自己加入x的等待队列
  • x.signal,即x代表的条件发生变化(可能满足)时,调用x.signal,唤醒x等待队列下的一个进程
  • **条件变量与信号量比较
  • 相似点
  • wait/signal操作和P/V操作均能实现进程的组赛和唤醒
  • 不同点
  • 信号量具有整数值,反映可用资源量,而条件变量不维护数值,仅用于线程排队和通知
  • 在管程中,条件变量只负责通知,资源数量变更有共享变量(某个类成员数据)显示记录