前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多路复用技术 epoll 分析

多路复用技术 epoll 分析

作者头像
平凡的学生族
发布2019-11-07 14:15:47
2K0
发布2019-11-07 14:15:47
举报
文章被收录于专栏:后端技术后端技术

epoll的操作

代码语言:javascript
复制
int epoll_create(int size);  
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);  
int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout);  
  1. epoll_create: 建立一个epoll对象(在epoll文件系统中给这个句柄分配资源).
  2. 调用epoll_ctl向epoll对象中添加socket. 包含该socket的节点会被加入到一个红黑树上.
  3. 调用epoll_wait收集发生事件的连接. 触发了事件的链接会被放入一个双向链表.

epoll的结构与工作原理

  1. 红黑树. 用红黑树存储需要监听事件的socket.
    • epoll_ctl在向epoll对象中添加、修改、删除事件时,从rbr红黑树中查找事件也非常快
  2. 双向链表. 触发了监听事件的socket会被拷贝至此,等待用户处理。
    • 所有添加到epoll中的事件都会与设备(如网卡)驱动程序建立回调关系,也就是说相应事件的发生时会调用这里的回调方法。这个回调方法在内核中叫做ep_poll_callback,它会把这样的事件放到上面的rdllist双向链表中。

epoll的两种触发模式

epoll有EPOLLLT和EPOLLET两种触发模式,水平触发和边缘触发. 此处略

总结

  1. java nio是利用Selector多路复用来实现的.
    • linux2.x版本后,Selector是用epoll实现的.
    • 通过建立一个Selector, 可以在其上监听socket. 通过建立一个epoll对象,可以在其上为socket注册监听事件.
  2. linux epoll的常用函数是epoll_ctl, epoll_wait. 利用epoll_ctl可以为socket注册监听事件,并调用epoll_wait返回触发事件的socket.
    1. epoll_ctl监听socket时,会将该socket放入红黑树
    2. epoll_wait返回一个双向链表,其中包含了触发事件的socket.
    3. 所有添加到epoll中的事件都会与设备(如网卡)驱动程序建立回调关系,相应事件的发生时会调用回调方法ep_poll_callback.把socket放到rdllist双向链表中.

epoll与select poll的比较

  1. select poll是采用轮询方式, epoll采用回调的方式
  2. select poll每次等待socket事件,都需要把所有socket从用户态拷贝至内核态,epoll则只需将socket添加一次到红黑树上即可.
  3. select用数组来存放socket, 因此受到数量限制. poll用链表存放, epoll用红黑树存放, 因此不受数量限制.
  4. select、poll、epoll虽然都会返回就绪的文件描述符数量。但是select和poll并不会明确指出是哪些文件描述符就绪,而epoll会。造成的区别就是,系统调用返回后,调用select和poll的程序需要遍历监听的整个文件描述符找到是谁处于就绪,而epoll则直接处理即可。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • epoll的操作
  • epoll的结构与工作原理
  • epoll的两种触发模式
  • 总结
  • epoll与select poll的比较
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档