操作系统(8)---死锁

发布时间 2023-10-19 14:18:26作者: 小光翎

一、死锁

死锁:由于竞争资源或者通信关系,两个或多个进程在执行中出现永远互相等待有其他进程引发的事件。例如,在上文的生产者和消费者问题中,若是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)

死锁处理方法:

  • 预防限制并发进程对资源的请求,是系统在任何时刻都不满足死锁的必要条件。(比如,把互斥的共享资源封装为可同时访问;进程不持有资源,开始执行时直接请求到所有资源等)该处理方法的问题是,会破坏很多进程管理的原有机制,如进程互斥访问共享资源的机制。
  • 避免(再分配资源先判断是否会出现死锁)——>银行家算法
    • 要求进程声明需要资源的最大数目(单次借款最大数)
    • 限制提供与分配的资源数量,只确保满足进程的最大需求(借款限额度)
    • 动态检查资源分配状态,确保不会出现循环等待
  • 检测和恢复(在检测到锁死之后进行恢复,但通常操作系统选择忽略,需要使用者自己杀死进程)

四、系统资源分配的安全状态与银行家算法

系统资源分配的安全状态: