死锁
文章来自 shichang // Welcome!
主页
|
About Me
|
归档
|
标签
### 计算机资源 计算机中的资源分为两种:可抢占资源和不可抢占资源。 如果进程之间都是可抢占的资源那么无论如何都不会发生死锁。可抢占资源表示将资源从该进程手中抢夺之后,系统不会因此发生紊乱。(有一种重要性的感觉,说明该资源对该进程的重要性不高,并且该进程应有被抢占的处理方案)。 <br> ### 死锁的描述 1. 通过有向图描述资源的使用和被占用的情况 2. 通过资源需求矩阵,和资源拥有矩阵,资源可用矩阵 <br> ### 死锁产生的必要条件 - 资源的有限性和独占性() - 持有等待(在请求新的资源时,已持有的不会释放) - 不可抢占 - 循环等待 睡眠和唤醒机制中,如果进程对另一个进程的唤醒消息因为某种原因(cpu的切换或者程序的设计bug)消失了,那么两个进程都将进行睡眠,互相等待唤醒,形成死锁。解决方法是使用信号量。 <br> ### 死锁的应对方法 思路一般分为两种: - 允许死锁发生,然后进行修复 - 不允许死锁发生,编写程序时尽可能地让死锁不发生 #### 允许发生: 无视死锁的发生,顺其自然(防止死锁发生的代价高于重启100次机器);2.死锁发生后采取措施进行修复 1. 无视(鸵鸟策略):普通的个人计算机操作系统如windows,linux,对实时性和可靠性的要求并不是非常高。即使某个程序出现了无响应也不会造成太大的损失,而对一些应用在重要场合的计算机和操作系统,对于可靠性和实时性的要求非常高,一次死锁的发生可能导致非常严重的损失,不能采用这种策略 2. 死锁发生后采取措施进行修复,分为两步,第一步检测已经发生的死锁,第二步,解决已经发生的死锁。 死锁的检测:矩阵算法,列出资源分配矩阵和资源等待矩阵,附加向量:系统资源总量向量和系统当前可用资源数量向量。根据这4个数据结构可以快速计算出系统当前是否可能发生死锁,但是并不是一定准确,并且检测死锁发生的进程也有可能会死锁,资源矩阵本身也会占用cpu。解决方法是将资源进行抢占,或者直接杀掉死锁进程。 #### 不允许发生: 先发制人 1. 动态避免:在进行资源分配时就进行严密的计算,保证该资源的请求批准后系统不会进入死锁状态或者不会进入潜在的死锁状态(尚未发生死锁,但接下来必定发生死锁)。 安全状态:能够找到一种分配方案使得程序的执行不会产生死锁 不安全状态:没有任何一种分配方案能使得接下来程序的执行不产生死锁。 问题:并不能事先预知程序需要的资源数量,程序一般会过度请求来保证自己可用性,每个都过度请求会造成浪费和死锁的提前到来。 2. 消除死锁的必要条件:
Pre:
关于java
Next:
mysql优化