管程
#引入原因
解决信号量机制编程麻烦,易出错的问题
#组成
像极了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操作均能实现进程的组赛和唤醒
不同点
信号量具有整数值,反映可用资源量,而条件变量不维护数值,仅用于线程排队和通知
在管程中,条件变量只负责通知,资源数量变更有共享变量(某个类成员数据)显示记录