如何在UNIX系统上实际查找进程死锁的原因?

3
在Unix系统中,一个进程被卡住了,你怀疑它可能是死锁,需要找出死锁的原因以及如何解除和避免死锁?
我知道死锁的四个条件:
1. 互斥:一个资源一次只能分配给一个进程(不能共享)。 2. 持有并等待:持有资源的进程可以请求另一个资源。 3. 不可抢占:进程必须释放其资源,不能被取走。 4. 循环等待:必须存在一系列进程,每个成员都在等待下一个成员持有的资源。
但是,它们是理论上的,如何在Unix上实际确定死锁?仅通过看到进程没有进展吗?如何找出导致死锁的代码部分和原因?如果允许使用工具,可以使用哪些工具?
谢谢。

这个问题太笼统了。如果您询问的是一个已经死锁的特定程序,您可以提供详细信息。 - Dietrich Epp
你觉得用“线程”代替“进程”会更好地表达你的问题吗? - qqqqq
2个回答

5

还有Valgrind的Helgrind工具:Helgrind:线程错误检测器

Helgrind 是一种 Valgrind 工具,用于检测使用 POSIX pthreads 线程原语的 C、C++ 和 Fortran 程序中的同步错误。

POSIX pthreads 中的主要抽象包括:一组共享公共地址空间的线程、线程创建、线程加入、线程退出、互斥量(锁)、条件变量(线程之间的事件通知)、读写锁、自旋锁、信号量和屏障。

Helgrind 可以检测三类错误,这些错误在接下来的三个部分中详细讨论:

  1. POSIX pthreads API 的误用

  2. 由于锁定顺序问题而导致的潜在死锁

  3. 数据竞争--没有足够的锁或同步访问内存

这些问题通常会导致无法重现、时间依赖性崩溃、死锁和其他异常行为,并且很难通过其他方式找到。
Helgrind熟悉所有pthread抽象并尽可能准确地跟踪它们的影响。在x86和amd64平台上,它理解并部分处理由于使用LOCK指令前缀而产生的隐式锁定。
当您的应用程序仅使用POSIX pthreads API时,Helgrind效果最佳。但是,如果您想使用自定义线程原语,则可以使用helgrind.h中定义的ANNOTATE_*宏将其行为描述给Helgrind。此功能是在Valgrind的3.5.0版本中添加的,被认为是实验性的。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接