c - 为什么使用IOCP?

标签 c sockets winapi iocp overlapped-io

我试图理解为什么使用 IOCP。我可以想到两个原因:

  • 由于 WSARecv() 不会阻塞,所以我可以处理 1000 个客户端,而不必为每个客户端创建一个新线程(而且,可以创建的线程数量是有限制的,因此您可以处理的客户数量将受到限制)。
  • 由于WSASend()不会阻塞,那么当我想发送一个大文件时,我不必创建一个新的线程来发送它(如果我没有创建一个新的线程那么 UI 线程当然会阻塞)。

使用 IOCP 的其他原因是什么?

最佳答案

IOCP 具有您提到的优点,但这并不是 IOCP 独有的。我对 native 套接字 API 不太熟悉,但某些 Win32 API 具有“重叠 IO”,这是异步的,但不需要 IOCP。

另一个好处是,使用 IOCP,请求服务线程的数量(在某种程度上)由内核优化。内核知道请求服务线程所做的所有阻塞,并且它会确保始终有足够而不是更多的线程处于解锁状态,以便充分利用 CPU。理想情况下,您永远不会阻塞,并且线程数与核心数一样多(假设 100% 负载)。这将是非常有效的。

IOCP 还有助于减少上下文切换,因为忙碌的现有线程无需切换到另一个线程来处理 IO 结果,只需再次调用 GetQueuedCompletionStatus

GetQueuedCompletionStatusEx 可用于减少到内核的转换次数,因为您可以在一次调用中使多个 IO 出列。

关于c - 为什么使用IOCP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30501256/

相关文章:

c - GCC -D 相当于 iarbuild.exe

c - C编程中的定点算法

php - 从 C 程序调用 PHP

c# AsyncSocket 服务器需要锁定?

scala - Scala中最简单的过程通讯形式

c++ - 显示带有来自资源的 PNG 图标的 Win32 弹出菜单

c - 循环遍历宏 Varargs 值

c - 如何获取服务器程序的 IP 地址?

c - 如何将返回的WndProc/DlgProc句柄转换为函数地址?

c# - AcquireCredentialsHandle 返回大量到期时间