Linux内核I/O 具体实现方式之epoll

Posted 白-胖-子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux内核I/O 具体实现方式之epoll相关的知识,希望对你有一定的参考价值。

epoll

  • epoll是Linux 2.6内核中提出的select和poll的增强版本
  • epoll库,是nginx服务器支持的最高性能的事件驱动库之一,是公认的非常优秀的事件驱动模型,
  • epoll与select和poll有很大的区别,epoll是poll的升级版,但是与poll有很大的区别.

五种io模型对比

epoll工作逻辑

  • epoll对I/O请求的处理方式是创建一个待处理的事件列表,然后把这个列表发给内核,返回的时候在去轮训检查这个表,以判断事件是否发生,
  • epoll支持一个进程打开的最大事件描述符的上限是系统可以打开的文件的最大数,
  • epoll库的I/O效率不随描述符数目增加而线性下降,因为它只会对内核上报的“活跃”的描述符进行操作。

epoll特性

  • 支持水平触发LT和边缘触发ET,最大的特点在于边缘触发,它只告诉进程哪些fd刚刚变为就需态,并且只会通知一次
  • 使用“事件”的就绪通知方式,通过epoll_ctl注册fd,一旦该fd就绪,内核就会采用类似callback的回调机制来激活该fd,epoll_wait便可以收到通知

epoll优点:

  • 没有最大并发连接的限制:能打开的FD的上限远大于1024(1G的内存能监听约10万个端口),具体查看/proc/sys/fs/file-max,此值和系统内存大小相关
  • 效率提升:非轮询的方式,不会随着FD数目的增加而效率下降;只有活跃可用的FD才会调用callback函数,
  • epoll最大的优点就在于它只管理“活跃”的连接,而跟连接总数无关
  • 内存拷贝,利用mmap(Memory Mapping)加速与内核空间的消息传递;即epoll使用mmap减少复制开销

epoll与select和poll的区别

  1. epoll只是一组API,比起select这种扫描全部的文件描述符,epoll只读取就绪的文件描述符,再加入基于事件的就绪通知机制,所以性能比较好
  2. 基于epoll的事件多路复用减少了进程间切换的次数,使得操作系统少做了相对于用户任务来说的无用功。
  3. epoll比select等多路复用方式来说,减少了遍历循环及内存拷贝的工作量,因为活跃连接只占总并发连接的很小一部分。

详细信息参见系统帮助

[root@centos8 ~]#whatis epoll
epoll (7) - I/O event notification facility
[root@centos8 ~]#whatis select
select (2) - synchronous I/O multiplexing
select (3) - synchronous I/O multiplexing
select (3p) - synchronous I/O multiplexing
[root@centos8 ~]#whatis poll
poll (2) - wait for some event on a file descriptor
poll (3p) - input/output multiplexing

以上是关于Linux内核I/O 具体实现方式之epoll的主要内容,如果未能解决你的问题,请参考以下文章

I/O多路复用之epoll

Linux I/O复用——epoll

socket编程:多路复用I/O服务端客户端之epoll

I/O多路复用之select,poll,epoll的区别

Linux高并发机制——epoll模型

I/O多路复用