关于计算机系统的死锁

计算机系统产生死锁的根本原因是资源有限且操作不当。
     一种原因是系统提供的资源太少了,远不能满足并发进程对资源的
需求。这种竞争资源引起的死锁是我们要讨论的核心。另一种原因是由 于进程推进顺序的不合适引发的死锁。
   产生死锁的四个必要条件:
    1、互斥条件:在一段时间内,一个资源只能由一个进程独占使用,若别的进程也要求该资源,则须等待直至其占用者释放;
    2. 不可抢占条件:进程所获得的资源在未使用完毕之前,资源申请
者不能强行从资源占有者手中夺取资源,而只能有该资源的占有者自行
释放;

    3.占有且申请条件:进程至少已经占有一个资源,但又申请新的资

源;由于该资源已被另外的进程占用,此时该进程阻塞;但是它在等待

新资源时,仍继续占用已占有的资源;
    4.循环等待条件:存在一个等待进程集合{P0,P1, …,Pn},P0正在

等待一个P1占用的资源,P1正在等待一个P2占用的资源,…,Pn正在等

待一个由PO占用的资源,形成一个进程等待环。

 

解决死锁的基本策略:
   一是鸵鸟策略。鸵鸟策略,即一种不理睬死锁的策略。像鸵鸟那样把

头埋在沙子里,装住毫无问题。
   二是预防策略。采用的办法是破坏产生死锁的四个必要条件中的一个

或多个,向进程施加适当的限制,使系统绝不会进入死锁状态。

   三是避免策略。产生死锁的四个必要条件有可能成立,但在资源动态分配的过程中使用某种办法防止系统进人安全和死锁状态。
    四是检测和解除。允许系统产生死锁,然后使用检测算法及时地发现并解除它。
 

预防死锁的基本思想是打破死锁的四个必要条件中的一个或者几个。
    1.打破互斥条件。允许进程同时访问某些资源。
    2.打破不可抢占条件。允许进程强行从占有者那里夺取某些资源。
    3.打破占有且申请条件。实行资源预先分配。
    4.打破循环等待条件。实行资源有序分配策略。

 
    以上是纯书本的概念和指导方针,具体的实现有待自己总结。书本
上怎么总是这些干讲的呢。。。

### 计算机四级操作系统中的死锁概念与解决方法 #### 死锁定义 死锁是指一组进程因竞争资源而造成的一种僵局现象,在这种状态下,所有的进程都在等待其他进程释放它们所需的资源,从而导致这些进程永远无法继续执行下去[^1]。 #### 死锁产生的必要条件 为了理解如何预防或解除死锁,需先掌握其形成的四个必要条件: 1. **互斥条件**:至少有一个资源必须处于不可抢占模式下被占用。 2. **占有并等待条件**:一个进程已持有某些资源的同时又申请新的资源,但新资源已被其他进程占据,因此该进程进入阻塞状态。 3. **不剥夺条件**:已经分配给某个进程的资源不能强制收回,只有在该进程主动释放时才能由其他进程使用。 4. **循环等待条件**:存在一系列等待着资源的进程集合 {P0, P1, …, Pn} ,其中 Pi 等待 P(i+1)%n 所占有的某项资源[^2]。 #### 死锁的解决方案 针对死锁问题有四种主要策略: 1. **鸵鸟算法** 这种方式认为死锁很少发生或者即使发生了也无大碍,因而选择忽略它。尽管这种方法简单粗暴,但在实际应用中并不推荐采用这种方式来处理可能存在的严重问题。 2. **死锁检测与恢复** 不采取任何措施防止死锁的发生,而是定期检查系统是否存在死锁情况。一旦发现死锁,则通过撤销部分进程、强行夺取某些资源等方式打破当前局面。然而此法成本较高且实施复杂度较大。 3. **死锁避免** 在每次资源分配前都进行安全性分析,仅当此次分配不会引发未来潜在死锁风险时才允许操作完成;否则拒绝本次请求直至满足安全状态为止。银行家算法就是一种典型的用于实现这一目标的技术手段。 4. **死锁预防** 通过对上述提到的一个或多于一个形成死锁的必要条件加以破坏,从根本上杜绝死锁发生的可能性。具体做法包括但不限于改变资源分配顺序、引入时间戳机制等技术手段以消除“循环等待”等问题根源所在。 ```python def banker_algorithm(available_resources, max_claim, allocation): work = available_resources.copy() finish = [False]*len(max_claim) safe_sequence_found = False while not all(finish): found = False for i in range(len(max_claim)): if not finish[i]: need_i = [max_claim[i][j]-allocation[i][j] for j in range(len(work))] if all([need_i[j]<=work[j] for j in range(len(work))]): work = [work[j]+allocation[i][j] for j in range(len(work))] finish[i]=True found=True break if not found: return 'Unsafe state' return 'Safe sequence exists' # Example usage of the Banker's Algorithm function print(banker_algorithm([1,5,2], [[7,5,3],[3,2,2]], [[0,1,0],[2,0,0]])) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值