Epoll技术深入学习

Epoll技术深入学习

一, Epoll概述

  • epoll就是一种典型的IO多路复用,支持高并发,号称一百万
    • 传统select, poll 在并发量1000-2000的时候性能明显下降
    • epoll是Linux内核2.6引入的技术。(kqueue类似,在其他系统中
  • 十万个连接同一时刻,只有几十上百个客户端给你发数据,epoll只处理这几十上百个连接
  • 很多服务器每个进程,或每个线程对应一个连接。涉及进程切换损坏
  • epoll事件驱动机制,在单独进程或线程单独运行。收集处理技术

二,Epoll的工作原理(三个函数)

  • epoll_create()
    • 原型:int epoll_create(int size)
    • 创建一个epoll对象,返回对象描述符
    • 最终要调用close(), 因为文件描述符 总是关闭的
    • 原理:
      • 创建一个eventpoll的结构对象。
        • rbr是一颗红黑树
        • rdlist结构代表一个双向链表表头指针,从头访问遍历每个元素
  • epoll_ctl()
    • 原型:int epoll_ctl(int efpd, int op, int sockid, struct epoll_event &event);
    • 功能:把感兴趣的事件添加到系统中去
    • efpd: 就是epoll_create返回的文件描述符
    • op: 动作,添加/删除/修改,对于1,2,3,当时系统有宏EPOLL_CTL_ADD,EPOLL_CTL_DEL,EPOLL_CTL_MOD
      • add 就是往红黑树上加结点。每次tcp连接获得一个socket,即红黑树的key
      • mod修改,
      • del删除,从红黑树把结点干掉,TCP连接上无法收到任何通知了
    • sockid: 一个客户端一个socket,就是accpet(); 就是红黑树的key
    • event:事件信息。
    • 原理:
      • 其实就是红黑树上的维护过程。
      • EPOLL_CTL_ADD: 往红黑树中增加结点
      • EPOLL_CTL_DEL: 往红黑树中删除结点
      • EPOLL_CTL_MOD: 往红黑树中修改结点
  • epoll_wait
    • 原型:int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout)
    • 阻塞一小段时间并等待事件发生,返回事件的集合。也就是获取内核通知事件
    • 把双向链表中移除(双向链表记录的是所有有数据的TCP连接)
    • efpd: 就是epoll_create返回的文件描述符
    • events: 数组,长度是maxevents。标示这一次epoll_wait收集到的事件数目。从双向链表中取节点
    • 一般有四种情况,操作系统会回调把事件插入到双向链表中
      • 完成三次握手,accept()。
      • 客户端关闭连接,close()。
      • 客户端发送数据来的时候。
      • 当可以发送数据的时候,服务器调用send(),write()。
      • 其他。。。

三,实际使用

epoll案例

四,LT和ET

  • LT(level trigger) 水平触发,低速效率差, 默认模式
  • ET(edge trigger) 边沿触发,高速模式(效率好)
  • 现状:
    • 所有的监听套接字都是水平触发
    • 所有的接入进来的用户套接字都是边缘触发

本质区别:

  • 水平触发: 来一个事件,如果你不处理它,那么这个事件就会一直触发;
  • 边缘触发: 只对非阻塞socket有用. 来一个事件,内核只通知一次.不管你是否处理
    • 代价: 编码的难度加大, 接到通知后要保证处理问题.
全部评论

相关推荐

程序员花海:实习太简单了 学历可以的 实习描述应该是先介绍业务 再介绍技术 技术咋推动业务的 做到了啥收益 有没有做实验 实验组和对照组有什么不同 你最后学到了什么 有没有参与处理过线上问题 有没有参与过公司的code review 有没有参与过技术分享 这些都是可以在实习描述中写的 并且实习和项目不一样不会撞车 应该放在最前面 放在教育背景下面 另外项目有点烂大街 可以看下我主页的简历优化案例
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务