select和poll都只提供了一个函数:select或者poll函数。

而epoll提供了三个函数,epoll_create,epoll_ctl和epoll_wait,epoll_create是创建一个epoll句柄;epoll_ctl是注册要监听的事件类型;epoll_wait则是等待事件的产生。

epoll除了提供select/poll那种IO事件的水平触发(Level Triggered)外,还提供了边缘触发(Edge Triggered),这就使得用户空间程序有可能缓存IO状态,减少epoll_wait/epoll_pwait的调用,提高应用程序效率。

水平触发(level-trggered)

只要文件描述符关联的读内核缓冲区非空,有数据可以读取,就一直发出可读信号进行通知,

当文件描述符关联的内核写缓冲区不满,有空间可以写入,就一直发出可写信号进行通知

LT模式支持阻塞和非阻塞两种方式。epoll默认的模式是LT。

边缘触发(edge-triggered)

当文件描述符关联的读内核缓冲区由空转化为非空的时候,则发出可读信号进行通知,

当文件描述符关联的内核写缓冲区由满转化为不满的时候,则发出可写信号进行通知

两者的区别在哪里呢?水平触发是只要读缓冲区有数据,就会一直触发可读信号,而边缘触发仅仅在空变为非空的时候通知一次,

LT(level triggered)是缺省的工作方式,并且同时支持block和no-block socket.在这种做法中,内核告诉你一个文件描述符是否就绪了,然后你可以对这个就绪的fd进行IO操作。如果你不作任何操作,内核还是会继续通知你的,所以,这种模式编程出错误可能性要小一点。传统的select/poll都是这种模型的代表.

水平触发和边缘触发模式区别

读缓冲区刚开始是空的

读缓冲区写入2KB数据

水平触发和边缘触发模式此时都会发出可读信号

收到信号通知后,读取了1kb的数据,读缓冲区还剩余1KB数据

水平触发会再次进行通知,而边缘触发不会再进行通知

所以,边缘触发需要一次性的把缓冲区的数据读完为止,也就是一直读,直到读到EGAIN为止,EGAIN说明缓冲区已经空了,因为这一点,边缘触发需要设置文件句柄为非阻塞

//水平触发

ret = read(fd, buf, sizeof(buf));

//边缘触发

while(true) {

ret = read(fd, buf, sizeof(buf);

if (ret == EAGAIN) break;

}

设置方法

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

epoll的事件注册函数,它不同与select()是在监听事件时告诉内核要监听什么类型的事件,而是在这里先注册要监听的事件类型。

第一个参数是epoll_create()的返回值,

第二个参数表示动作,用三个宏来表示:

EPOLL_CTL_ADD:注册新的fd到epfd中;

EPOLL_CTL_MOD:修改已经注册的fd的监听事件;

EPOLL_CTL_DEL:从epfd中删除一个fd;

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

struct epoll_event {

__uint32_t events; /* Epoll events /

epoll_data_t data; / User data variable */

};

events可以是以下几个宏的集合:

EPOLLIN :表示对应的文件描述符可以读(包括对端SOCKET正常关闭);

EPOLLOUT:表示对应的文件描述符可以写;

EPOLLPRI:表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来);

EPOLLERR:表示对应的文件描述符发生错误;

EPOLLHUP:表示对应的文件描述符被挂断;

EPOLLET: 将EPOLL设为边缘触发(Edge Triggered)模式,这是相对于水平触发(Level Triggered)来说的。

EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里。

使用示例

使用ET的例子:nginx

使用LT的例子:redis

