我试图理解为什么使用 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/