
王道操作系统笔记视频链接2.4.2 死锁的处理策略—预防死锁知识总览死锁的处理不允许死锁发生静态策略预防死锁本节重点破坏互斥条件破坏不剥夺条件破坏请求和保持条件破坏循环等待条件动态策略避免死锁允许死锁发生死锁的检测和解除知识回顾死锁的产生必须满足四个必要条件只要其中一个或者几个条件不满足死锁就不会发生。破坏互斥条件互斥条件只有对必须互斥使用的资源的争抢才会导致死锁。如果把只能互斥使用的资源改造为允许共享使用则系统不会进入死锁状态。比如SPOOLing技术操作系统可以采用 SPOOLing 技术把独占设备在逻辑上改造成共享设备。用SPOOLing技术将打印机改造为共享设备改造前进程1还没用完打印机之前进程2申请使用打印机会阻塞改造后使用了SPOOLing技术后在各进程看来自己对打印机资源的使用请求立即就被接收处理了由输出进程接收然后按顺序处理不需要再阻塞等待SPOOLing技术会在之后章节讲解。缺点并不是所有的资源都可以改造成可共享使用的资源。并且为了系统安全很多地方还必须保护这种互斥性。因此很多时候都无法破坏互斥条件。破坏不剥夺条件不剥夺条件进程所获得的资源在未使用完之前不能由其他进程强行夺走只能主动释放。破坏不剥夺条件方案一当某个进程请求新的资源得不到满足时它必须立即释放保持的所有资源待以后需要时再重新申请。也就是说即使某些资源尚未使用完也需要主动释放从而破坏了不可剥夺条件。方案二当某个进程需要的资源被其他进程所占有的时候可以由操作系统协助将想要的资源强行剥夺。这种方式一般需要考虑各进程的优先级比如剥夺调度方式就是将处理机资源强行剥夺给优先级更高的进程使用也就是要么主动释放要么被动释放被剥夺缺点实现起来比较复杂。释放已获得的资源可能造成前一阶段工作的失效。因此这种方法一般只适用于易保存和恢复状态的资源如CPU。反复地申请和释放资源会增加系统开销降低系统吞吐量。若采用方案一意味着只要暂时得不到某个资源之前获得的那些资源就都需要放弃以后再重新申请。如果一直发生这样的情况就会导致进程饥饿。破坏请求和保持条件请求和保持条件进程已经保持了至少一个资源但又提出了新的资源请求而该资源又被其他进程占有此时请求进程被阻塞但又对自己已有的资源保持不放。可以采用静态分配方法即进程在运行前一次申请完它所需要的全部资源在它的资源未满足前不让她投入运行。一旦投入运行后这些资源就一直归它所有该进程就不会再请求别的任何资源了。举个例子原来要A和B资源系统检查有A就给A有B就给B该方法要A和B资源系统检查如果AB都有那就都给如果一者没有或都没有那么进程A和B都拿不到也就是要么不拿要么全拿缺点①有些资源可能只需要用很短的时间因此如果进程的整个运行期间都一直保持着所有资源就会造成严重的资源浪费资源利用率极低。②另外该策略也有可能导致某些进程饥饿。比如C类进程要资源1和2A类进程要资源1B类进程要资源2只要A和B源源不断C就可能被饿死和前面破坏不剥夺条件方法一的区别举例说明如果进程需要进行两步第一步只要A资源第二步A和B资源都要那么前面的方法一就是刚开始进程拿到A了就走了第一步第二步想要B发现没有就把之前的A也释放了后续需要重新申请A和B。而该方法是最开始就需要把A和B都拿到开始后A和B都不释放要进程运行完了才释放如果最开始就没拿到A和B那么就不开始。破坏循环等待条件循环等待条件存在一种进程资源的循环等待链链中的每一个进程已获得的资源同时被下一个进程所请求。可采用顺序资源分配法。首先给系统中的资源编号规定每个进程必须按编号递增的顺序请求资源同类资源即编号相同的资源一次申请完。也就是如果要两只筷子那么两只筷子需要一次性申请不能先拿一只再拿另一只原理分析一个进程只有已占有小编号的资源时才有资格申请更大编号的资源。按此规则已持有大编号资源的进程不可能逆向地回来申请小编号的资源从而就不会产生循环等待的现象。比如进程需要资源1、2、3那么申请资源2、3之前必须占用了资源1。假设系统中共有10个资源编号为1, 2, … 10在任何一个时刻总有一个进程拥有的资源编号是最大的那这个进程申请之后的资源必然畅通无阻。因此不可能出现所有进程都阻塞的死锁现象缺点不方便增加新的设备因为可能需要重新分配所有的编号进程实际使用资源的顺序可能和编号递增顺序不一致会导致资源浪费比如资源2是扫描仪资源1是打印机进程要先用扫描仪扫描再用打印机打印但是因为打印机顺序优先所以进程申请扫描仪前需要先申请打印机此时打印机就会被占用但是不会被使用造成资源浪费必须按规定次序申请资源用户编程麻烦。比如对于不同系统扫描仪和打印机的编号顺序不同程序代码也需要按顺序修改很不方便。知识回顾与重要考点