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