当前位置:嗨网首页>书籍在线阅读

14-epoll编程接口

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

63.4 epoll编程接口

同I/O多路复用和信号驱动I/O一样,Linux的epoll(event poll)API可以检查多个文件描述符上的I/O就绪状态。epoll API的主要优点如下。

  • 当检查大量的文件描述符时,epoll的性能延展性比select()和poll()高很多。
  • epoll API既支持水平触发也支持边缘触发。与之相反,select()和poll()只支持水平触发,而信号驱动I/O只支持边缘触发。

性能表现上,epoll同信号驱动I/O相似。但是,epoll有一些胜过信号驱动I/O的优点。

  • 可以避免复杂的信号处理流程(比如信号队列溢出时的处理)。
  • 灵活性高,可以指定我们希望检查的事件类型(例如,检查套接字文件描述符的读就绪、写就绪或者两者同时指定)。

epoll API是 Linux 系统专有的,在2.6版中新增。

epoll API的核心数据结构称作 epoll 实例,它和一个打开的文件描述符相关联。这个文件描述符不是用来做 I/O 操作的,相反,它是内核数据结构的句柄,这些内核数据结构实现了两个目的。

  • 记录了在进程中声明过的感兴趣的文件描述符列表——interest list(兴趣列表)。
  • 维护了处于I/O就绪态的文件描述符列表——ready list(就绪列表)。

ready list中的成员是interest list的子集。

对于由 epoll 检查的每一个文件描述符,我们可以指定一个位掩码来表示我们感兴趣的事件。这些位掩码同poll()所使用的位掩码有着紧密的关联。

epoll API由以下 3 个系统调用组成。

  • 系统调用epoll_create()创建一个epoll实例,返回代表该实例的文件描述符。
  • 系统调用epoll_ctl()操作同epoll实例相关联的兴趣列表。通过epoll_ctl(),我们可以增加新的描述符到列表中,将已有的文件描述符从该列表中移除,以及修改代表文件描述符上事件类型的位掩码。
  • 系统调用epoll_wait()返回与epoll实例相关联的就绪列表中的成员。