epoll是一种网络IO多路复用的IO。主要用来处理网络IO的。解决了select,poll在面对大规模网络编程的时候的性能瓶颈。在很多开源的软件都有使用到。例如redis,nginx,memcached等。

1 epoll模型案例

epoll模型可以理解为快递员,丰巢,小区的关系。具体关系如下图:

2 基本系统调用接口:

//创建epoll句柄

int epoll_create(int size);

返回值:一个epoll句柄,后面操作epoll全部通过这个句柄来操作
size: >0成功,0失败。 猜想之前epoll实现,是采用的连续空间,所以才有epoll处理的大小。现在是采用红黑树和链表无限大的空间来处理。

//epoll事件注册函数

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

epfd:epoll_create创建的句柄
op:管理事件的动作,增删改三种操作,用三个宏表示
EPOLL_CTL_ADD 注册新的 fd到epfd
EPOLL_CTL_MOD 修改已经注册的fd的监听事件
EPOLL_CTL_DEL 从epfd中删除一个fd
fd:需要监听的fd
events:告诉内核需要监听的事,结构体如下

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常用的几个宏事件:
EPOLLIN 可读
EPOLLOUT 可写
EPOLLERR 紧急可读
EPOLLPRI 错误
EPOLLHUP 文件描述符挂起
EPOLLET 设置为边缘触发
EPOLLONESHOT 只监听一次

//事件处理函数

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

epfd: epoll句柄,也是epoll_create创建的。
events:就绪可以操作的事件
maxevents:一次能从内核中拿去的就绪fd最大个数
timeout::超时时间,此函数会条件阻塞类似pthread_cond_wait()函数,满足条件就会触发,超时最大时间。

3 底层原理实现:


epoll_create()系统调用,在内核创建了一个红黑树,专门用来管理socket,一个结点对应一个socket。
epoll_ctl()系统调用:就是添加,删除,修改红黑树的结点。
epoll_wait()系统调用:从就绪列表中拿出就绪的socket返回给用户进程。
红黑树和链表结构用的结点是同一个,当某个socket有数据读写时候,就会将红黑树的结点加入到就绪链表中

4 两种工作模式LT、ET:

定义
LT:水平触发,有数据一直触发,一次性读完,一但recvbuffer有Data就会一直触发。
ET:边沿触发,recvbuffer从无到有Data才触发,即使未读完,下次也不会在触发了。
epoll默认的工作模式是LT,可通过设置为EPOLLET宏改变为边沿触发。没有EPOLLLT宏。
应用场景:
ET:主要用于在小块Data传输,需要设置循环读。因为内核只触发一次,所以需要将应用程序中操作设置循环读。若传输大块data,单个io可能会阻塞。
LT:用于大块Data传输,当有Data时候,就一直触发。问题最大传输限制是多大?自己设置过1个G了的。
注意:ET+ (应用程序)循环读 等价于 LT+ 一次性读.
关于listenfd就是socket产生的fd,用LT模式比较适合。如果采用ET的话,在使用可能会阻塞。

5 epoll编程实现

简答的时间服务器接收数据。流程如下

完整代码参考:https://github.com/hengfengyaoren/NetCode/tree/main/epoll

