3

9つのプロセスで構成されるこのマルチプロセスプログラムがあります。1 つは、3 つのシグナル生成プロセスと 4 つのシグナル処理プロセスを生成するメイン プロセスです。1つは監視プロセスです。ここで、SIGUSR1 と SIGUSR2 の 2 つのシグナルを使用しました。各ハンドラーは、SIGUSR1 または SIGUSR2 のいずれかを処理できます。シグナルを受信するたびに、共有メモリ内のシグナル SIGUSR1 および SIGUSR2 のカウントを 1 増やします。シグナルはプロセス グループに送信されるため、監視プロセスもシグナルを受信します。両方のシグナルを処理でき、ローカルシグナルカウントを 1 増やします。10 に達するたびに、共有メモリ内の SIGUSR1 と SIGUSR2 のカウントの値を出力します。

このオプションはメイン プログラムにあり、30 秒間実行してプログラムを終了することができます。この場合、sleep(30) を実行してからプログラムを終了します。2 番目のケースでは、共有メモリ内の SIGUSR1 と SIGUSR2 の合計数をカウントしながら、while ループでビジー状態で待機します。100000 に達すると、プログラムを終了します。

2つのバージョンの私の出力は次のとおりです

100000秒版の場合

100000信号版出力用

  Initializing the shared memory
   End of initializing the shared memory
   Registering the signal handlers
   End of registering the signal handlers
   Registering the monitoring process
   Monitor's pid is 6635
   End of registering the monitoring process
   Registering the signal generators
   Interval SIGUSR1 = 5.79953e-05
   Interval SIGUSR2 = 8.69632e-05
   Count SIGUSR1 = 10
   Count SIGUSR2 = 10
   Count SSIGUSR1 = 5
   Count SSIGUSR2 = 5

   Interval SIGUSR1 = 7.64132e-05
   Interval SIGUSR2 = 5.72999e-05
   Count SIGUSR1 = 16
   Count SIGUSR2 = 24
   Count SSIGUSR1 = 8
   Count SSIGUSR2 = 12

30秒バージョンの場合

共有メモリの初期化

 End of initializing the shared memory
   Registering the signal handlers
   End of registering the signal handlers
   Registering the monitoring process
   Monitor's pid is 6719
   End of registering the monitoring process
   Registering the signal generators
   Inside option 1
   Interval SIGUSR1 = 0.000246763
   Interval SIGUSR2 = 0.000222743
   Count SIGUSR1 = 93
   Count SIGUSR2 = 222
   Count SSIGUSR1 = 92
   Count SSIGUSR2 = 111

   Interval SIGUSR1 = 0.000664711
   Interval SIGUSR2 = 0.000390577
   Count SIGUSR1 = 102
   Count SIGUSR2 = 234
   Count SSIGUSR1 = 97
   Count SSIGUSR2 = 117

2番目のケースで結果が遅れるのはなぜですか。つまり、モニターが最初に出力を出力したとき、処理スレッドによって記録された SIGUSR1 と SIGUSR2 のカウントは、すでに 93 と 222 に達していました。また、シグナルはプロセス グループに送信されます。したがって、各シグナルは 2 つのハンドラーと 1 つのモニターによって処理されます。ハンドラーの場合は 2 つだけです。4 つのハンドラーのうち 2 つが SIGUSR1 を処理し、他のシグナルを無視し、その逆も同様であるためです。

したがって、sleep(30) を実行して結果を確認すると、何が問題なのかがわかります。あらゆる洞察。これを何日もデバッグしようとしていますが、まだ成功していません。

4

1 に答える 1

1

信号は受信時にマージされる場合があります (信号はハードウェア割り込みコントローラーとして機能します)。例:

プロセス 2 は、現在アクティブでないプロセス 10 にシグナル SIGUSR1 を送信します。

カーネルストア プロセス 10 には保留中の SIGUSR1 があります

プロセス 3 は、現在アクティブでないプロセス 10 にシグナル SIGUSR1 を送信します。

カーネル ストア プロセス 10 には保留中の SIGUSR1 があります (これは既にあります)。

プロセス 10 がスケジュールされ、SIGUSR1 が保留中であることを確認し、保留を削除してシグナル処理を開始します。

結果、プロセス 10 は 1 つの SIGUSR1 しか見ませんでした。

システムをシグナルでフラッディングすることを追加すると、シグナルがスケジュールされている順序により、一部のシグナルが他のシグナルよりも頻繁に表示される可能性があります。

結論: シグナルはコミュニケーション パスとしてではなく、プロセスを微調整するためのものです。通信には、セマフォ、パイプ、ファイルなど、およびシグナルを使用してウェイクアップ/他のプロセスに変更をチェックするように指示します。

于 2016-04-19T11:27:27.040 に答える