• ベストアンサー

イベント処理時のCPU負荷について

現在、IPアドレスを監視するプログラムの作成を 検討していまがループで監視すると負荷が大変 大きくなります。 疑問に思ったのですが、例えばUNIXのシステムコール sleep() listen() accept()等はCPUに負荷がかかっていません。 常にあるポートのバッファを監視しているはずですよね。 これらのシステムコールはOSではどういった処理でCPU 負荷の軽減を実現しているのしょうか? 以上、ご教授お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.2

>また、CPUでの割り込み時の処理はどのようになっているのでしょうか? ・動作中のプロセスが一定時間以上連続してCPUを使った場合 ・割り込みがかかった場合 に、CPU待ちをしているプロセスの中で一番優先度の高いプロセスにCPUが割り当てられます。通常は割り込みプロセスが優先度が高いのでそのプロセスが実行されます。 で、答えになってますか?いまいち質問の意図がわからず。

negi-bozu
質問者

お礼

ご回答ありがとうございます。 質問の意図がわかりづらくて申し訳ありません。 割り込みが入ったらそのプロセスを優先して実行させる仕様にCPUがなっているのかなと思いまして。 たとえばハードウェア(NIC)からの割り込み要求待ちにする技法があればご教授ください。それともselect()で実現可能なのでしょうか?

その他の回答 (1)

回答No.1

select(2)またはpoll(2)システムコールを使います。 それぞれ、由来がBSD系とSystemV系ですが、 最近の処理系はどちらも使えると思います。 どちらも、指定されたfd(ファイルディスクリプタ)を監視して、 入力/出力を検知した時に、リターンするようになっています。 (その際、同時に複数のfdを監視するように指定する事ができます。) select/poll待ち中は、そのプロセスは割り込み待ちをしているので、 CPU時間はほとんど消費せず、 その間、OSによって他のプロセスの処理が実行されています。 例えば、ご質問のacceptにはfdを使用すると思いますが、 そのfdの入出力が行われるのをselect/pollを呼び出して待ち、 処理がかえって来たら(つまりacceptの場合は接続要求を受けたら) その接続に対する処理を行うようなコーディングになります。

negi-bozu
質問者

お礼

ご回答ありがとうございます。 バッファを監視しているわけではなく 割り込みを待ちの状態なんですね。 例えば、accept()の場合OSはNICからの割り込みを 待っているということでしょうか? また、CPUでの割り込み時の処理はどのようになっているのでしょうか?

関連するQ&A