1. 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...