Linux 之 IO 多路复用
I/O 多路复用
I/O 多路复用
就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。- 单线程或单进程
同时监测若干个文件
描述符是否可以执行 I/O 操作的能力。 - Linux 下包括了三种:
select
,poll
,epoll
。
select => 时间复杂度 O(n)
- 它仅仅知道,有 I/O 事件发生,却并不知道是哪几个流。
- 我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。
- 所以
select
具有O(n)
的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长。
poll => 时间复杂度 O(n)
poll
本质上和select
没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个 fd 对应的设备状态。- 但是它没有最大连接数的限制,原因是它是基于链表来存储的。
epoll => 时间复杂度 O(1)
epoll
可以理解为event poll
,不同于盲轮询和无差别轮询,epoll
会把哪个流发生了怎样的 I/O 事件通知我们。- 所以我们说
epoll
实际上是事件驱动(每个事件关联上 fd),此时我们对这些流的操作都是有意义的。