IO多路复用为什么会使用非阻塞IO
2018-05-08 本文已影响0人
rsliumin1994
- Question from 知乎(链接如下)
- 为什么 IO 多路复用要搭配非阻塞 IO?
- 在使用Multiplexed I/O的情况下,还有必要使用Non Blocking I/O么 ?
在上面两个问题中,题主认为,基于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