浅谈操作系统中的死锁之二

上一篇简单介绍了OS中的死锁,今天分析死锁的解决方案。

预防死锁

预防死锁就要从死锁的四个必要条件入手,破坏了这四个条件中的一个或几个,就可以解决死锁。

破坏“请求和保持”条件

系统需要保证做到:当一个进程在请求资源时,它不能持有不可抢占资源。通过以下两种协议可以实现。

第一种协议

该协议规定,所有进程在开始运行之前,必须一次性地申请其在整个运行过程中所需的全部资源。此时若系统有足够的资源分配给某进程,便可把其所需要的所有资源分配给它。
该协议类似于单任务,简单易行安全,缺点就是浪费资源(给一个进程a分配资源,但是a的生命周期中,很多资源只有短时间用到),进程经常会发生饥饿现象。

第二种协议

第二种协议是对第一种协议的改进,它允许一个进程只获取初期所需的资源后,就开始运行。进程运行过程中再逐步释放已分配给自己且用毕的全部资源,然后请求新的所需资源。

破坏“不可抢占”条件

当一个已经保持某些不可抢占资源的进程,提出新要求但无法被满足的时候,它必须释放已经保持的所有资源,等以后需要时重新申请。
这种方法缺陷很大,因为某些不可抢占资源被中途释放,可能导致任务失败。而且可能会反复的申请与释放资源,导致进程被无限推迟。

破坏“循环等待”条件

操作系统对所有资源进行线性排序,进程申请资源必须按照序号从低到高进行申请,当进程占有高序号资源后,需要申请低序号资源A时,必须释放所有与A相同或更高序号的资源,从而破坏”循环等待“的条件。

避免死锁

在资源动态分配内存的过程中,防止系统进入不安全状态。

系统安全状态

安全状态

该方法允许进程动态申请资源,但系统在分配资源之前,应先计算此次资源分配的安全性。如果此次分配不会导致系统进入不安全状态,才可以分配成功。否则令进程等待。

银行家算法

每一个进程进入系统时,它必须申明运行过程中,可能需要的各种资源的最大单元数目,其数目不应超过系统所拥有的资源总量。系统会在进程申请资源时进行判断,先判断是否有足够的资源分配给该进程,再判断将资源分配出去后,系统会不会处于不安全状态。如果上述两个条件都满足,系统就将资源分配出去,否则让进程继续等待。

银行家算法中的数据结构

为了实现银行家算法,必须设置四个数据结构:

  1. 描述系统中可利用的资源

    可利用资源向量Available

  2. 所有进程对资源的最大需求

    最大需求矩阵Max

  3. 系统中的资源分配

    分配矩阵Allocation

  4. 所有进程还需要多少资源的情况

    需求矩阵Need

0%