epoll LT 模式和 ET 模式详解(文末赠书)

您所在的位置:网站首页 listenfd怎么读 epoll LT 模式和 ET 模式详解(文末赠书)

epoll LT 模式和 ET 模式详解(文末赠书)

2024-07-14 19:53| 来源: 网络整理| 查看: 265

与 poll 的事件宏相比,epoll 新增了一个事件宏 EPOLLET,这就是所谓的边缘触发模式(Edge Trigger,ET),而默认的模式我们称为 水平触发模式(Level Trigger,LT)。这两种模式的区别在于:

对于水平触发模式,一个事件只要有,就会一直触发;对于边缘触发模式,只有一个事件从无到有才会触发。

这两个词汇来自电学术语,你可以将 fd 上有数据认为是高电平,没有数据认为是低电平,将 fd 可写认为是高电平,fd 不可写认为是低电平。那么水平模式的触发条件是状态处于高电平,而边缘模式的触发条件是新来一次电信号将当前状态变为高电平,即:

水平模式的触发条件

代码语言:javascript复制1. 低电平 => 高电平 2. 处于高电平状态

边缘模式的触发条件

代码语言:javascript复制1. 低电平 => 高电平

说的有点抽象,以 socket 的读事件为例,对于水平模式,只要 socket 上有未读完的数据,就会一直产生 EPOLLIN 事件;而对于边缘模式,socket 上每新来一次数据就会触发一次,如果上一次触发后,未将 socket 上的数据读完,也不会再触发,除非再新来一次数据。对于 socket 写事件,如果 socket 的 TCP 窗口一直不饱和,会一直触发 EPOLLOUT 事件;而对于边缘模式,只会触发一次,除非 TCP 窗口由不饱和变成饱和再一次变成不饱和,才会再次触发 EPOLLOUT 事件。

socket 可读事件水平模式触发条件:

代码语言:javascript复制1. socket上无数据 => socket上有数据 2. socket处于有数据状态

socket 可读事件边缘模式触发条件:

代码语言:javascript复制1. socket上无数据 => socket上有数据 2. socket又新来一次数据

socket 可写事件水平模式触发条件:

代码语言:javascript复制1. socket可写 => socket可写 2. socket不可写 => socket可写

socket 可写事件边缘模式触发条件:

代码语言:javascript复制1. socket不可写 => socket可写

也就是说,如果对于一个非阻塞 socket,如果使用 epoll 边缘模式去检测数据是否可读,触发可读事件以后,一定要一次性把 socket 上的数据收取干净才行,也就是说一定要循环调用 recv 函数直到 recv 出错,错误码是EWOULDBLOCK(EAGAIN 一样)(此时表示 socket 上本次数据已经读完);如果使用水平模式,则不用,你可以根据业务一次性收取固定的字节数,或者收完为止。边缘模式下收取数据的代码写法示例如下:

代码语言:javascript复制bool TcpSession::RecvEtMode() { //每次只收取256个字节 char buff[256]; while (true) { int nRecv = ::recv(clientfd_, buff, 256, 0); if (nRecv == -1) { if (errno == EWOULDBLOCK) return true; else if (errno == EINTR) continue; return false; } //对端关闭了socket else if (nRecv == 0) return false; inputBuffer_.add(buff, (size_t)nRecv); } return true; }

下面我们来看几个具体的例子来比较一下 LT 模式与 ET 模式的区别。

先来测试一下 LT 模式 与 ET 模式在处理读事件上的区别。

代码如下:

代码语言:javascript复制/** * 验证epoll的LT与ET模式的区别, epoll_server.cpp * zhangyl 2019.04.01 */ #include #include #include #include #include #include #include #include #include #include #include #include int main() { //创建一个监听socket int listenfd = socket(AF_INET, SOCK_STREAM, 0); if (listenfd == -1) { std::cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3