管程——封装思想
- 引入:信号量机制存在问题——编程程序困难,易出错——比如互斥信号量设置时,如果PV顺序不当,会导致"死锁问题"
- 管程时一种特殊的软件模块,有这些部分组成:
- 局部于管程的共享数据结构说明
- 对之前数据结构进行操作的一组过程(函数)
- 对局部于管程的共享数据设置初始值的语句
- 管程有一个名字
- 管程的基本特征
- 局部于管程的数据只能被局部于管程的过程所访问
- 一次进程只有通过调用管程内的过程才能进入管程访问共享数据
- 每次仅允许一个进程在管程内执行某个内部过程
- 生产消费者管程问题:
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VuqUEqzW-1595644346740)(http://cdn.comewei.xyz/qiuniuimg/管程.PNG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6iCtDIBF-1595644346742)(http://cdn.comewei.xyz/qiuniuimg/管程1.PNG)]
特点:
- 目的:更加方便实现进程互斥和同步
- 在管程中定义共享数据——生产消费者问题的缓冲区
- 需要在管程中定义用于访问这些共享数据的入口
- 只有通过这些特定的"入口"才能访问共享变量
- 管程中有很多"入口",但是每次只能开放其中一个"入口",并且只能让一个进程或则线程进入——这种互斥特性是由编译器负责实现的,程序员不用关心
- 可在管程中设置条件变量及等待/唤醒操作以解决同步问题。可以让一个进程或线程在条件变量下等待
Java中类似管程机制
- 如果使用synchronized来描述一个函数,那么这个函数同一时间段只能被一个线程调用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c73DBKvb-1595644346748)(http://cdn.comewei.xyz/qiuniuimg/管程整体.PNG)]
死锁
-
概念:各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进的现象
-
必要条件
- 互斥条件:只有必须互斥使用的资源的争抢才会导致死锁,不用内存、扬声器这样可以同时让多个进程使用的资源不会导致死锁的(因为进程不用阻塞等待这种资源)
- 不剥夺条件:进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放
- 请求和保持条件:进程已经保持了至少一个资源,但是又提出新的资源请求,而该资源又被其他进程占有。此时进行阻塞,但又对自己已有的资源保持不放
- 循环等待条件:存在一种资源的循环等待,联众的每一个进程已获得资源同时被下一个进程所请求——死锁的必要不充分条件。如果同类资源大于1,即使有循环等待,也未必发生死锁。但是只有一个,则循环等待是发生死锁的充分必要条件
-
死锁的处理策略
- 预防死锁——破坏死锁产生的四个必要条件之一
- 避免死锁,用某个方法防止系统进入不安全状态,从而避免死锁——银行家算法
- 死锁的检测和解除。与性能死锁的发生,不过OS会负责检测出死锁的发生,然后采取某种措施解除死锁
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bnQ0gP9J-1595644346751)(http://cdn.comewei.xyz/qiuniuimg/死锁.PNG)]
预防死锁
-
互斥条件
-
破坏不可剥夺条件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q9Mrsh1B-1595644346752)(http://cdn.comewei.xyz/qiuniuimg/破坏不可剥夺资源.PNG)]
-
破坏请求和保持条件
-
破坏循环等待条件
避免死锁
安全序列:如果系统按照这种序列分配资源,则每个进程都能顺利完成。只要可以找到一个安全序列,系统就是安全状态。否则就是不安全状态。
系统处于安全状态、就一定不会发生死锁。但是如果系统处于不安全状态,可能会发生死锁
在资源分配之前先判断这次分配是否会导致系统进入不安全状态,以此决定是否答应资源分配请求——银行家算法的核心思想
死锁的检测
- 在资源分配图中,找出既不阻塞又不是孤点的进程 P i P_i Pi。消除他所有的请求边和分配边,设其称为孤点
- 进程 P i P_i Pi所释放的资源,可以唤醒某些因等待这些资源而阻塞的进程,原来阻塞进程可能变成非阻塞进程。如果最后不存在边,则称该图为可简化图
- 简化后如果还存在边,就应该立即解除死锁
- 资源剥夺法
- 撤销进程法(终止进程法)
- 进程回退法
- 进程优先级
- 已执行时间
- 还需要多久完成
- 进程已经使用了多少资源
- 进程是交互式的还是批处理的