一、死锁
死锁:由于竞争资源或者通信关系,两个或多个进程在执行中出现永远互相等待有其他进程引发的事件。例如,在上文的生产者和消费者问题中,若是s1和s2的初值同时设为0,则会出现生产者等待消费者消费,消费者等待生产者生产,出现了永远互相等待,即死锁。
二、资源分类与分配
资源可分为:
- 可重用资源
- 资源不能被删除且在任何时刻只能有一个进程使用
- 进程释放资源后可被重用
- 可能出现死锁(每个进程占用一部分资源并请求其他资源)
- 消耗资源
- 资源被创建和销毁
- 可能出现死锁(进程互相等待对方的消息,消息即消耗资源)
资源分配实例:
P1:等待R1,占用R2的一个实例,需要等待P2释放R1
P2:等待R3,占用R1和R2的另一个实例,需要等待P3释放R3
P3:等待R2,占用R3,需要等待P1或者P2释放R2的一个实例,但P1需要等待P2
不难看出,P2和P3在互相等待,出现死锁。
P1:等待R1,占用R2的一个实例,需要等待P2或P3释放R1
P2:占用R1,无需等待
P3:等待R2,占用R1的一个实例,需要等待P1或P4释放R2
P4:占用R2,无需等待
可以看出,只要P2/P4释放资源后,P1/P3就可以占用R1/R2资源进行执行,有循环等待,但没有所死。
三、死锁的出现条件与处理方法
以上资源分配的例子可以看出,死锁出现的四个必要条件:
- 互斥
- 持有并等待(占有资源且等待资源)
- 非抢占(资源只能由进程使用完后自主释放)
- 循环等待(e.g p0等待p1,p1等待p2,p2等待p0)
死锁处理方法:
- 预防:限制并发进程对资源的请求,是系统在任何时刻都不满足死锁的必要条件。(比如,把互斥的共享资源封装为可同时访问;进程不持有资源,开始执行时直接请求到所有资源等)该处理方法的问题是,会破坏很多进程管理的原有机制,如进程互斥访问共享资源的机制。
- 避免(再分配资源先判断是否会出现死锁)——>银行家算法
- 要求进程声明需要资源的最大数目(单次借款最大数)
- 限制提供与分配的资源数量,只确保满足进程的最大需求(借款限额度)
- 动态检查资源分配状态,确保不会出现循环等待
- 检测和恢复(在检测到锁死之后进行恢复,但通常操作系统选择忽略,需要使用者自己杀死进程)
四、系统资源分配的安全状态与银行家算法
系统资源分配的安全状态: