background image

如何解决死锁问题

 

原理:产生死锁的原因主要是

 

因为系统资源不足。

 

进程运行推进的顺序不合适。

 

资源分配不当等。

 

如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就
会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。

死锁的条件

互斥条件(

Mutual exclusion):资源不能被共享,只能由一个进程使用。

请求与保持条件(

Hold and wait):已经得到资源的进程可以再次申请新的资源。

非剥夺条件(

No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。

循环等待条件(

Circular wait):系统中若干进程组成环路,改环路中每个进程都在等待相

邻进程正占用的资源。

处理死锁的策略

1.忽略该问题。例如鸵鸟算法,该算法可以应用在极少发生死锁的的情况下。为什么叫鸵鸟
算法呢,因为传说中鸵鸟看到危险就把头埋在地底下,可能鸵鸟觉得看不到危险也就没危
险了吧。跟掩耳盗铃有点像。

2.检测死锁并且恢复。

3.仔细地对资源进行动态分配,以避免死锁。

4.通过破除死锁四个必要条件之一,来防止死锁产生。

有两个小组对同一个软件进行测试(测试的时间不清楚,软件的规模不清楚),

A 组

测试出

50 个 Bug;B 组测试出 55 个 Bug,提交汇总后发现其中有 25 个是相同的;我的问

题是:请你估算一下这个软件还有多少个

Bug 没被发现?

 

   听一个同事说有次面试的时候主考官给他出了这样一道题,正好在很久以前看到过类似

的资料,这里给大家共享出来,看看这种算法合理不。

 

  先说这个问题的答案是 30,怎么算出来的呢?可以按照下面的公式:

  可以估计出的软件的缺陷共有:50*55/25=110 个

  目前已经发现的有:50+55-25=80 个

  没有发现的 bug 有:110-80=30 个

 

  这个公式又是怎么得出来的呢,可以看看下面的推导过程: