死锁

死锁

关于死锁这个问题,其实在面试当中已经是被问了很多次了,(到目前为止应该是3次),每次问到的时候都说的不是很满意,虽然都没有怎么说错,但也没有让面试官非常满意,确实也是因为在实际的编程当中没有怎么遇到死锁的情况。今天状态恢复,又把现代操作系统的书重新翻出来把死锁这一节又详细的看了一看。

什么是死锁

面试的时候如果问道死锁,这一般就是第一个问题。

说的简单一点,就是进程(线程)之间互相等待,都不能执行。具体来说,死锁有下面4个条件:

  1. 互斥,资源只能被一个(一般来说,有限个)
  2. 持有并等待,进程持有资源并要进行等待
  3. 资源无法从外部释放,只能由拥有它的进程释放
  4. 循环等待

怎么解决死锁

其实并没有特别好的方法,主要有以下几种策略

  1. 置之不理,这种就不细说了。
  2. 检测并处理,可以使用资源图来检测死锁,来从死锁当中恢复的方法大概有以下几种:(1)回滚,(2)kill掉进程
  3. 死锁避免,有个银行家算法,需要知道未来的锁的申请情况,在实际上就是天方夜谭
  4. 死锁预防,主要是避免死锁形成的条件,主要有两种比较可行的方法,第一是一次性获得所需要的锁,第二是按照一定的顺序来获取锁,比如优先级从大到下,这样能够保证不形成循环等待,在以往的面试当中,似乎是这一点一直没有答出来。

除了上面的这些方法,还有其他一些特定的方法,比如二阶段上锁,先对所有的需要的资源进行加锁,如果这一步无法完成,就把已经加的锁全部释放掉,然后重新尝试加锁,这种方法在数据库当中使用的比较多。在一次面试当中,我也答出了这一点,但是面试官似乎不是很以为然。