epoll边缘触发_4.2.3、epoll:水平触发与边缘触发
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:水平触发与边缘触发相关推荐
- epoll原理_彻底搞懂epoll高效运行的原理
前言 这篇文章读不懂的没关系,可以先收藏一下.笔者准备介绍完epoll和NIO等知识点,然后写一篇Java网络IO模型的介绍,这样可以使Java网络IO的知识体系更加地完整和严谨.初学者也可以等看完I ...
- python epoll多路复用技术_python IO 多路复用 epoll简单模型
IO多路复用就是我们说的select poll epoll 通过一种机制使一个进程能同时等待多个文件描述符,而这些文件描述符(套接字描述符)其中的任意一个进入读就绪状态,epoll()函数就可以返回. ...
- 图解 epoll 是如何工作的及epoll实现原理
本文包含以下内容: epoll是如何工作的 本文不包含以下内容: epoll 的用法 epoll 的缺陷 epoll实现原理由视频讲解: C/C++ Linux服务器开发高级架构学习视频点击:C/C+ ...
- 基于linux epoll网络编程细节处理丨epoll原理剖析
epoll原理剖析以及三握四挥的处理 1. epoll原理详解 2. 连接的创建与断开 3. epoll如何连接细节问题 视频讲解如下,点击观看: 基于linux epoll网络编程细节处理丨epol ...
- 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 ...
- Go 触发 GC 的时机有哪些?能手动触发吗?
Go 语言作为一门新语言,在早期经常遭到唾弃的就是在垃圾回收(下称:GC)机制中 STW(Stop-The-World)的时间过长. 那么这个时候,我们又会好奇一点,作为 STW 的起始,Go 语言中 ...
- 20. GD32F103C8T6入门教程-adc使用外部中断IT11触发启动adc规则通道,使用外中断IT15触发注入组
adc 使用教程6-使用外部中断IT11触发启动adc规则通道,使用外中断IT15触发注入组 ADC支持18个多路通道,可以把转换组织成两组:一个规则组通道和一个注入组通道 规则组,可以按照特定的序列 ...
- 边缘云服务器招募,新华三入围中国联通首批边缘云服务器常态化招募企业名单,全面助力中国联通边缘云建设...
原标题:新华三入围中国联通首批边缘云服务器常态化招募企业名单,全面助力中国联通边缘云建设 近日,为了加快通信云边缘基础设施的建设,中国联通对边缘云服务器进行常态化招募,并且依据<中国联通边缘云服 ...
- 边缘计算浅析 | 新基建来了!5G边缘计算如何展现勃勃生机?
最近"新基建"是个热词,那么新基建到底是什么?与之紧密相关的5G何去何从?这给边缘计算带来了什么机遇?边缘计算的生态产业链条是怎样的?它的典型特征和经济效益是什么?本文将为大家带来 ...
最新文章
- 拥抱对手 微软崛起或靠“云计算”业务
- C++11:move移动语义
- Python3 - 时间处理与定时任务
- 查看linux版本的三种常用方法
- Vue3 Composition API(一)——setup、reactive、ref、readonly
- 提高tomcat的并发能力
- 磁盘配额超出 linux,使用linux的warnquota命令发送邮件给超出配额的用户
- 程序员内卷?连熬数夜肝出这份2021Java面试题核心知识点总结,近300页!
- sum problem
- 如何找mysql8.0的rpm安装包_centos7上mysql8.0rpm方式安装
- ADSL防御黑客进攻的方法
- 初测ONES项目管理工具,寻求与众不同
- 工期计算机在线,工期日历计算器
- 新型冠状病毒SIR预测模型,MATLAB代码
- 如何借助分布式存储 JuiceFS 加速 AI 模型训练
- scala 编程(其五)集合,交差交差集
- apex英雄哪个服务器稳定,apex英雄哪个服务器好
- 做锤子区块链手机的4种方法(行业观察)
- 阿德莱德计算机科学专业怎么样,阿德莱德大学计算机专业排名如何 排名多少...
- java过滤微信表情符号_微信隐藏彩蛋!表情加符号就能传递“神秘信息”