I/O多路复用
I/O多路复用
什么是IO多路复用
一句话解释:单线程或者单进程同时监控若干个文件描述符是否可执行IO操作的能力。
用来解决什么问题
应用程序通常需要处理多条事件流中的事件,比如,电脑同时需要处理键盘鼠标的输入,再比如,Nginx同时处理来自N个的用户请求。
而单核cpu在同一时刻只能做一件事。一种解决办法是对cpu进行分时复用(多个事件流将cpu分成多个时间片,不同事件流的时间片交替执行)这样多个事件流就可以并发执行,不需要一个等待另一个太久,在用户看来,他们似乎就是并行在做一样。
IO多路复用就是在单线程/进程中处理多个时间流的一种解决方法。本质在于用更少的资源完成更多的事。
Linux中的五种IO模型
阻塞IO
非阻塞IO
IO多路复用
信号驱动IO
异步IO
Linux上IO多路复用解决方案
select、poll、epoll
redis、nginx在linux系统中用到的就是epoll,如果没有epoll,就会用select
不同IO多路复用方案优缺点
poll vs select
poll和select基本上是一样的,poll相比select好在如下几点:
- poll传参对用户更友好。比如不需要和select一样计算很多奇怪的参数比如nfds(值最大的文件描述符+1),再比如不需要分开三组传入参数。
- poll会比select性能稍好些,因为select是每个bit位都检测,假设有个值为1000的文件描述符,select会从第一位开始检测一直到第1000个bit位。但poll检测的是一个数组。
- select的时间参数在返回的时候各个系统的处理方式不统一,如果希望程序可移植性更好,需要每次调用select都初始化时间参数。
而select比poll好在下面几点
- 支持select的系统更多,兼容更强大,有一些unix系统不支持poll
- select提供精度更高(到microsecond)的超时时间,而poll只提供到毫秒的精度。
但总体而言 select和poll基本一致。
epoll vs poll&select
epoll优于select&poll在下面几点:
- 在需要同时监听的文件描述符数量增加时,select&poll是O(N)的复杂度,epoll是O(1),在N很小的情况下,差距不会特别大,但如果N很大的前提下,一次O(N)的循环可要比O(1)慢很多,所以高性能的网络服务器都会选择epoll进行IO多路复用。
- epoll内部用一个文件描述符挂载需要监听的文件描述符,这个epoll的文件描述符可以在多个线程/进程共享,所以epoll的使用场景要比select&poll要多。
浙公网安备 33010602011771号