IO多路复用中提到:
"用户进程通过调用select/poll/epoll去处理socket请求的时候, select/poll/epoll由于是阻塞的,所以导致用户进程阻塞;而select/poll/epoll处理的socket用的是非阻塞;"
那么问题来了,反正最终都会导致用户的进程阻塞, 那么select/poll/epoll处理的进程到底是阻塞还是非阻塞有什么意义呢?
IO多路复用中提到:
"用户进程通过调用select/poll/epoll去处理socket请求的时候, select/poll/epoll由于是阻塞的,所以导致用户进程阻塞;而select/poll/epoll处理的socket用的是非阻塞;"
那么问题来了,反正最终都会导致用户的进程阻塞, 那么select/poll/epoll处理的进程到底是阻塞还是非阻塞有什么意义呢?
客户端发起请求,一直等待服务端的响应,这是同步的,否则就是异步的。
同步的话,客户端一直就是阻塞的状态。
如果服务端有比较耗时的操作,比如IO,服务端的程序要阻塞在那,等IO完成后,再把结果返回给客户端。这时服务端是一直阻塞在那的,没法响应其他客户端的请求。那怎么办呢?
于是就有了select/poll/epoll这些东西,这样服务端就不会阻塞在那了,而是交给了select/poll/epoll
UNIX网络编程里有两张图上比如清晰:
I/O多路复用并不是非阻塞,只是他可以同时处理多个链接,原来单路的话是一个处理完才能接入新的连接,多路复用就是可以同时接入多个连接。。主要的差别是这样,多路复用只要新连接数据准备好就可以返回,然后会记录所有接入连接的信息,处理完返回响应的。。
2 回答3.1k 阅读✓ 已解决
1 回答1.4k 阅读✓ 已解决
1 回答1k 阅读✓ 已解决
1 回答1.3k 阅读✓ 已解决
2 回答1.2k 阅读
1 回答1.2k 阅读
1 回答1k 阅读
https://segmentfault.com/a/11... 文章中说的很清楚select/poll/epoll,一个进程监听多个Socket状态的时候是阻塞的,如果有就绪的Socket就会返回就绪状态,这时候就会从阻塞态转换到正常状态,如果业务处理完成又会回到阻塞态,继续等待下个就绪状态。一个进程接收多个Socket的数据,以免一个Socket对一个进程导致线性资源(内存)开销。select/poll/epoll仅仅是查询多路IO的状态方式