操作系统--第三章处理机调度与死锁_2

死锁

定义: 如果一组进程中的每个进程都在等待仅由该组进程中的其他进程才能引发的事件,那么该组进程是死锁的.

产生死锁的必要条件:

  1. 互斥条件:进程对分配到的资源进行排他性的使用.
  2. 请求和保持条件:进程已经保持了至少一个资源,因为对另一个资源申请时被阻塞同时保持当前持有资源的占用.
  3. 不可抢占条件: 进程已经获得的资源在使用完之前仅能由自己释放而不能被其他进程抢占.
  4. 循环等待条件:在发生死锁时肯定存在一条 进程–资源 的循环链.即P1等待P2占用的资源,P2等待P3的资源…Pn等待P1占用的资源.

四个条件缺一不可,当条件均满足时构成死锁

处理死锁的方法:

  • 预防死锁
  • 避免死锁
  • 检测死锁
  • 解除死锁
    这四种方式逐次对死锁的防范降低,但是资源的利用率逐次提高,进程因资源而阻塞的频率下降.

预防死锁 预防死锁的主要思路就是破坏4条死锁条件的任意一个,但互斥条件是非共享设备必须的,故从其他三点入手.

  • 破坏"请求和保持"条件.
    即使系统做到:当一个进程请求资源时,他必须不能持有不可抢占的资源.
    由此有两种协议:

    1. 所有进程在开始之前一次性申请所有所需的资源。这种方式简单易行且安全,但资源被严重浪费且易发生饥饿现象.由此有第二种协议.
    2. 在第一种协议的基础上做出了改进:允许资源申请初期运行所需资源后便可进行,在申请新的资源之前要将之前申请的释放掉.
  • 破坏"不可抢占"条件
    当一个保持了不可抢占的资源的进程申请新的资源而不能被满足时,他必须释放自己已保持的全部资源.该方法实现复杂且代价极高,部分不可抢占资源(如打印机)被中断后意味着之前的工作进度将会全部丢失.

  • 破坏"循环等待"条件
    对系统所有资源进行编号,线性排序,所有进程对资源的申请必须按编号有小到大申请.这种方法效率比前两种明显提高但是对用户施加了过多的限制条件,且有可能使作业使用资源的顺序与规定顺序不符造成资源的浪费.

避免死锁在动态分配资源的过程中,通过对系统的状态判断来决定是否分配资源来避免死锁.

–安全状态:指存在一种以上的推进进程的顺序(分配资源的方法),使每个进程都可顺利完成.称该推进进程的顺序为"安全序列".
只要系统一直处于安全状态便可以避免发生死锁,但是不安全的状态不一定发生了死锁,但最后一定会走向死锁.

在建立了系统安全状态的概念后,便可得出避免死锁的方法:每个进程告知系统自己所需的总资源,每当一个进程请求一个资源时便计算一次分配后是否还处于安全状态,只有分配后依然处于安全状态时才会分配资源.

-.—银行家算法:
数据结构:当前可利用资源/最大需求资源量/持有资源量/需求资源量
算法步骤如下:
1. 当进程P提出一个请求need,如果need<=需求资源量则转2,否则认为出错,其申请的资源量超过了他所声明的最大值 .
2. 如果need<=可用资源量,则转3,否则当前无足够资源进行分配,让P等待.
3. 系统试探性的分配给P资源,检查分配后:当前可利用资源是否能够满足至少一个进程的需求资源量,如果是则分配给P,否则试探分配作废,回复原来状态并使P等待.

猜你喜欢

转载自blog.csdn.net/qq_39560579/article/details/83106647
今日推荐