2016-08-22 10 views
0

私はいくつかのWIN32ソケットプログラミングを行っていますが、なぜオーバーラップIOが望ましいのか理解しようとしています。 IOイベントがなかった場合は特に、私はこのなぜ非同期IOが好ましいですか

if (WSARecv(
      socket, 
      dataBuf, 
      1, 
      NULL, 
      &flags, 
      &ov, 
      NULL) 
      == SOCKET_ERROR) { 
    if (WSAGetLastError() == WSA_IO_PENDING) 
    { 
     if (WSAWaitForMultipleEvents(1, &ov.hEvent, FALSE, INFINITE, FALSE) == WAIT_TIMEOUT) 
     { 
      return FALSE; 
     } 
    } else { 
     return FALSE; 
    } 
} 
// ... more code here 
return TRUE; 

のようなものが私の理解から、この

recv(socket, dataBuf, bufLen), 0); 

のような通常のIO呼び出しよりも好まれている理由思ったんだけど、最初の呼び出しはブロックされますWSAWaitForMultipleEventsで完了し、2番目の呼び出しはデータが到着するまでrecvで直接ブロックされます。 IOコールのブロックが少し遅れてしまうのは実際のメリットですか?それはIFあなたはあなたがそれをやるのを待つ前にできることがありましたか?

データが到着するまで何もすることができないアプリケーションでは、価値のある重複IOが必要ですか?

答えて

4

あなたが表示するケースは、非同期I/Oを使用する典型的な理由ではありません。

非同期I/Oを使用する典型的な理由は、非同期であるため、プログラムはI/O操作が完了するのを待つのではなく、何か別の処理を続けることができます。

+0

データを待っている間にできることの例を挙げてください。 – FrozenHawk

+3

標準的な例は、複数のアクティブソケット(例えば、サーバ)を有するアプリケーションである。シンプルですがスケーラビリティの低いクライアントごとに1つのスレッドを持つことも、非同期I/Oを使用することもできます。 –

+3

私は正規のアプリケーションがGUIアプリケーションであると思っていたでしょう。ユーザー入力とシステム再描画の呼び出しに応答し続ける必要があるため、応答がなくなります。 –

1

非同期I/Oスレッドリソースを節約します。

特に、同期I/Oを使用してクライアント要求を処理する場合は、そのスレッドに対して1つのスレッドを割り当てます。あなたが1人のクライアントを持っているとうまくいく。または10クライアント。

クライアントが10000人の場合は、クライアントにサービスを提供するために10Kのスレッドを作成する必要があります。可能ですが、多くの場合非効率です。

非同期I/Oを使用すると、1つのスレッドで非常に多くのクライアントを処理できます(特定の数はOS /アーキテクチャによって異なります)。通常、このようなアプローチは、少数のクライアント(要求処理がシリアル化されるような)専用スレッドが少し遅くなりますが、それ以外の場合は非常に優れたスループットになります。

+1

ここでは、[I/O完了ポート](https://msdn.microsoft.com/en-us/library/windows/desktop/aa365198.aspx)について実際に話しています。非同期I/Oだけを使用しても、システムリソースは効率的に使用されません。 – IInspectable

関連する問題