2011-11-14 3 views
3

信号駆動型I/O、 を使用しているとき、それはまた、edge-を提示するので、Linuxのプログラミング・インタフェースの本、(p.1367)はファイルディスクリプタ飢餓やブロックファイルディスクリプタ

飢餓の配慮にも適用することができますトリガされた通知メカニズム。対照的に、レベル誘発通知メカニズムを使用するアプリケーションでは、飢餓考慮事項が必ずしもアプリケーションに適用されるとは限らない。我々は レベルトリガ通知をブロックファイルディスクリプタを採用し、継続的に準備のための 記述子をチェックするループを使用してから、もう一度準備ができてファイルディスクリプタをチェックする前に準備ができて 記述子にいくつかのI/Oを実行することができますので、この です。

この 'ブロック'の意味はわかりません。ブロッキングI/Oと非ブロッキングI/Oのどちらを使用するかは関係ありません。 (著者はまた、通常、ノンブロッキングI/Oがレベルトリガまたはエッジトリガ通知に関係なく使用されていると述べています)

+0

"レベルトリガー通知でブロッキングファイル記述子を使用できる" vs "エッジトリガー通知でブロッキングファイル記述子を確実に使用できない"とにかく、私はファイル記述子をブロックすることは常にレベルトリガー通知でブロックされないことが保証されているとは思わない。したがって、ブロックしたくない場合は、ノンブロッキングソケットを使用してください。 – ninjalj

答えて

1

SO、IO eh?まあ、IOは "物事を扱う"ので、私たちは人間の隠喩を使うことができます。あなたの上司のためにシステムを稼働させるプロセスがあるとしましょう。

その後、IOをブロックすることは、歯科医に行くか、顧客と面談するようなものです。これらの両方のシナリオで、そのイベントに着手すると、あなたは机から離れているので、机に戻るまで何もできません。チャンスは、待合室で時間を無駄にしたり、会議のアイドルチャタリング/人々が立ち上がるのを待つことです。

IOをブロックすることは、問題のタスクへのスレッドをIOが「犠牲にする」(スレッドを失うため、効果的に)です。ブロックされている間は他の目的に使用することはできません。IOが発生するのを待っています。

ノンブロッキングIOは、対照的に、電話のようなものです。あなたが電話をしているときに、Stack Overflowで回答を書いている間にそのIOに従事することができます!そのようなIOは非同期であると言われています。つまり、IO要求を受け入れて処理を開始しますが、完了している間に他の要求を処理できます。

ここで私のお気に入りのリソースはc10k problemページです。私はあなたが正しいと言っているでしょう - ノンブロッキングIOを使用する時間の99%(実際には、あなたのOSはいつもノンブロッキングIOを実行しています)入ってくるIOタスクは、スレッドとプロセスが同じもの(タスク)であり、かなり軽量であるLinuxであっても、非常に非効率的です。

エッジトリガー通知とレベルトリガー通知の違いは、おそらくブロッキングの場合とは関係がないため、ノンブロッキング接続に多くのものが適用される可能性があります。私が理解しているように、エッジトリガー通知は、最後にステータス更新を求めたときの新しいデータがあるときにはディスクリプタを準備完了としてマークしますが、レベルトリガでは利用可能なデータがあるときはいつでも処理できるディスクリプタをマークします。つまり、再度通知されないため、handle the incoming data when you see itにする必要があるため、エッジトリガーインターフェイスはconsidered a bit more trickyです。理論的には、それはより効率的でなければなりません(通知が少な​​くなります)。

したがって、ブロックされていないIOと実際にはIOをブロックする方法はいくつかあります。

関連する問題