阻塞与非阻塞winsock的速度/性能特征
Posted
技术标签:
【中文标题】阻塞与非阻塞winsock的速度/性能特征【英文标题】:Speed/Performance Characteristics of blocking vs Non-Blocking winsock 【发布时间】:2012-12-19 06:57:19 【问题描述】:阻塞和非阻塞 Winsock TCP 套接字在速度或性能上是否存在差异? 我可以得到这两种插座的差异,但两种类型之间没有详细的性能比较。
【问题讨论】:
如果有的话,我会将这个问题标记为 C 而不是 C++。 【参考方案1】:因为它与速度无关。 write
和 read
操作只是变相的内存复制。他们所做的只是分别将数据复制到内核和从内核复制数据。 IE。 他们实际上并不发送或接收任何东西。
阻塞 vs 非阻塞特性问:你喜欢这些操作阻塞直到完成还是返回 -1 和 EAGAIN
以防它们不能立即执行?例如,您从套接字读取,但接收缓冲区中没有任何内容。你更喜欢让recv
挂起直到有事情发生,还是返回-1 EAGAIN
?
【讨论】:
感谢赐教。 这完全是 IOCP 的伪装,其中用户缓冲区指针数组通过 WSASend/WSARecv 调用与内核通信。仍然有一些数据移动,但我猜测 NIC 硬件缓冲区可以直接 DMA 进入用户空间缓冲区 - 减少了一层痛苦的复制。 系统调用可能非常昂贵,即使底层的最终操作是处理内存。【参考方案2】:根据我的经验,非阻塞 winsock 操作速度稍慢,但可扩展性更高。事实上,当您执行非阻塞 I/O(使用 IOCP)时,您需要进行两次系统调用和一些应用程序级别的调度,如果使用阻塞 I/O,则需要进行一次系统调用。如果您有许多并发连接,非阻塞 I/O 会更快,因为如果实施得当,架构可扩展性更高。
如果您需要以最大带宽从点到点传输数据,请使用阻塞 I/O。如果您需要处理许多并发客户端连接 - 使用非阻塞 I/O。不要对他们中的任何一个期望过高。
一般来说,这更多是关于“事件驱动与线程”的服务器架构,然后是“阻塞与非阻塞”。没有可以在任何情况下使用的通用服务器架构。这取决于应用程序。
【讨论】:
以上是关于阻塞与非阻塞winsock的速度/性能特征的主要内容,如果未能解决你的问题,请参考以下文章