什么是死锁
死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象。若无外力作用,它们都将无法推进下去。
![](https://img-blog.csdnimg.cn/img_convert/d9d0b040e75316358ba27d443bddd7b3.png)
产生死锁的四个必要条件得烂熟于心
互斥条件:进程要求对所分配的资源进行排他性控制,即在一段时间内某资源仅为一个进程所占用。此时若有其他进程请求该资源,则请求进程只能等待。
不剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放。
请求和保持条件:进程已经保持保持了至少一个资源但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
循环等待条件:存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被链中下一个进程所请求。
相应的,如果想在程序运行之前预防发生死锁(也称为“死锁预防”),必须设法破坏产生死锁的四个必要条件之一。
破坏产生死锁的四个必要条件
破坏互斥条件:允许系统资源都能共享使用,则系统不会进行死锁状态。这种方案不太可行,因为有些资源根本就不能同时访问,比如打印机。
破坏不剥夺条件:当一个已经保持了某些不可剥夺资源的进程,请求新的资源时得不到满足,它必须释放已经保持的所有资源,待以后需要时再重新申请。这种方法常用于状态易于保存和恢复的资源,如CPU的寄存器及内存资源,一般不能用于打印机之类的资源。
破坏请求和保持条件:采用预先静态分配方法,即进程在允许前一次申请完他所需要的全部资源,在它的资源未满足前,不把它投入运行。一旦运行后,这些资源就一直归它所有,也不再提出其他资源请求,这样,就可以保证系统不会发生死锁。
破坏循环等待条件:采用顺序资源分配法。首先给系统中的资源编号,规定每个进程,必须按编号递增的顺序请求资源,同类资源一次申请完。也就是说,只要进程提出申请分配资源,则该进程在以后的资源申请中,只能申请编号比之前大的资源。