2017-11-06 10 views
1

プロファイリングフレームワークの開発中に、プログラムがシグナルを受信すると実行中のスレッド(メインスレッドを含む)をすべて停止する必要があるという問題(SIGUSR1たとえば)およびLinux/POSIXシステム上に実装することができ、次のワークフローの可能性がある場合、私は興味があります:シグナルを使用してLinuxプログラムのすべてのスレッドを一時停止する

過負荷んSIGUSR1のためのシグナル・ハンドラ:

  1. それは中断し、実行中のすべてのプログラムのスレッドにはアクセスできませんが、pidなどの情報にアクセスすることはできません。たとえスレッドがpthreadsを介して直接使用されていても、OpenMPインスタンスであっても。

  2. 収集されたすべてのデータをディスクに書き込みます(ここではその原点は関係ありません)。しかし、書き込みプロセスは、プロファイリングによって収集された実行時データに影響を与えます。このため、すべてのスレッドを停止する必要があります。

  3. プロファイリングデータを書き込んだ後、すべてのスレッドを続行します。

スレッド信号処理について私が読んだことは、信号がプロセスに送られると、プログラムの任意のスレッドが信号を処理するということでした。しかし、これは私を助けません。

+1

シグナルをpid '-pgrp'に送ることで、プロセスグループ全体にシグナルを送ることができます。 – Ctx

+0

...実行中のすべてのスレッドを一時停止していますが(何とか)、その時間までに他のスレッドが実行されました:( –

答えて

2

あなたは間違った方向に向かっています。

何らかの形で、単一のシグナル(すべてSIGSTOPを使用してください)を使用してすべてのスレッドを中断することができたとしても、実行しようとしていることはできませんでした。

あなたがしようとしていることを「グローバルスナップショット」といいます。スレッドの状態をに一貫しての方法でダンプしたいとします。シグナルの問題は、おそらく、計算中にいくつかのスレッドを捕捉するということです。各スレッドのアクティビティを構造化して、1ナノ秒ごとの実行でメモリ内の一貫したデータを持つようにはなりません。

あなたもそうです。このような構造化は非常に難しく、利益をもたらさない。

代わりに、データのダンプをとして作成すると、となっている可能性があります。つまり、プログラムの実行中にダンプが実際にある時点を表す必要はありません。あなたのプログラムに入っている可能性があります。

これを行う最善の方法は、各スレッドのコードにスナップショットのコードをインライン化することです。シグナルを使用して、スナップショットが必要であることを示す変数を設定し、内部データが一貫してスナップショットの準備が整うと、各スレッドが中断するようにします。

+0

あなたの最後のアイデアは思考のように聞こえます。上記のアイデアは各スレッドがそのプロファイルデータを1つのグローバルバッファに集め、このバッファがいっぱいになるとスレッドがディスク全体にバッファを書き込むというものでしたが、この書き込みは最終的に進行中の計算を他のスレッド内にもたらし、グローバルサスペンドのアイデアは、プロファイリングのランタイムデータがこれによって壊れているという書き込みが行われているというインジケータを設定することでした。 –

+0

@MKakaGrisu私はあなたの実装にバグがあると確信しています。 1つのバッファに書き込むいくつかのスレッドは、非常に多くのエッジケースを持っています。あなたはどのように書き込みを同期させるのですか?どのくらいの細胞が実際に完全なデータを持っていることを確認しますか? –

+0

@ M.K.akaGrisuより良いアプローチであるIMOは、各スレッドに自分のバッファにデータを書き込ませてから、ダンプしたいときにそれを収集することです。 –

関連する問題