2012-12-19 69 views

回答

7

因为它不是速度。操作writeread只是内存复制变相。他们所做的只是分别向内核和内核拷贝数据。即他们实际上不发送或接收任何东西

阻塞与非阻塞功能问:您是否喜欢这些操作阻塞直到完成或者返回-1和EAGAIN以防万一无法立即执行?例如,您从套接字中读取,但接收缓冲区中没有任何内容。你喜欢有recv悬挂,直到有东西出现或返回-1 EAGAIN

+0

感谢您的启发。 –

+0

这是IOCP的伪装,用户缓冲区指针数组通过WSASend/WSARecv调用进入内核。仍然有一些数据移动,但我猜测NIC硬件缓冲区可以直接DMA到用户空间缓冲区 - 切断一个级别的悲惨复制。 –

6

根据我的经验,非阻塞winsock操作稍微慢一些,但更具可扩展性。事实是,如果您使用阻塞I/O,则在执行非阻塞I/O(使用IOCP时)和一次系统调用时,您需要进行两次系统调用以及应用程序级别的一些调度。如果你有很多并发连接,非阻塞I/O要快得多,因为如果实现得好,可扩展的体系结构将更加灵活。

如果您需要以最大带宽从点到点传输数据 - 请使用阻止I/O。如果您需要处理许多并发的客户端连接 - 请使用非阻塞I/O。不要期望太多。

一般来说,这更多的是“事件驱动vs线程”服务器架构,然后是“阻塞vs非阻塞”。没有可用于任何情况的通用服务器体系结构。这取决于应用程序。