死锁
由于两个或者两个以上的(进程)去抢夺一份资源而造成阻塞的状态叫做死锁,
如果出现了死锁,会造成线程的循环等待,如果没有外力的帮助,就会一直维持着某种状态
死锁的产生
死锁的产生有如下四个必要条件
1. 资源是互斥的,同一时刻只能有一个进程占有该资源
2. 资源的释放只能有该进程自己完成
3. 线程在获取到需要资源之前,不会释放已有资源
4. 存在这么一条循环等待的队列,线程T1,T2,T3…, Tn
T1持有自己的资源请求T2的资源,….Tn持有自己的资源请求T1的资源
典型的问题例如哲学家饥饿问题,在我另一片博客有提到,感兴趣的话不妨看看:
使用信号量解决哲学家饥饿问题
处理死锁的方式
死锁的预防
其实死锁的4个发生条件都是必要条件,也就是说4个条件缺一不可,我们可以通过破坏其中任意一个条件来预防死锁
#### 1.破坏资源的互斥性
这是不可能滴,在访问临界资源时,至少要保证对资源的访问是互斥的,例如一台打印机在任意一时刻只能打印一个文件
2.破坏不可抢占的条件
允许其他资源对资源的抢夺
方案 1.在该方案下,如果占有某些资源的进程在进一步申请资源被拒绝后,就必须释放原本占有的资源,如果有必要,则可以再次申请这些资源或者另外资源
方案 2. 如果一个进程请求当前被另一个进程占有的资源,则操作系统可以抢占另一个进程,要求它释放资源.当然这必须是在两个不同优先级的进程才能生效