一文讲透操作系统中的死锁

目录

1.什么是死锁

2.死锁,饥饿,死循环的区别

3.死锁产生的必要条件

4.什么时候会发生死锁

5.死锁的处理策略


1.什么是死锁

死锁是指在并发计算或多线程编程中,两个或多个进程(或线程)被永久地阻塞,因为每个进程正在等待其他进程所持有的资源,而这些资源又只能由其他进程释放。简单来说,死锁是一种进程无法继续执行的状态,因为它无法获取所需的资源,同时又无法释放已经占有的资源

例子:

假设有两个进程(进程A和进程B)以及两个资源(资源X和资源Y):

进程A执行流程:

  1. 进程A获取资源X。
  2. 进程A尝试获取资源Y。

进程B执行流程:

  1. 进程B获取资源Y。
  2. 进程B尝试获取资源X。

如果进程A先获取资源X,然后进程B获取资源Y,接着两个进程分别等待对方释放资源,就会导致死锁。此时,进程A无法继续执行,因为它需要资源Y,而资源Y已被进程B占用;进程B也无法继续执行,因为它需要资源X,而资源X已被进程A占用。两个进程都无法满足等待的资源需求,形成了死锁状态。


2.死锁,饥饿,死循环的区别

下面是关于死锁、饥饿和死循环的区别的表格描述:

死锁 (Deadlock)饥饿 (Starvation)死循环 (Infinite Loop)
定义两个或多个进程永久地阻塞,因为彼此相互等待所需的资源。一个或多个进程由于无法获得所需的资源而被持续地忽视。进程无限期地执行相同的操作或进入循环结构,无法向前推进。
原因由于资源互斥、占有和等待、不可剥夺以及循环等待等条件的满足。资源分配策略不合理、优先级不当、死锁等原因导致进程无法获得所需的资源。编程错误或设计问题导致进程陷入无限循环的执行路径。
特点多个进程相互等待彼此持有的资源,无法向前推进,系统进入僵局状态。一个或多个进程被其他进程持续地优先级抢占或忽视,无法正常执行。进程无限期地执行相同的操作或循环结构,无法完成其他任务。
解决方法资源分配策略、死锁检测与恢复、避免死锁等方法来打破死锁条件。资源管理策略调整、优先级调整、公平资源分配等方法来解决饥饿问题。定位并修复导致死循环的程序错误或设计问题,保证进程能够正常终止。
结果系统进入无法继续执行的状态,可能需要重启或人工干预来解决死锁。被饥饿的进程无法得到执行,可能导致系统性能下降或功能受损。进程陷入无限循环,无法完成其他任务,可能导致系统无响应。

这个表格总结了死锁、饥饿和死循环的定义、原因、特点、解决方法以及可能的结果。虽然它们都是在并发计算或多线程编程中可能出现的问题,但它们的原因、表现和解决方法各不相同。了解它们的区别有助于更好地理解和应对这些问题。


3.死锁产生的必要条件

死锁产生需要满足以下四个必要条件,也被称为死锁的必要条件

  1. 互斥条件(Mutual Exclusion):至少有一个资源必须被一个进程独占使用,即在某一时刻只能有一个进程占有该资源。这意味着其他进程在同一时刻无法访问该资源

  2. 占有和等待条件(Hold and Wait):进程必须持有至少一个资源,并且在等待获取其他进程所持有的资源。换句话说,进程在等待其他进程释放资源的同时,继续保持已经占有的资源。

  3. 不可剥夺条件(No Preemption):资源不能被强制性地从一个进程中剥夺,只能由持有它的进程显式地释放。这意味着资源只能由占有它的进程主动释放,不能被其他进程抢占或剥夺。

  4. 循环等待条件(Circular Wait):存在一个进程链,每个进程都在等待下一个进程所占有的资源。换句话说,每个进程都被前一个进程所等待的资源所阻塞,形成一个进程间的循环等待链。

当以上四个条件同时满足时,就可能发生死锁。这是因为每个进程都在等待其他进程释放资源,而这些资源又只能由其他进程释放。没有一个进程能够满足等待的资源需求,导致所有进程都无法继续执行,系统陷入死锁状态。


4.什么时候会发生死锁

1.对系统资源的竞争。各进程对不可剥夺的资源(如打印机)的竞争可能引起死锁,对可剥夺的资源(CPU)的竞争是不会引起死锁的。

2.进程推进顺序非法。请求和释放资源的顺序不当,也同样会导致死锁。例如,并发执行的进程P1、P2分别申请并占有了资源R1、R2,之后进程P1又紧接着申请资源R2,而进程P2又申请资源R1,两者会因为申请的资源被对方占有而阻塞,从而发生死锁。

3.信号量的使用不当也会造成死锁。如生产者-消费者问题中,如果实现互斥的P操作在实现同步的P操作之前,就有可能导致死锁。(可以把互斥信号量、同步信号量也看做是一种抽象的系统资源)

总之,对不可剥夺资源的不合理分配,可能导致死锁。


5.死锁的处理策略

处理死锁的策略通常可以分为以下几种:

  1. 预防死锁(Deadlock Prevention):该策略的目标是通过破坏死锁产生的必要条件之一来预防死锁的发生。常见的预防死锁的方法包括资源分配策略、资源有序性、资源剥夺和资源预先分配等。

  2. 避免死锁(Deadlock Avoidance):该策略通过动态地分配资源,避免系统进入可能导致死锁的状态。避免死锁需要对系统资源的状态和进程的需求进行监测和评估,并基于安全状态进行资源分配。常见的避免死锁的算法包括银行家算法和资源分配图算法等。

  3. 死锁检测与恢复(Deadlock Detection and Recovery):该策略通过周期性地检测系统是否处于死锁状态来处理死锁。一旦检测到死锁,可以采取一些方法来解除死锁,如进程终止、资源抢占和回滚等。常见的死锁检测算法包括资源分配图算法和银行家算法等。

  4. 死锁忽略(Deadlock Ignorance):某些系统可能选择忽略死锁问题,因为死锁的发生频率较低,解决死锁问题可能会引入更多的开销和复杂性。在这种情况下,系统可能采取周期性重启或人工干预来解决死锁。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值