死锁:
死锁是指两个或者两个以上的线程在执行过程中,由于竞争资源而造成的的阻塞问题。若无外力作用下,它们将无法推进下去。此时,系统处于死锁状态。
产生原因:
(1)因竞争资源产生死锁;
(2)进程推进顺序不当发生死锁。
出现死锁的必要条件:
(1)互斥条件:资源每次只能是一个线程使用。
(2)请求与保持条件:一个线程因请求资源而阻塞时,对已经获取的资源保持不放。
(3)不可剥夺条件:线程已经获取到的资源,在未使用之前,不能被强行剥夺。
(4)循环等待条件:若干线程间形成一种头尾相连接的循环等待资源关系。
死锁的预防或解除
解决死锁的途径:预防、避免、检测和恢复
(1)预防死锁(破坏4个必要条件)
1、资源一次性分配(破坏请求与保持条件)
2、可剥夺资源:在线程未满足条件时,释放掉已经占有的资源
3、资源有序分配:系统给每类资源赋予一个编号,每个线程按照编号递增的顺序请求资源,释放相反。
(2)避免死锁(银行家算法)
允许线程动态地申请资源。
系统在资源分配之前,先计算资源分配的安全性。如果此次分配不会导致系统进入不安全状态,就给该线程分配该资源,否则等待。
(3)检测与接触死锁
当线程发现进入死锁了,立即从死锁状态解除掉。
剥夺资源:从其他线程处剥夺足够多的资源,给死锁进程,来免除死锁状态。