UNIX上のプロセスのデッドロック理由を実際に見つける方法

Unixでは、プロセスが停止しています。デッドロックが発生する可能性がありますか、デッドロックの理由を見つけ、それを削除して回避する方法はありますか?

私はデッドロックの4つの条件を知っています:

  1. 相互排除:一度に最大で1つのプロセスにリソースを割り当てることができます(共有しない)。

  2. 保留と待機:リソースを保持している処理で別の処理を要求することができます。

  3. 優先なし:プロセスはリソースを解放する必要があります。彼らは取り去ることはできません。

  4. 循環待ち:チェーンの各メンバーがチェーンの次のメンバーが保持するリソースを待っているような一連のプロセスが必要です。

But, they are theoretical, how to determine a deadlock on unix practically ? Only by seeing that a process does not make progress ? How to find which part of the code cause the deadlock and the reasons ? If you are allowed to use tools, what can be used ?

thanks

3
この質問はあまりにも一般的です。デッドロックしている特定のプログラムについて質問している場合は、詳細を伝えることができます。
追加された 著者 Dietrich Epp,
あなたは "スレッド"で "プロセス"を置き換えるとあなたの質問をよりよく表していると思いますか?
追加された 著者 qqqqq,

2 答え

There is also Valgrind's Helgrind tool: Helgrind: a thread error detector

Helgrindは、POSIX pthreadsスレッドプリミティブを使用するC、C ++、Fortranプログラムの同期エラーを検出するためのValgrindツールです。

     

POSIX pthreadsの主な概要は、共通のアドレス空間、スレッドの作成、スレッドの結合、スレッドの終了、mutex(ロック)、条件変数(スレッド間イベントの通知)、リーダライタのロック、スピンロック、セマフォ、バリアなどがあります。

     

Helgrindは、次の3つのセクションで詳細に説明する3つのクラスのエラーを検出できます。

     
      
  1. POSIX pthreads APIの誤用

  2.   
  3. ロック注文の問題から生じる潜在的なデッドロック

  4.   
  5. データ競合なしでメモリにアクセスする適切なロックまたは同期

  6.   

このような問題は、再現性のない、タイミングに依存するクラッシュ、デッドロックなどの不正行為を招くことが多く、他の手段で見つけるのが難しい場合があります。

Helgrindはすべてのpthread抽象を認識し、可能な限り正確にその効果を追跡します。 x86およびamd64プラットフォームでは、LOCK命令プレフィックスの使用に起因する暗黙ロックを理解し、部分的に処理します。

Helgrindは、アプリケーションでPOSIX pthreads APIのみを使用する場合に最適です。ただし、カスタムスレッドプリミティブを使用する場合は、helgrind.hで定義されたANNOTATE_ *マクロを使用して、Helgrindにその動作を記述することができます。この機能はValgrindのリリース3.5.0で追加され、実験的なものと見なされます。

5
追加された
1
追加された