59

昔々、私はIndyの紹介の記事に出くわし、それ以来、ブロッキングと非ブロッキングのIOについて考えるのをやめられません。

ブロッキングIOと非ブロッキングIOの長所と短所、およびそれぞれの場合に自然で理解しやすく、保守しやすいコードを取得するためにアプリケーションを設計する方法を説明するいくつかの優れた記事を探しています。
大きな絵を理解したい...

4

2 に答える 2

77

IO を十分にブロックするということは、IO が完全に受信されるまで、特定のスレッドがそれ以上何もできないことを意味します (ソケットの場合、この待ち時間は長くなる可能性があります)。

ノンブロッキング IO とは、IO 要求がすぐにキューに入れられ、関数が戻ることを意味します。その後、実際の IO はカーネルによって後で処理されます。

IO をブロックするには、すべての IO リクエストを待機することを受け入れるか、リクエストごとにスレッドを起動する必要があることを受け入れる必要があります (これは非常に複雑になります)。

ノンブロッキング IO の場合、複数のリクエストを送信できますが、データは「後の」時点まで利用できないことに注意する必要があります。このデータが実際に到着したかどうかのチェックは、おそらく最も複雑な部分です。

アプリケーションの 99% では、IO がブロックされることを気にする必要はありません。ただし、IO 要求を開始してから戻ってくる前に別のことを実行できるようにするという追加のパフォーマンスが必要な場合があり、できれば IO 要求が完了したことを確認できます。

とにかく、ただのタペンス。

編集:パフォーマンスが良好でありながらブロッキング IO を処理するアプリケーションを設計する方法に答えるには、コルーチンが適している可能性があります。

于 2009-08-06T21:11:29.457 に答える
35

ポジティブとネガティブはかなり明確です。

ブロッキング - 線形プログラミング、コーディングが容易、制御が少ない。
ノンブロッキング - 並列プログラミング、コーディングがより難しく、より制御しやすくなります。

于 2009-08-06T21:11:23.950 に答える