1

Solaris 10には、親と子のプロセスがあります。kill-KILLを使用して子プロセスを強制終了します。親プロセスでこれを可能な限り最速で検出したい(これはマスター/スレーブシステムであり、目標は親がバックアップを要求してできるだけ速く引き継ぐことです)。親プロセスは、子が終了し始めたことを知る必要があります(子終了するまで待つ必要はありません)。

使用しているシステムでは、SIGKILLを送信してから親プロセスがSIGCHLDを受信するまでに約200ミリ秒の遅延が見られます。子プロセスのサイズと終了にかかる時間のために、この時間を短縮できるとは思いません。間違っている場合は修正してください。

私の選択肢は次のとおりです。-子供にSIGKILLを送信しないでください。代わりに親にシグナルを送信して、子を殺すことができるようにします(したがって、子プロセスが終了していることを即座に認識します)。「kill-KILL」コマンドの一部は私の制御不能であり、親への別のシグナルに置き換えることができないため、これは理想的ではありません。-子の終了処理に接続します(SIGKILLをキャッチできないため、これは不可能だと思います)。-他に何かアイデアはありますか?

アドバイスありがとうございます。NickB

4

4 に答える 4

0

Solarisドアのあまり知られていない機能を使用できます。親プロセスで、属性を使用してドアを作成door_createします。これは、次のことを意味します。DOOR_UNREF

このドアを参照する記述子の数が1に減少すると、ドアに特別な呼び出しを提供します。

次にフォークします。ドアの記述子への参照が2つあります。子プロセスが終了すると、ドアの記述子参照が1に低下するため、親プロセスでドア関数が呼び出されます。

Solarisのドアは超高速であることが意図されていますが、正直なところ、この特定のケースでは納期を測定していません。それがあなたのために働くならば、私に知らせてください。

于 2010-06-25T20:14:26.283 に答える
0

SIGCHLD の配信よりもはるかに高速になるかどうかはわかりません。可能であれば、アプリケーションを再設計してマスター/マルチスレーブにすることを検討してください。

1 つのマスターと 5 つのスレーブで実行している場合、1 つのスレーブが失われると、全体の損失ではなく、容量が 20% 低下します。そして、うまくいけば、マスターは気付かれる前に別のスレーブを十分に迅速に起動できます.

これのもう 1 つの利点は、すでに開始されているが実際の作業を開始するためのセマフォまたはその他の信号を待機している予備のスレーブを翼で待機させることです。複数のスレーブを並べて実行できない場合でも、遅延の少なくとも一部が取り除かれるため (プロセスがロードされるのを待つため)、これが役立つ可能性があります。SIGCHLD が表示されたらすぐに、スペアの子プロセスに開始するようにシグナルを送るだけです。

于 2010-02-23T10:41:30.893 に答える
0

これは推測ですが、親プロセスはどのように SIGCHLD を検出しているのでしょうか? シグナル ハンドラーを使用している場合は、専用のシグナル スレッドを使用することで速度を上げることができる場合があります。

基本的に、シグナルを処理するために別のスレッドを開始します。すべてのスレッド (シグナルスレッドを含む) を呼び出しpthread_sigmask()て、SIGCHLD の受信をブロックする必要があります。sigwait()シグナル スレッドは、SIGCHLD を含むマスクを使用して呼び出します。sigwait() は、SIGCHLD が受信されるまでブロックし、シグナルが受信されると戻ります。

シグナル スレッドを使用する主な利点は、シグナル ハンドラーの制限や、プロセスが行っている可能性のある他の何かをシグナルが中断することなく、ある種のメイン ループでシグナルを処理できることです。私の推測では、カーネルがこの方法を使用してスレッドにシグナルを配信する方が安価である可能性もあります。

于 2010-02-25T20:41:19.520 に答える
0

シグナルを使用して子プロセスの強制終了をキャッチするのではなく、waitpid () または waitid() を使用して、子プロセスの状態の変化を検出できます。いずれにせよ、これらのいずれかを呼び出して、子供のpidを取得する必要があります...

その後、SIGCHLD を無視することができ、非同期コーディングを回避できるという追加のボーナスを得ることができます。

セマフォを使用するという paxdiablo の提案も、実際にはあなたが望むものかもしれません。起動時に、子がセマフォをロックします。2 つの子プロセスを実行すると、1 つが実行され、1 つがセマフォで待機します。1 番目が強制終了されると、2 番目が実行を開始します。

于 2010-02-23T11:27:15.687 に答える