您的位置 首页 ADAS

Linux中epoll IO多路复用机制

Linux中epoll IO多路复用机制-epoll 是Linux内核中的一种可扩展IO事件处理机制,最早在 Linux 2.5.44内核中引入,可被用于代替POSIX select 和 poll 系统调用,并且在具有大量应用程序请求时能够获得较好的性能( 此时被监视的文件描述符数目非常大,与旧的 select 和 poll 系统调用完成操作所需 O(n) 不同, epoll能在O(1)时间内完成操作,所以性能相当高),epoll 与 FreeBSD的kqueue类似,都向用户空间提供了自己的文件描述符来进行操作。

  epoll简介

  epoll 是Linux内核中的一种可扩展IO事情处理机制,最早在 Linux 2.5.44内核中引进,可被用于替代POSIX select 和 poll 体系调用,并且在具有许多应用程序恳求时能够取得较好的功能( 此刻被监督的文件描述符数目十分大,与旧的 select 和 poll 体系调用完结操作所需 O(n) 不同, epoll能在O(1)时刻内完结操作,所以功能适当高),epoll 与 FreeBSD的kqueue相似,都向用户空间供给了自己的文件描述符来进行操作。

  [cpp] view plaincopy

  int epoll_create(int size);

  创立一个epoll的句柄,size用来告知内核需求监听的数目一共有多大。当创立好epoll句柄后,它便是会占用一个fd值,在linux下假如检查/proc/进程id/fd/,是能够看到这个fd的,所以在运用完epoll后,有必要调用close() 封闭,不然或许导致fd被耗尽。

  [cpp]view plaincopy

  int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

  epoll的事情注册函数,第一个参数是 epoll_create() 的回来值,第二个参数表明动作,运用如下三个宏来表明:

  [cpp] view plaincopy

  EPOLL_CTL_ADD //注册新的fd到epfd中;

  EPOLL_CTL_MOD //修正现已注册的fd的监听事情;

  EPOLL_CTL_DEL //从epfd中删去一个fd;

  第三个参数是需求监听的fd,第四个参数是告知内核需求监听什么事,struct epoll_event 结构如下:

  [cpp] view plaincopy

  typedef union epoll_data

  {

  void *ptr;

  int fd;

  __uint32_t u32;

  __uint64_t u64;

  } epoll_data_t;

  struct epoll_event {

  __uint32_t events; /* Epoll events */

  epoll_data_t data; /* User data variable */

  };

  events 能够是以下几个宏的调集:

  [cpp] view plaincopy

  EPOLLIN //表明对应的文件描述符能够读(包含对端SOCKET正常封闭);

  EPOLLOUT //表明对应的文件描述符能够写;

  EPOLLPRI //表明对应的文件描述符有紧迫的数据可读(这儿应该表明有带外数据到来);

  EPOLLERR //表明对应的文件描述符产生过错;

  EPOLLHUP //表明对应的文件描述符被挂断;

  EPOLLET //将EPOLL设为边际触发(Edge Triggered)形式,这是相关于水平触发(Level Triggered)来说的。

  EPOLLONESHOT//只监听一次事情,当监听完这次事情之后,假如还需求继续监听这个socket的话,需求再次把这个socket加入到EPOLL行列里。

  当对方封闭衔接(FIN), EPOLLERR,都能够认为是一种EPOLLIN事情,在read的时分别离有0,-1两个回来值。

  [cpp] view plaincopy

  int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);

    参数events用来从内核得到事情的调集,maxevents 告之内核这个events有多大,这个 maxevents 的值不能大于创立 epoll_create() 时的size,参数 TImeout 是超时时刻(毫秒,0会当即回来,-1将不确认,也有说法说是永久堵塞)。该函数回来需求处理的事情数目,如回来0表明已超时。 咱们现在的网络模型大都是epoll的,由于epoll模型会比select模型功能高许多, 尤其在大衔接数的情况下,作为后台开发人员需求了解其间的原因。

  select/epoll的特色: select的特色:select 挑选句柄的时分,是遍历一切句柄,也便是说句柄有事情呼应时,select需求遍历一切句柄才干获取到哪些句柄有事情告诉,因而功率是十分低。可是假如衔接很少的情况下, select和epoll的LT触发形式比较, 功能上不同不大。 这儿要多说一句,select支撑的句柄数是有约束的, 一起只支撑1024个,这个是句柄调集约束的,假如超越这个约束,很或许导致溢出,并且十分不容易发现问题, TAF就呈现过这个问题, 调试了n天,才发现:)当然能够经过修正linux的socket内核调整这个参数。

  epoll的特色:epoll关于句柄事情的挑选不是遍历的,是事情呼应的,便是句柄上事情来就立刻挑选出来,不需求遍历整个句柄链表,因而功率十分高,内核将句柄用红黑树保存的。 关于epoll而言还有ET和LT的差异,LT表明水平触发,ET表明边际触发,两者在功能以及代码完成上不同也是十分大的。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/adas/99894.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部