死锁:两个或两个以上进程由于竞争资源导致进程无法继续推进下去的现象。
具体的说是,进程A、B都需要x,y资源,A先持有了x资源,然后请求y资源,B先持有了y资源,然后请求x资源。这样的话两个进程都需要对方手中的资源才能继续进行,形成了环状。
死锁产生的四个必要条件:
互斥条件:资源是互斥的,被进程独享。
保持与请求条件:进程持有了一些资源,当继续请求其他资源时,不会放弃持有的资源。
不可剥夺条件:进程在没有执行完之前,持有的资源不能被其他进程强行剥夺,只能自己主动释放。
循环等待条件:发生死锁时一定存在一个资源请求环,比如a请求b的资源,b请求c的资源,c请求a的资源。
死锁的预防:
破坏保持与请求条件:
1.进程在请求新的资源时要放弃持有的其他资源,即使这些资源很快就会用到。(破坏保持)
2.进程在创建时就分配给它在运行中所需要的全部资源。(破坏请求)
破坏不可剥夺条件:
进程请求资源被拒绝时,就会释放所有的资源,进入等待状态,只有在重新获得之前的资源及需要的资源才能重新执行。
破坏循坏等待条件:
给系统内资源编号,只有获得低级编号的资源才能申请高级别编号的资源(将紧缺的、稀有的资源设置为高级别的)。
死锁的避免:银行家算法
银行家算法:
设置一个队列里边放着所有进程,进程都是运行的,持有资源,当进程A申请新的x资源时,会判断申请的x资源数量大于系统剩余数量,则不通过,如果小于系统剩余数量,则尝试分配给他,然后判断剩余的这类资源够不够队列中的某个B进程使用,如果可以,则标记B,然后判断B执行完回收的x资源和剩下的x资源够不够队列中某个进程使用,够的话则标记,重复刚才的步骤,如果整个队列中的进程都被标记了,则证明是安全的,就把这个x资源分配给A进程。
原文:https://www.cnblogs.com/gmzqjn/p/11794588.html