产生死锁的四个条件
1.互斥: 资源x的任意一个时刻只能被一个线程持有
2.占有且等待:线程1占有资源x的同时等待资源y,并不释放x
3.不可抢占:资源x一旦被线程1占有,其他线程不能抢占x
4.循环等待:线程1持有x,等待y,线程2持有y,等待x
当全部满足时才会死锁
死锁的预防
1.破坏“互斥”条件:
就是在系统里取消互斥、若资源一般不被一个进程独占使用,那么死锁是肯定不会发生的,但一般“互斥”条件是无法破坏的。因此,在死锁预防里主要是破坏其他三个必要条件,而不去涉及破坏“互斥”条件
2.破坏“占有且等待”条件:
方法1:所有的进程在开始运行之前,必须一次性的申请其在整个运行过程各种所需要的全部资源
缺点:因为某项资源不满足,进程无法启动,而其他已经满足了的资源也不会得到利用,严重降低了资源的利用率,造成资源浪费
方法2:该方法是对第一种方法的改进,允许进程只获得运行初期需要的资源,便开始运行,在运行过程中逐步释放掉分配到,已经使用完毕的资源,然后再去请求新的资源。这样的话资源的利用率会得到提高,也会减少进程的饥饿问题
3.破坏"不可抢占"条件
当一个已经持有了一些资源的进程在提出新的资源请求没有得到满足时,它必须释放已经保持的所有资源,待以后需要使用的时候再重新申请。这就意味着进程已占有的资源会被短暂的释放或者说被抢占了
4.破坏“循环等待”条件:
采用资源有序分配其基本思想是将系统中的所有资源顺序编号,将紧缺的,稀少的采用较大的编号,在申请资源时必须按照编号的顺序进行,一个进程只有获得较小编号的进程才能申请较大编号的进程。
死锁避免
避免是指进程在每次申请资源时判断这些操作是否安全,典型算法是“银行家算法”。但这种算法会增加系统的开销
死锁的检测
判断系统是否处于死锁状态,如果是,则执行死锁解除策略
死锁解除
与死锁检测结合使用,它使用的方式就是剥夺。即将资源强行分配给别的进程
银行家算法
1、操作系统按照银行家指定的规则为进程分配资源,当进程首次申请资源时,需要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请资源分配资源,否则就推迟分配;
2、当进程在执行中继续申请资源时,先测试该进程本次申请的资源数,是否超过了该资源剩余的总量,若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。