epoll原理与实现相关推荐

  1. Socket IO多路复用: epoll原理图解

    目录 一.accept 创建新 socket 1.1 初始化 struct socket 对象 1.2 为新 socket 对象申请 file 1.3 接收连接 1.4 添加新文件到当前进程的打开文件 ...

  2. Epoll原理深入分析

    原文: https://rebootcat.com/2020/09/26/epoll_cookbook/ Epoll 的出现 想必能搜到这篇文章的,应该对 select/poll 有一些了解和认识,一 ...

  3. 说得清的Epoll原理

    分享一篇epoll原理文章,自认为说得很透彻呢. 本文核心思想是:要让读者清晰明白 Epoll 为什么性能好. 文章会从网卡接收数据的流程讲起,串联起 CPU 中断.操作系统进程调度等知识:再一步步分 ...

  4. epoll LT ET 区别 | Nginx epoll 原理 listend 用 LT

    最近学 muduo 和 nginx 写网络库,总结一下 epoll 上遇到的一些问题和学习的笔记,主要是对 LT.ET 和平滑升级里的一些点理解一下.可以看作是上一次根据2.6 源码写的意识流(大白话 ...

  5. epoll原理剖析以及reactor模型应用丨网络编程|网络IO|select|poll|socket|reactor多核实现丨c/c++linux服务器开发

    epoll原理剖析以及reactor模型应用 视频讲解如下,点击观看: epoll原理剖析以及reactor模型应用丨网络编程|网络IO|select|poll|socket|reactor多核实现丨 ...

  6. 详情讲述Linux网络编程关注的问题丨epoll原理丨reactor模型丨三次挥手丨四次握手丨多线程丨单线程丨C/C++Linux丨C++后端开发

    90分钟搞懂linux网络编程关注的问题 1. 三次挥手,四次握手 2. epoll实现原理剖析 3. reactor模型封装 单线程.多线程以及多进程 视频讲解如下,点击观看: 详情讲述Linux网 ...

  7. 详解 epoll 原理【Redis,Netty,Nginx实现高性能IO的核心原理】

    epoll原理剖析:epoll原理剖析以及reactor模型应用 redis源码分析:redis源码分析及driver现实 Nginx模块开发:Nginx源码从模块开发入手,3个项目弄透nginx模块 ...

  8. 基于linux epoll网络编程细节处理丨epoll原理剖析

    epoll原理剖析以及三握四挥的处理 1. epoll原理详解 2. 连接的创建与断开 3. epoll如何连接细节问题 视频讲解如下,点击观看: 基于linux epoll网络编程细节处理丨epol ...

  9. epoll原理剖析以及reactor模型应用

    epoll原理剖析以及reactor模型应用 1. epoll原理剖析  2. 单reactor原理以及应用  3. 多reactor原理以及应用 视频讲解如下,点击观看: epoll原理剖析以及re ...

  10. linux中epoll原理,linux epoll epoll的原理

    epoll原理简述:epoll = 一颗红黑树 + 一张准备就绪句柄链表 + 少量的内核cache select/poll 每次调用时都要传递你所要监控的所有socket给select/poll系统调 ...

最新文章

  1. 【java】异常的分类
  2. 回调函数在MFC中的使用
  3. ARM裸机开发环境搭建
  4. java代码没错却运行不了_Java代码没错误,tomcat能正常运行,但是我的项目主页却一直显示不了,显示404错误...
  5. 【SSH】禁用root远程、修改ssh端口
  6. Java路径问题最终解决方案
  7. 第五届省赛(软件类)真题----Java大学B组答案及解析
  8. STM32:GPIO四种输入输出模式。
  9. java.sql.SQLException: Access denied for user ‘root‘@‘hadoop001‘ (using password: YES)
  10. optenstack配置glance
  11. python批量删除文件名_用python批量删掉文件名中共同存在的字符
  12. 2021-08-22监听器实现在线客户端统计
  13. SPSS中有关相关性分析的介绍(双变量相关分析、偏相关)
  14. 视频云web播放器样式和组件自定义
  15. 熊言乱语 | 第33届浙江省青少年科技创新大赛获奖作品赏析
  16. 计算机鼠标不灵活怎么办,鼠标不灵怎么办 鼠标不灵的常见解决方法
  17. STM32多通道DMA—ADC采样
  18. 经常问到的前端面试题
  19. 设置笔记本电脑插入USB鼠标时,自动禁用触摸板
  20. NDK中LOCAL_SHARED_LIBRARIES

热门文章

  1. 一面准备:项目经历、开放问题回答、基础
  2. 运行HiAi通用文字识别demo
  3. python可视化库总结_Python 可视化库 - Matplotlib 使用总结
  4. ISE 14.7初次上手(Virtex-6 ML605 实现拨码开关LED--VHDL)
  5. 【软件工程】用户界面设计
  6. 最新QS世界大学排名揭榜!清华超越耶鲁、哥大
  7. Android 框架学习4:一次读懂热门图片框架 Picasso 源码及流程
  8. java计算矩形的面积和周长的方法
  9. Apache Druid RCE(CVE-2021-25646)复现
  10. php lvs负载均衡,LVS负载均衡LAMP平台