为什么首选异步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完成,那么第一个调用将阻塞,而第二个调用将直接阻塞接收,直到数据到达。那么稍微晚一点阻塞IO调用的实际好处是什么呢?是不是如果你在等待之前有事情可以做,你会这样做?
如果是这种情况,重叠IO值得/需要在应用程序中,你不能做任何事情,直到数据到达?
您展示的案例并不是使用任何类型的异步I/O的典型原因,恰恰相反,我想说(因为它,正如您所指出的,无论如何都不是真正的异步)。
使用异步I/O的典型原因只是因为它是异步的,你的程序可以继续做其他事情,而不是等待I/O操作完成。
异步I/O节省线程资源。
特别地,每当您通过同步I/O处理一些客户机请求时,您为它分配1个线程。当你有一个客户端时,它工作得很好。或者10个客户。
如果你有10000个客户端,你必须创建10K个线程来为他们服务。这是可能的,但在许多情况下效率低下。
使用异步I/O允许在一个线程中处理大量客户端(具体数量取决于操作系统/体系结构)。通常这种方法只比专用线程对少数客户端慢一点(因为请求处理是序列化的),但在其他情况下吞吐量要好得多。
相关文章:
- Seg Fault Issue C++ (file IO / getline)
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 为什么在读取文件大小时文件IO速度会发生变化
- Agora.io 虚幻引擎插件构建错误
- 如何在C++中实现带有packaged_task的异步等待循环?
- 创建 Spdlog 异步文件记录器时遇到困难
- C ++异步键盘输入(标准方式)
- 不将数据 socket.io c++(客户端)发送到 nodejs(服务器)socket.io
- ASIO signal_set多个 IO 线程不可靠,具体取决于代码顺序?
- C++中真正的异步文件 IO
- 为什么在读取非HTTP服务器的套接字时需要异步IO
- 未收到C++Windows异步IO命名管道的第一条消息
- 处理一个套接字和多个线程时异步 IO 的用例
- C++11中的异步IO
- 子进程的异步双向IO重定向
- 由于在C++中使用了异步IO,因此在不休眠的情况下延迟程序的其他方法
- Linux异步IO与libaio性能问题
- c++的非线程异步IO简介
- 为什么首选异步IO