什么是Epoll?[面试6.5]

epoll有一个特殊内存由应用程序和内核共享,内核可以直接读取,避免了用户态内存向内核态拷贝的问题
epoll将Socket对应的文件描述符放到内核中,系统检测有事件发生时,通过回调通知进程执行,而不是采用轮询的方式

select,poll,epoll有什么区别?[面试6.5]

三种都是IO多路复用的实现
select:
select会维护文件描述符数据结构,且是遍历轮询文件描述符(fd),当量fd比较大时,轮询的效率会降低
select支持的文件描述符也有限制,默认是1024
每次调用select,都需要把fd(文件描述符)从用户态拷贝到内核态
poll:
和select基本一致,不同在于poll没有最大文件描述符数量的限制(因为poll基于链表实现)
epoll:
epoll是基于事件驱动的(事件通知机制),它是给套接字注册了一个回调函数,事件复杂度为O(1),因为只有活跃的socket才会主动调用callback
避免了用户态到内核态的拷贝
连接数有上限,1G内存的机器可以开10万个连接

epoll对文件描述符的操作有两种模式:
LT(水平触发level trigger): 默认模式,应用程序收到事件通知不立即读或写,若没有读或写,应用程序会一直收到事件通知
ET(边缘触发edge trigger): 应用程序收到事件通知后立即读或写,且一次事件只通知一次
注意: 连接数大时epoll性能最好,但在连接数少并且连接都十分活跃的情况下,select和poll的性能可能比epoll好,因为epoll的通知机制需要很多函数回调