关于EPOLL的ET和LT模式的深入理解
epoll也是实现I/O多路复用的一种方法。epoll水平触发(level trigger,LT,LT为epoll的默认工作模式)与边缘触发(edge trigger,ET)两种工作模式。使用脉冲信号来解释LT和ET可能更加贴切。Level是指信号只需要处于水平,就一直会触发;而edge则是指信号为上升沿或者下降沿时触发。
LT:只要内核缓冲区有数据就一直通知,只要socket处于可读状态或可写状态,就会一直返回sockfd;
ET:只有状态发生变化才通知,只有当socket由不可写到可写或由不可读到可读,才会返回其sockfd;
注:(在添加EPOLLIN、EPOLLOUT事件的前提下。)
水平触发
1. 对于读操作
只要缓冲内容不为空,LT模式返回读就绪。
2. 对于写操作
只要缓冲区还不满,LT模式会返回写就绪。
边缘触发
1. 对于读操作
(1)当缓冲区由不可读变为可读的时候,即缓冲区由空变为不空的时候。
(2)当有新数据到达时,即缓冲区中的待读数据变多的时候。
(3)当缓冲区有数据可读,且应用进程对相应的描述符进行EPOLL_CTL_MOD
修改EPOLLIN
事件时。
2. 对于写操作
(1)当缓冲区由不可写变为可写时。
(2)当有旧数据被发送走,即缓冲区中的内容变少的时候。
(3)当缓冲区有空间可写,且应用进程对相应的描述符进行EPOLL_CTL_MOD
修改EPOLLOUT
事件时。
究竟触发了多少次呢?可以这样想:
(1)当数据量SIZE小于recv函数的接收长度len且小于系统缓冲SO_RCVBUF的时候:ET与LT都触发一次,recv执行一次。
(2)当数据量SIZE大于recv接收长度len但小于系统缓冲SO_RCVBUF的时候:LT触发SIZE/len次,ET触发一次。两者的recv函数执行SIZE/len。(一次ET触发可执行多次recv)
(3)当数据量SIZE大于recv接收长度len且大于系统缓冲SO_RCVBUF的时候:LT触发SIZE/len次,ET触发SIZE/SO_RCVBUF次。两者的recv函数都执行SIZE/len次。(同样一次ET触发执行了多次recv)
显然:
1、ET模式可以显著降低同一个Epoll事件的触发次数。
2、ET模式下同一文件描述符的同类事件有可能多次触发。如:系统读/写缓冲区溢出会分别导致同一个描述符的EPOLLIN/EPOLLOUT事件多次触发。
另外几点要知道:
(1)send和recv函数的len参数是每一次接受或发送的数据量的上限。
(2)ET模式下确实每次都终止于EAGAIN。recv的指定的接收长度较小的时候,ET模式下的一次触发会执行多次recv。直到某次recv操作把errno变成了EAGAIN为止。此时errno==EAGAIN条件成立。
(3)这种触发是系统自动完成的。某些程序在errno==EAGAIN的时候,又做了写epoll_ctl配置有点误导人。
(4)两种模式下的recv函数执行的次数都是一样的。
(5)具体执行次数还要考虑缓冲区门限之类的,并非这么简单。
关于EPOLL的ET和LT模式的深入理解相关推荐
- epoll关于ET、LT模式和socket非阻塞模式的几个总结
epoll的ET和LT模式 LT水平触发是默认的模式,只要缓冲区有消息就会触发,如果这次事件没有被处理,那么下一次调用epoll_wait的时候,事件仍然会被触发:ET边沿触发只会在第一次有消息的时候 ...
- Epoll之ET、LT模式
Epoll之ET.LT模式 在使用epoll时,在函数 epoll_ctl中如果不设定,epoll_event 的event默认为LT(水平触发)模式. 使用LT模式意味着只要fd处于可读或者可写状态 ...
- JavaScript 设计模式核⼼原理与应⽤实践 之 创建型:工厂模式·抽象工厂——理解“开放封闭”
JavaScript 设计模式核⼼原理与应⽤实践 之 创建型:工厂模式·抽象工厂--理解"开放封闭" 一个不简单的简单工厂引发的命案 在实际的业务中,我们往往面对的复杂度并非数个类 ...
- lte tm模式_LTE MIMO 模式的学习理解
<LTE MIMO 模式的学习理解>由会员分享,可在线阅读,更多相关<LTE MIMO 模式的学习理解(12页珍藏版)>请在人人文库网上搜索. 1.MIMO 学习心得 -Ell ...
- Android:安卓学习笔记之MVP模式的简单理解和使用
Android MVP模式的简单理解和使用 MVP模式 1. 为什么使用MVP模式? 1.1.实例说明 2.一步步让你理解MVP 2.1.MVP实现第一步, 将页面拆分为M/V/P三个模块 2.2. ...
- Epoll在LT和ET模式下的读写方式
在一个非阻塞的socket上调用read/write函数,返回EAGAIN 或者 EWOULDBLOCK(注: EAGAIN就是EWOULDBLOCK) 从字面上看, 意思是:EAGAIN: 再试一次 ...
- epoll的ET和LT模式
从man手册中,得到ET和LT的具体描述如下 EPOLL事件有两种模型: Edge Triggered (ET) Level Triggered (LT) 假如有这样一个例子: 1. 我们已经把一个用 ...
- epoll的LT和ET模式
原理參考该博客 从man手冊中,得到ET和LT的详细描写叙述例如以下 EPOLL事件有两种模型: Edge Triggered (ET) Level Triggered (LT) 假如有这样一个样例: ...
- epoll在ET和LT模式下读写
在一个非阻塞的socket上调用read/write函数, 返回EAGAIN或者EWOULDBLOCK(注: EAGAIN就是EWOULDBLOCK) 从字面上看, 意思是:EAGAIN: 再试一次, ...
- Linux编程入门三网络编程三 epoll的LT和ET模式以及EPOLLONESHOT事件
epoll对文件描述符的操作有两种模式:LT(Level Trigger 电平触发)模式和ET(Edge Trigger 边沿触发)模式. LT是默认的工作模式,这种模式下epoll相当于一个效率较高 ...
最新文章
- 基于caffe的度量学习实现(Siamese network Triplet network)
- 众里寻他千百度-- 轻量级持久化框架
- pymysql dataframe 写入sql
- [转载]为什么使用 SLF4J 而不是Log4J来做Java 日志
- 全备份失败后,如何手工清除exchange日志文件,附微软KB
- mysql中间件是运维工作内容_linux运维工作的七项内容
- springboot项目中jdk版本的问题
- (转) 学习淘淘商城第一课
- 常见排序算法:冒泡排序
- 开源MySQL数据传输中间件—DTLE
- java连接数据库的方式_java连接数据库的两种方法总结
- 阿里云Hologres外部表的创建及使用
- 祝贺swm8023刷HDU-Steps登顶+突破新Section,14.2不是传说中的高级计算几何,而是数学~~...
- iOS各大名人的博客
- 英文论文发表必备干货!SCI投稿7个阶段经典邮件模板,请拿走
- 爬虫120例之第17例,用Python面向对象的思路,采集各种精彩句子
- 电脑开机自动联服务器,如何让Mac开机自动连接到NAS或网上邻居上的电脑
- 59 Three.js 渲染两个场景和使用不同的相机,渲染在一个场景里面
- 把项目从meeclipces转移到idead中遇见的问题
- ”核高基“重大软件专项国家级验收形同虚设走过场