1

だから私はいくつかのWIN32ソケットプログラミングを行ってきました.Overlapped 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;

このような通常の IO 呼び出しよりも優先されます

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

私の理解では、IO イベントが WSAWaitForMultipleEvents で完了しなかった場合、最初の呼び出しはブロックされますが、2 番目の呼び出しは、データが到着するまで recv で直接ブロックされます。では、IO 呼び出しブロックを少し遅らせることの実際の利点は何でしょうか? 待つ前にできることがあれば、それをするということですか?

その場合、オーバーラップ IO は、データが到着するまで何もできないアプリケーションで価値がある/必要ですか?

4

2 に答える 2

1

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

特に、同期 I/O を介して一部のクライアント要求を処理するときは常に、1 つのスレッドを割り当てます。クライアントが1人の場合、これはうまく機能します。または 10 クライアント。

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

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

于 2016-08-22T08:05:44.150 に答える