epoll边缘触发_4.2.3、epoll:水平触发与边缘触发相关推荐

  1. epoll原理_彻底搞懂epoll高效运行的原理

    前言 这篇文章读不懂的没关系,可以先收藏一下.笔者准备介绍完epoll和NIO等知识点,然后写一篇Java网络IO模型的介绍,这样可以使Java网络IO的知识体系更加地完整和严谨.初学者也可以等看完I ...

  2. python epoll多路复用技术_python IO 多路复用 epoll简单模型

    IO多路复用就是我们说的select poll epoll 通过一种机制使一个进程能同时等待多个文件描述符,而这些文件描述符(套接字描述符)其中的任意一个进入读就绪状态,epoll()函数就可以返回. ...

  3. 图解 epoll 是如何工作的及epoll实现原理

    本文包含以下内容: epoll是如何工作的 本文不包含以下内容: epoll 的用法 epoll 的缺陷 epoll实现原理由视频讲解: C/C++ Linux服务器开发高级架构学习视频点击:C/C+ ...

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

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

  5. js 手机端触发事事件、javascript手机端/移动端触发事件

    处理Touch事件能让你跟踪用户的每一根手指的位置.你可以绑定以下四种Touch事件: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...

  6. Go 触发 GC 的时机有哪些?能手动触发吗?

    Go 语言作为一门新语言,在早期经常遭到唾弃的就是在垃圾回收(下称:GC)机制中 STW(Stop-The-World)的时间过长. 那么这个时候,我们又会好奇一点,作为 STW 的起始,Go 语言中 ...

  7. 20. GD32F103C8T6入门教程-adc使用外部中断IT11触发启动adc规则通道,使用外中断IT15触发注入组

    adc 使用教程6-使用外部中断IT11触发启动adc规则通道,使用外中断IT15触发注入组 ADC支持18个多路通道,可以把转换组织成两组:一个规则组通道和一个注入组通道 规则组,可以按照特定的序列 ...

  8. 边缘云服务器招募,新华三入围中国联通首批边缘云服务器常态化招募企业名单,全面助力中国联通边缘云建设...

    原标题:新华三入围中国联通首批边缘云服务器常态化招募企业名单,全面助力中国联通边缘云建设 近日,为了加快通信云边缘基础设施的建设,中国联通对边缘云服务器进行常态化招募,并且依据<中国联通边缘云服 ...

  9. 边缘计算浅析 | 新基建来了!5G边缘计算如何展现勃勃生机?

    最近"新基建"是个热词,那么新基建到底是什么?与之紧密相关的5G何去何从?这给边缘计算带来了什么机遇?边缘计算的生态产业链条是怎样的?它的典型特征和经济效益是什么?本文将为大家带来 ...

最新文章

  1. 拥抱对手 微软崛起或靠“云计算”业务
  2. C++11:move移动语义
  3. Python3 - 时间处理与定时任务
  4. 查看linux版本的三种常用方法
  5. Vue3 Composition API(一)——setup、reactive、ref、readonly
  6. 提高tomcat的并发能力
  7. 磁盘配额超出 linux,使用linux的warnquota命令发送邮件给超出配额的用户
  8. 程序员内卷?连熬数夜肝出这份2021Java面试题核心知识点总结,近300页!
  9. sum problem
  10. 如何找mysql8.0的rpm安装包_centos7上mysql8.0rpm方式安装
  11. ADSL防御黑客进攻的方法
  12. 初测ONES项目管理工具,寻求与众不同
  13. 工期计算机在线,工期日历计算器
  14. 新型冠状病毒SIR预测模型,MATLAB代码
  15. 如何借助分布式存储 JuiceFS 加速 AI 模型训练
  16. scala 编程(其五)集合,交差交差集
  17. apex英雄哪个服务器稳定,apex英雄哪个服务器好
  18. 做锤子区块链手机的4种方法(行业观察)
  19. 阿德莱德计算机科学专业怎么样,阿德莱德大学计算机专业排名如何 排名多少...
  20. java过滤微信表情符号_微信隐藏彩蛋!表情加符号就能传递“神秘信息”

热门文章

  1. raptor累乘流程图_Markdown快速上手指南
  2. 重磅!吴恩达家的NLP课程发布啦!
  3. 还在随缘炼丹?一文带你详尽了解机器学习模型可解释性的奥秘
  4. 【重版】朴素贝叶斯与拣鱼的故事
  5. 人工智能大地图之分布式人工智能篇
  6. 研讨会 | 知识工程与问答技术研讨会 (KEQA2018)
  7. 如何恢复在 PyCharm 中误删的整个项目文件
  8. 深入解析Node.js setTimeout方法的执行过程
  9. chatbot2 RNN语言模型
  10. Java面试知识点:Object类、Math类、BigDecimal类、自动装箱、拆箱