IO多路复用 到底是阻塞还是非阻塞

IO多路复用中提到:
"用户进程通过调用select/poll/epoll去处理socket请求的时候, select/poll/epoll由于是阻塞的,所以导致用户进程阻塞;而select/poll/epoll处理的socket用的是非阻塞;"

那么问题来了,反正最终都会导致用户的进程阻塞, 那么select/poll/epoll处理的进程到底是阻塞还是非阻塞有什么意义呢?

阅读 14.6k
3 个回答

https://segmentfault.com/a/11... 文章中说的很清楚select/poll/epoll,一个进程监听多个Socket状态的时候是阻塞的,如果有就绪的Socket就会返回就绪状态,这时候就会从阻塞态转换到正常状态,如果业务处理完成又会回到阻塞态,继续等待下个就绪状态。一个进程接收多个Socket的数据,以免一个Socket对一个进程导致线性资源(内存)开销。select/poll/epoll仅仅是查询多路IO的状态方式

客户端发起请求,一直等待服务端的响应,这是同步的,否则就是异步的。

同步的话,客户端一直就是阻塞的状态。

如果服务端有比较耗时的操作,比如IO,服务端的程序要阻塞在那,等IO完成后,再把结果返回给客户端。这时服务端是一直阻塞在那的,没法响应其他客户端的请求。那怎么办呢?

于是就有了select/poll/epoll这些东西,这样服务端就不会阻塞在那了,而是交给了select/poll/epoll

UNIX网络编程里有两张图上比如清晰:

图片描述
图片描述

I/O多路复用并不是非阻塞,只是他可以同时处理多个链接,原来单路的话是一个处理完才能接入新的连接,多路复用就是可以同时接入多个连接。。主要的差别是这样,多路复用只要新连接数据准备好就可以返回,然后会记录所有接入连接的信息,处理完返回响应的。。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