操作系统之死锁概述与银行家算法

来源:互联网 发布:日常喝的红酒推荐 知乎 编辑:程序博客网 时间:2024/05/18 05:20

资源问题

1 可重用性资源和消耗性资源

1)可重用性资源可供用户多次使用,
a只能分配给一个进程使用,不允许多个进程共享
b使用的时候遵循以下步骤:请求资源,使用资源,释放资源
没一类可重用性资源单元数目固定,进程不能创建或删除

2)可消耗性资源,临时资源,由进程动态创建和消耗.如进程见通信的消息

2可抢占性资源和不可抢占性资源
1)可抢占性资源某进程获得这类资源后,该资源可以被其他进程或系统抢占如CPU,内存
2)不可抢占性资源系统分配给进程后,不能收回,只能自行释放如打印机,刻录机

3计算机中的死锁

1 )竞争不可抢占性资源
打印机
2) 竞争可消耗性资源
如2个进程都接受对方的消息后再发送消息.会死在接受消息
3)进程推进顺序不当
对资源的申请和释放顺序是否合法也会引起死锁.
如当p1p2 一个requestr1,一个requers r2 就会进入不安全区可能进入死锁

死锁的定义,必要条件和处理方法

1 死锁的定义
一组进程发生死锁的情况下,这组死锁进程的每一个进程,都在等待另一个死锁进程所占有的资源.则:如果每一组进程中的每一个进程都在等待该组其他进程才能引发的事件,就是死锁.

2 产生死锁的必要条件
1)互斥条件
2)请求和保持条件
3) 不可抢占条件
4)循环等待条件

3 处理死锁的方法
1) 预防死锁 :设置限制条件破坏产生死锁四个必要条件中的一个或几个来预防死锁
2)避免死锁:在资源动态分配过程中,用某种方法防止系统进入不安全状态,从而可以避免死锁.
3) 检测死锁:通过检测机构即使地检测出死锁的发生,然后采取相应的措施,把金策划嗯从死锁中解脱出来.
4)解除死锁:撤销进程,回收资源,非陪给已处于死锁的进程

预防死锁

1 破坏请求保持条件

  • 规定一次性申请完所有资源后,不再申请(1 资源被严重浪费 2 进程发生饥饿现象)
  • 允许,获得运行初期的资源后,开始运行,运行中,逐步释放已经分配给自己的用玩的全部资源后再次申请新的资源.
    第二种方法不仅能是进程更快完成人物,提高设备利用率,还可以减少进程中饥饿的发生机率.

2破坏不可抢占条件
当一个保持了某些不可被抢占的资源,必须释放已经保持的所有资源,意味着进程占有的资源会被暂时释放,或者被”抢占”了.的那时不仅延长了进程周转周期,增加了系统开销,降低了系统吞吐量,

3 破坏循环等待条件
为每个资源类型编号,编号取决于大部分系统的申请顺序,如果某进程已经请求到了比较高序号的资源,请求低序号资源的时候,必须先释放资源.优点:系统资源利用率和系统吞吐量都有明显的改善.但是序号必须相对稳定,序号不合理会造成资源的浪费,不方便用户.

避免死锁

1 系统安全状态
系统进行资源分配的时候,应先计算资源分配的安全性,如果导致系统进入不安全状态,才可将资源分配给进程,否则,令进程等待.避免死锁的基本思想:确保系统始终处于安全状态.
2 利用银行家算法避免死锁
1) 先确定新进的进程可能需要每种资源类型的最大单元数目.(小于系统所拥有的资源总量)
2)进程请求一组资源的时候系统确定是否有足够的资源分配给该进程.

    如果有,这些资源分配给进程后,是否会是系统进入不安全状态?        不会,分配资源        会 让进程等待

3 银行家算法的数据结构
1 )可利用资源向量(Available) m数组,每一个元素代表可用资源的数量
2 )最大需求矩阵(Max) n*m矩阵 n个进程中的每一个进程对m类资源的最大需求数量
3 )分配矩阵(Allocation)n*m表示某一个进程一获得资源数量
4 )需求矩阵(Need) n*m 还需要某一个资源的数量

4 银行家算法
设Requesti 是进程Pi的请求向量,如果Requesti[j] = K,表示Pi需要K个Rj类型资源,当Pi请求后:
1) 如果Requesti[j]<=Need[i,j] ,进入步骤2,否则认为出错
2)如果Requesti[j]<=Available[i,j],转向步骤3,否则表示尚无足够资源 Pi等待.
3)系统试探吧资源分配给Pi,修改一下数值:

Avaliable[j] = Avalibale[j] - Requesti[j]Allocation[i,j] = Allocation[i,j]+Requesti[j]Need[i,j] = Need[i,j] - Requesti[j]

4)系统执行安全性算法,检查是否处于安全状态,是,分配,否本次试探分配作废.

5 安全性算法:
1)设置两个向量 工作向量 Work,表示系统可提供给进程继续运行所需的资源数目,有m个元素,执行安全算法开始时,Work = Available, Finish 表示系统是否有足够的资源分配给进程是指运行完成, 开始时先做Finish[i] = false;足够资源分配给进程时,令Finish[i] = True
2)从进程集合中找到一个能满足下述条件的进程:

finish[i] = falseNeed[i,j]<=Work[j]

若找到,执行步骤3 否则执行步骤4
3) 当进程Pi获得资源后,可顺利执行,直至完成,比不过释放出非陪给他的资源:

Work[j] = Work[j]+Allocation[i,j];Finish[i] = truego to step 2

4) 所有进程的Finish[i] = True 都满足,则表示系统处于安全状态,否则不安全;

死锁的检测与解除

1 死锁的检测
1)保存有关资源的请求和分配信息
2)提供一种算法利用这些信息检测系统是否进入死锁状态.
????

原创粉丝点击