为什么首选异步IO

Why is asynchronous IO preferred

本文关键字:IO 异步 为什么      更新时间:2023-10-16

所以我一直在做一些WIN32套接字编程,我试图理解为什么重叠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完成,那么第一个调用将阻塞,而第二个调用将直接阻塞接收,直到数据到达。那么稍微晚一点阻塞IO调用的实际好处是什么呢?是不是如果你在等待之前有事情可以做,你会这样做?

如果是这种情况,重叠IO值得/需要在应用程序中,你不能做任何事情,直到数据到达?

您展示的案例并不是使用任何类型的异步I/O的典型原因,恰恰相反,我想说(因为它,正如您所指出的,无论如何都不是真正的异步)。

使用异步I/O的典型原因只是因为它是异步的,你的程序可以继续做其他事情,而不是等待I/O操作完成。

异步I/O节省线程资源。

特别地,每当您通过同步I/O处理一些客户机请求时,您为它分配1个线程。当你有一个客户端时,它工作得很好。或者10个客户。

如果你有10000个客户端,你必须创建10K个线程来为他们服务。这是可能的,但在许多情况下效率低下。

使用异步I/O允许在一个线程中处理大量客户端(具体数量取决于操作系统/体系结构)。通常这种方法只比专用线程对少数客户端慢一点(因为请求处理是序列化的),但在其他情况下吞吐量要好得多。