共计 812 个字符,预计需要花费 3 分钟才能阅读完成。
- epoll、poll、select 的区别?
目前的罕用的 IO 复用模型有三种:select,poll,epoll。
==================================
(1)select==> 工夫复杂度 O(n)
它仅仅晓得了,有 I / O 事件产生了,却并不知道是哪那几个流(可能有一个,多个,甚至全副),咱们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以 select 具备 O(n) 的无差别轮询复杂度,同时解决的流越多,无差别轮询工夫就越长。
(2)poll==> 工夫复杂度 O(n)
poll 实质上和 select 没有区别,它将用户传入的数组拷贝到内核空间,而后查问每个 fd 对应的设施状态,然而它没有最大连接数的限度,起因是它是基于链表来存储的.
(3)epoll==> 工夫复杂度 O(1)
epoll 能够了解为 event poll,不同于忙轮询和无差别轮询,epoll 会把哪个流产生了怎么的 I / O 事件告诉咱们。所以咱们说 epoll 实际上是 事件驱动(每个事件关联上 fd)的,此时咱们对这些流的操作都是有意义的。(复杂度升高到了 O(1))
select,poll,epoll 都是 IO 多路复用的机制。I/ O 多路复用就通过一种机制,能够监督多个描述符,一旦某个描述符就绪(个别是读就绪或者写就绪),可能告诉程序进行相应的读写操作。但 select,poll,epoll 实质上都是同步 I /O,因为他们都须要在读写事件就绪后本人负责进行读写,也就是说这个读写过程是阻塞的,而异步 I / O 则无需本人负责进行读写,异步 I / O 的实现会负责把数据从内核拷贝到用户空间。
epoll 跟 select 都能提供多路 I / O 复用的解决方案。在当初的 Linux 内核里有都可能反对,其中 epoll 是 Linux 所特有,而 select 则应该是 POSIX 所规定,个别操作系统均有实现
参考
https://www.cnblogs.com/fnlin…