阻塞与非阻塞winsock的速度/性能特征

Posted

技术标签:

【中文标题】阻塞与非阻塞winsock的速度/性能特征【英文标题】:Speed/Performance Characteristics of blocking vs Non-Blocking winsock 【发布时间】:2012-12-19 06:57:19 【问题描述】:

阻塞和非阻塞 Winsock TCP 套接字在速度或性能上是否存在差异? 我可以得到这两种插座的差异,但两种类型之间没有详细的性能比较。

【问题讨论】:

如果有的话,我会将这个问题标记为 C 而不是 C++。 【参考方案1】:

因为它与速度无关。 writeread 操作只是变相的内存复制。他们所做的只是分别将数据复制到内核和从内核复制数据。 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的速度/性能特征的主要内容,如果未能解决你的问题,请参考以下文章

简单测试Java线程安全中阻塞同步与非阻塞同步性能

关于异步,同步,阻塞与非阻塞

Reactor和Proactor模式的讲解(关于异步,同步,阻塞与非阻塞)

Verilog -- 阻塞与非阻塞的仿真与综合

阻塞赋值与非阻塞赋值(转载)

聊聊同步异步阻塞与非阻塞