死锁发生的条件

操作系统中有若干进程并发执行,它们不断申请、使用、释放系统资源,虽然系统的进
程协调、通信机构会对它们进行控制,但也可能出现若干进程都相互等待对方释放资源才能
继续运行,否则就阻塞的情况。此时,若不借助外界因素,谁也不能释放资源,谁也不能解
除阻塞状态。根据这样的情况,操作系统中的死锁被定义为系统中两个或者多个进程无限期
地等待永远不会发生的条件,系统处于停滞状态,这就是死锁。
产生死锁的原因主要是:
(1) 因为系统资源不足。
(2) 进程运行推进的顺序不合适。
(3) 资源分配不当等。
如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则
就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。
产生死锁的四个必要条件:
1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
这四个条件是
死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之
一不满足,就不会发生死锁。
死锁的解除与预防:
理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和
解除死锁。所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确
定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态
的情况下占用资源。因此,对资源的分配要给予合理的规划。

  • Murual Exclusion
    同一个资源不能被两个或两个以上进程同时使用。

    Hold and wait
    进程在持有某些资源的同时,请求使用其他的资源。  

  • No preemption
    不能抢占其他进程正在使用的资源。

    Circular Wait
    几个进程出现循环等待,即A等待B正在使用的资源,B等待C正在使用的资源,C等待A正在使用的资源等。

### 死锁产生的四个必要条件 死锁产生的四个必要条件包括以下内容: 1. **互斥条件**:资源是独占的且排他使用,进程互斥使用资源。即任意时刻一个资源只能给一个进程使用,其他进程若申请一个资源,而该资源被另一进程占有时,则申请者等待直到资源被占有者释放[^1]。 2. **不可剥夺条件**:进程所获得的资源在未使用完毕之前,不被其他进程强行剥夺,而只能由获得该资源的进程主动释放。 3. **请求和保持条件**:进程每次申请它所需要的一部分资源,在申请新的资源的同时,继续占用已分配到的资源。 4. **循环等待条件**:在发生死锁时必然存在一个进程等待队列 {P1, P2, ..., Pn},其中 P1 等待 P2 占有的资源,P2 等待 P3 占有的资源,…,Pn 等待 P1 占有的资源,形成一个进程等待环路,环路中每一个进程所占有的资源同时被另一个进程申请。 ```java public class DeadlockExample { private static final Object resourceA = new Object(); private static final Object resourceB = new Object(); public static void main(String[] args) { // 线程1尝试获取 resourceA 和 resourceB new Thread(() -> { synchronized (resourceA) { System.out.println("Thread 1: Holding resourceA..."); try { Thread.sleep(100); } catch (InterruptedException e) {} System.out.println("Thread 1: Waiting for resourceB..."); synchronized (resourceB) { System.out.println("Thread 1: Holding resourceA and resourceB"); } } }).start(); // 线程2尝试获取 resourceB 和 resourceA new Thread(() -> { synchronized (resourceB) { System.out.println("Thread 2: Holding resourceB..."); try { Thread.sleep(100); } catch (InterruptedException e) {} System.out.println("Thread 2: Waiting for resourceA..."); synchronized (resourceA) { System.out.println("Thread 2: Holding resourceB and resourceA"); } } }).start(); } } ``` 上述代码示例展示了两个线程分别持有不同的资源并互相等待对方释放资源的情况,从而导致死锁发生
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值