Linux死锁分析


1.工具

    pstack 进程PID,多次查看线程状态,如果一直处于一样,则锁住了,需进一步分析 谁 拿了锁,

为了方便对应代码分析 ,需要打印出线程的TID 非线程ID,

{

#include <linux/unistd.h>

pid_t tid = (pid_t)syscall(SYS_gettid);
}

2. gdb attach PID

info thread

t 1

p mutex 可看到哪个线程(TID) 拿了锁

 

参考:

http://www.ibm.com/developerworks/cn/linux/l-cn-deadlock/

一个 Linux 上分析死锁的简单方法

3. valgrind 工具 用于内存问题分析,非常准。目前只有linux版本。

### 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、付费专栏及课程。

余额充值