为什么首选异步IO
Why is asynchronous IO preferred
所以我一直在做一些 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 完成,则第一个调用将阻塞,而第二个调用将直接在 recv 上阻塞,直到数据到达。那么稍晚一些的 IO 调用块的实际好处是什么?是不是 IF 在等待之前你有可以做的事?
如果是这种情况,在数据到达之前您无法执行任何操作的应用程序中重叠 IO 值 it/needed?
您展示的案例不是使用任何类型的异步的典型原因I/O,我想说的恰恰相反(因为正如您所指出的,无论如何它都不是真正的异步)。
使用异步 I/O 的典型原因仅仅是因为它是异步的,您的程序可以继续执行其他操作,而不是等待 I/O 操作完成。
异步I/O节省线程资源。
特别是,每当您通过同步 I/O 处理一些客户端请求时,您都会为其分配 1 个线程。当您有 1 个客户时,效果很好。或者 10 个客户。
如果您有 10000 个客户端,则必须为它们创建 10K 个线程来为它们提供服务。这是可能的,但在很多情况下效率低下。
使用异步 I/O 允许在一个线程中处理大量客户端(具体数量取决于 OS/architecture)。通常这种方法比用于少量客户端的专用线程慢一点(因为请求处理是序列化的),但在其他情况下吞吐量要好得多。
所以我一直在做一些 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 完成,则第一个调用将阻塞,而第二个调用将直接在 recv 上阻塞,直到数据到达。那么稍晚一些的 IO 调用块的实际好处是什么?是不是 IF 在等待之前你有可以做的事?
如果是这种情况,在数据到达之前您无法执行任何操作的应用程序中重叠 IO 值 it/needed?
您展示的案例不是使用任何类型的异步的典型原因I/O,我想说的恰恰相反(因为正如您所指出的,无论如何它都不是真正的异步)。
使用异步 I/O 的典型原因仅仅是因为它是异步的,您的程序可以继续执行其他操作,而不是等待 I/O 操作完成。
异步I/O节省线程资源。
特别是,每当您通过同步 I/O 处理一些客户端请求时,您都会为其分配 1 个线程。当您有 1 个客户时,效果很好。或者 10 个客户。
如果您有 10000 个客户端,则必须为它们创建 10K 个线程来为它们提供服务。这是可能的,但在很多情况下效率低下。
使用异步 I/O 允许在一个线程中处理大量客户端(具体数量取决于 OS/architecture)。通常这种方法比用于少量客户端的专用线程慢一点(因为请求处理是序列化的),但在其他情况下吞吐量要好得多。