为何使用IOCP?

时间:2015-05-28 08:34:59

标签: c sockets winapi iocp overlapped-io

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

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

使用IOCP还有哪些其他原因?

2 个答案:

答案 0 :(得分:1)

IOCP具有您提到的好处,但并非IOCP独有。我不熟悉本机套接字API,但有些Win32 API具有“重叠IO”,这是异步的,但不需要IOCP。

另一个好处是,对于IOCP,请求服务线程的数量是由内核优化的(种类)。内核知道请求服务线程所做的所有阻塞,并且它会看到有足够的线程,而不是更多的线程一直未被阻塞,以便CPU得到充分利用。理想情况下,您永远不会阻塞,并且会有与核心一样多的线程(假设100%负载)。这将是非常有效的。

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

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

答案 1 :(得分:1)

此外,它还减少了可避免的批量数据复制和保护环周期。当recv()调用请求时,内核不必将数据从网络堆栈缓冲区复制到用户空间缓冲区,而是由WSARecv()提供用户空间缓冲区,然后堆栈可以直接在内核空间中加载它们。