IO多路复用为什么会使用非阻塞IO

在上面两个问题中,题主认为,基于select对套接字进行监测时,如果返回,说明存在数据可读,read不会被阻塞,不需要使用unblocking IO?

select和read两个操作相互独立且存在窗口,select返回可读并不能保证read一定可读,存在多种情况,select返回可读,但是read无数据可读
  • 多进程同时对某个socket进行监听,当新的连接完成3次握手后,进程均被select,epoll唤醒,但是最后只有1个进程可以accept,没能accept的进程被block
  • 某个socket接收缓冲区有新数据分节到达,然后select报告这个socket描述符可读,但随后,协议栈检查到这个新分节检验和错误,然后丢弃这个分节,这时候调用read则无数据可读
  • 边缘触发环境,由于无法知道多少数据可读,所以accept1次后,第二次尝试accept可能会被阻塞,此时应该使用非阻塞IO
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容