Linux——死锁

本文详细介绍了死锁的概念及产生的四个必要条件,并提出了几种处理死锁的策略。此外,深入探讨了银行家算法的工作原理及其如何通过资源分配避免死锁。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是死锁
例如:现有资源A、B,进程C、D
描述如下:
  资源A和资源B,都是不可剥夺资源,
  现在进程C已经申请了资源A,进程D申请了资源B,
  进程C接下来的操作需要用到资源B,而进程D恰好也在申请资源A,
  进程C、D都得不到接下来的资源,那么就引发了死锁。
即如果一个进程集合里面(进程C和进 程D)的每个进程(进程C和进程D)都在等待只能由这个集合中的其他一个进程(对于进程C,他在等进程D;对于进程D,他在等进程C)才能引发的事件(释放相应资源)。这种情况就是死锁。

死锁的四个必要条件
(1)互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。
(2)请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。
(3)非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。
(4)循环等待条件(Circular wait):系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。

处理死锁的策略
1.忽略该问题。例如鸵鸟算法,该算法可以应用在极少发生死锁的的情况下。
为什么叫鸵鸟算法呢,因为传说中鸵鸟看到危险就把头埋在地底下,
可能鸵鸟觉得看不到危险也就没危险了吧。跟掩耳盗铃有点像。
2.检测死锁并且恢复。
3.仔细地对资源进行动态分配,以避免死锁。(银行家算法)
4.通过破除死锁四个必要条件之一,来防止死锁产生。

理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态的情况下占用资源。因此,对资源的分配要给予合理的规划。

银行家算法:有效避免死锁的发生,或检测死锁的存在
银行家算法,顾名思义是来源于银行的借贷业务,一定数量的本金要应多个客户的借贷周转,为了防止银行家资金无法周转而倒闭,对每一笔贷款,必须考察其是否能限期归还。在操作系统中研究资源分配策略时也有类似问题,系统中有限的资源要供多个进程使用,必须保证得到的资源的进程能在有限的时间内归还资源,以供其他进程使用资源。如果资源分配不得到就会发生进程循环等待资源,则进程都无法继续执行下去的死锁现象。把一个进程需要和已占有资源的情况记录在进程控制中,假定进程控制块PCB其中“状态”有就绪态、等待态和完成态。当进程在处于等待态时,表示系统不能满足该进程当前的资源申请。“资源需求总量”表示进程在整个执行过程中总共要申请的资源量。显然,,每个进程的资源需求总量不能超过系统拥有的资源总数, 银行算法进行资源分配可以避免死锁.
我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。

银行家算法中的数据结构
(1)可利用资源向量Available。这是一个含有m个元素的数组,其中的,每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。如果Available[j]=K,则表示系统中现有Rj类资源K个。

(2)最大需求矩阵Max。这是一个n*m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K。

(3)分配矩阵Allocation。这也是一个n*m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocation[i,j]=K,则表示进程i当前已分得Rj类资源的数目为K。

(4)需求矩阵Need。这也是一个n*m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。

算法描述
设进程i提出请求Request[j],则银行家算法按如下规则进行判断。
(1)如果Request[j]≤Need[i,j],则转向(2),否则认为出错。
(2)如果Request[j]≤Available[j],则转向(3);否则表示尚无足够资源,Pi需等待。
(3)假设进程i的申请已获批准,于是修改系统状态:

Available[j]=Available[j]-Request[i]

Allocation[i,j]=Allocation[i,j]+Request[j]

Need[i,j]=Need[i,j]-Request[j]

(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。

安全性检查
(1)设置两个工作向量Work=Available;Finish[i]=False
(2)从进程集合中找到一个满足下述条件的进程,
Finish [i]=False;
Need[i,j]≤Work[j];
如找到,执行(3);否则,执行(4)
(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。
Work[j]=Work[i]+Allocation[i,j];
Finish[i]=True;
go to step 2;
(4)如所有的进程Finish[i]=true,则表示安全;否则系统不安全。

### Linux 死锁的原因分析 在操作系统中,死锁是指两个或多个进程无限期地等待对方释放资源的情况。这种现象通常发生在并发环境中,当一组进程中的每一个都在等待另一个进程所持有的资源时发生[^1]。 Linux 中的死锁可能由多种因素引起,主要包括以下几种情况: - **循环等待条件**:如果系统允许多个进程请求并持有多个资源,则可能会形成一个循环依赖链,在该链条上的每个进程都持有一个资源,并等待下一个资源被释放。 - **不可剥夺资源**:某些类型的资源(例如 I/O 设备)一旦分配给某个进程就不能轻易地被强制收回。这可能导致其他正在等待这些资源的进程陷入停滞状态。 - **缺乏同步机制或者错误使用同步原语**:线程间通信不当时也可能引发死锁问题。例如,不当调用 `mutex` 或者信号量操作可以导致程序进入无法继续执行的状态。 ### 解决方案探讨 针对以上提到的各种潜在原因,可以从以下几个方面入手来预防和解决死锁问题: #### 预防措施 1. **打破至少一种必要条件** - 通过改变资源分配策略以破坏“互斥条件”,即让所有资源都可以共享而不是独占; - 实施顺序加锁协议从而避免出现环形等待状况;对于任何一对需要锁定的对象 A 和 B ,规定总是先获取较小编号的那个对象再取得较大编号的一个实例化版本即可有效防止这种情况的发生 [^2]. 2. **采用银行家算法进行安全性检测** - 在每次分配新资源之前运行一次模拟测试看是否存在安全序列——也就是能够找到一条路径使得所有的任务都能顺利完成而不会互相阻塞的话就允许此次申请成功;否则拒绝当前用户的请求直到满足这个前提为止. 3. **时间戳方法(Time-stamp ordering algorithm)** - 给每个事务赋予唯一的时间标记值TS(T),按照其创建时刻先后排列好次序之后再依次处理它们之间的相互作用关系就可以很好地规避掉可能出现的数据竞争局面了 . #### 处理已发生的死锁 1. **超时法(Timeout Method)** 如果怀疑某段代码可能存在死锁风险,可以在其中设置合理的最大等待时限参数Tmax 。 当超过此期限仍未完成预期目标动作则认为已经发生了异常情形进而采取相应补救手段比如回滚整个交易过程重新开始计算等步骤来进行恢复工作 2. **资源剥夺(Resource Preemption)** 对于那些已经被占用却长时间未使用的宝贵硬件设施可以直接强行回收然后再分发出去供急需的一方短期借用一下缓解紧张局势的同时也促进了整体效率提升效果显著 ```bash # Example of using timeout method in shell script timeout 10s ./long_running_process || echo "Process timed out" ``` ### 结论 综上所述,虽然完全消除死锁是不可能的任务,但是我们可以通过精心设计的应用架构以及合理配置的操作系统内核参数最大程度减少此类事件发生的概率及其带来的负面影响程度。同时也要注意定期维护检查现有基础设施健康水平以便及时发现隐患所在之处加以改进优化最终达成稳定高效的生产环境建设目标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值