我试图了解为什么使用IOCP。我可以想到两个原因:
WSARecv()
不会被阻止,所以我可以处理1000个客户端,而不必为每个客户端创建一个新线程(而且,可以创建的线程数是有限制的,因此可以处理的客户端数量将是有限的)。 WSASend()
不会阻塞,所以当我要发送大文件时,我不必创建新线程来发送它(如果我没有创建新线程,则UI线程当然会阻塞)。 还有其他使用IOCP的原因吗?
最佳答案
IOCP具有您提到的好处,但这并不是IOCP独有的。我对 native 套接字API不太熟悉,但是某些Win32 API具有“重叠的IO”,这是异步的,但不需要IOCP。
另一个好处是,使用IOCP,内核可以(某种程度上)优化请求服务线程的数量。内核知道请求服务线程会执行的所有阻塞操作,并且会发现有足够的线程(而不是更多)一直处于未阻塞状态,从而可以充分利用CPU。理想情况下,您将永远不会阻塞,线程数与内核数一样(假设负载为100%)。那将是非常有效的。
IOCP还有助于减少上下文切换,因为繁忙的现有线程已经简单地再次调用GetQueuedCompletionStatus
,而不是切换到另一个线程来处理IO的结果。GetQueuedCompletionStatusEx
可用于减少转换到内核的次数,因为您可以在一个调用中使多个IO出队。