死锁
腾讯一面被问到死锁的问题,回答不好,基础知识还不够扎实
没有牛逼的项目,没有牛逼的获奖经历,那就需要好的发指的基础来撑了
补一下基础:
在计算机系统中有很多独占性资源,在任一时刻它们都只能被一个进程使用
大部分死锁跟资源相关。资源分为可抢占资源和不可抢占资源,总的来说,死锁和不可抢占资源有关。因为可抢占资源潜在的死锁通常可以通过在进程之间重新分配资源而化解。所以重点应该是不可抢占资源。
若请求资源不可用时,则请求进程被迫等待。
进程A获取资源1,进程B获取资源2,然后每个进程都想请求另一个资源就会被阻塞,那么,每个进程都会运行不了了。这种情况就是死锁。
所以,对于死锁定义就是,在一个进程的集合中,每一个进程都在等待,没有一个进程可以唤醒其他进程。所有的进程就会无限地等待下去了。
大多数是情况下,每个进程都在等待另一个死锁进程已经占有的资源。这种死锁称为资源死锁。
死锁的条件
- 互斥条件。
- 占有和等待条件。
- 不可抢占条件
- 循环等待条件
!!!以上四个条件一定是同时满足的!
处理死锁的策略
忽略该问题。鸵鸟算法
检测死锁和恢复
检测,假如每种资源只有一个类型,可以用资源分配图
假如每种类型多个资源,就要用到一种基于矩阵的算法了
至于恢复,可以利用抢占恢复,但是主要取决于资源本身的特性。通过回滚恢复,周期性地对进程进行检查点检查。实际上是恢复到更早的状态,那时候还没有取得所需的资源。最简单直接的方法就是杀死一个或若干个进程。
对资源谨慎分配,动态地避免死锁。最著名的就是银行家算法。
破坏死锁条件的至少一个
互斥,一切都使用假脱机(虚拟)技术
占有且等待,一开始就请求所有的资源
不可抢占条件,抢占资源
循环等待,对资源进行编号,按顺序执行
通信死锁
进程A向进程B发送请求信息,然后阻塞直到进程B回复。假设请求消息丢了,A阻塞等待恢复,而B会阻塞等待一个请求消息,因此也会发生死锁。
解决方法就是:超时机制
活锁
轮循用于进入临界区或者存取资源
假如进程A进入临界区1,进程B进入临界区2。
那么进程A要轮循等待进入临界区2,而进程B也轮循等待进入临界区1
一个进程消耗玩cpu的时间片就轮到另一个进程使用cpu。它们不会阻塞,但是也不会有进展。因为没有阻塞,所以不算死锁。这种就是活锁。
饥饿
永远得不到服务,尽管它没有阻塞
(解决方法:先来先服务)