资源分类:
1.可重用性资源和可消耗性资源
1)可重用性资源:可供用户重复多次使用的资源。性质如下:
a只能分配给一个进程使用,不允许多个进程共享
b使用的时候遵循以下顺序:请求资源,使用资源,释放资源
c系统中每一类可重用性资源单元数目固定,进程不能创建或删除它
2)可消耗性资源:又称为临时性资源。在程序运行期间,由进程动态地创建和消耗。性质如下:
a.每一类可消耗性资源单元数目在程序运行期间不断变化。
b.进程在运行期间,可以不断创造
c.进程在运行过程中,可以请求若干个可消耗性资源单元,用于进程自己的消耗,不返回给资源类中。
可消耗性资源通常由生产者进程创建,由消费者进程消耗。最典型的可消耗性资源:进程间通信的消息。
2.可抢占性资源和不可抢占性资源
1)可抢占性资源:某进程获得这类资源后,该资源可以被其他进程或系统抢占。如CPU,主存。
2)不可抢占性资源:系统分配给进程后,不能强行收回,只能进程用完后自行释放。如磁带机,打印机,刻录机。
3计算机中的死锁
产生死锁的原因:
1 )竞争不可抢占性资源
进程P1打开了文件F1,同时进程P2打开了文件F2,然后P1再又去试图打开F2,而P2去试图打开F1,这两个进程都会因文件已被打开而阻塞,他们希望对方关闭自己所需要的文件,但谁也无法运行, 因此这两个进程将会无期限等待下去,而形成死锁。
2) 竞争可消耗性资源
如3个进程都接受对方的消息后再发送消息.会死在接受消息,等待一条永远不会发出的消息。
3)进程推进顺序不当
对资源的申请和释放顺序是否合法也会引起死锁.
如当p1p2 一个request R1,一个requers R2 就会进入不安全区可能进入死锁
死锁的定义,必要条件和处理方法
1 死锁的定义
如果每一组进程中的每一个进程都在等待仅由该组其他进程才能引发的事件,就是死锁。
2 产生死锁的必要条件
1)互斥条件
2)请求和保持条件
3)不可抢占条件
4)循环等待条件
3.环路与死锁:
若无环路,则不会死锁
若死锁,则必有环路
若有环路,则不一定死锁
4.处理死锁的四种方法
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] = false
Need[i,j]<=Work[j]
若找到,执行步骤3 否则执行步骤4
3) 当进程Pi获得资源后,可顺利执行,直至完成,比不过释放出非陪给他的资源:
Work[j] = Work[j]+Allocation[i,j];
Finish[i] = true
go to step 2
4) 所有进程的Finish[i] = True 都满足,则表示系统处于安全状态,否则不安全;
死锁的检测与解除
1 死锁的检测
1)保存有关资源的请求和分配信息
2)提供一种算法利用这些信息检测系统是否进入死锁状态.