epoll的水平触发和边缘触发

水平触发(Level Triggered): 当满足条件时, 触发.  (select和poll采用该方式)
边缘触发(Edge Triggered): 当状态变化时,触发.  (信号驱动[Signal-Driven I/O]采用该方式)

过程:

当数据到来的时候, 触发器满足条件,发送通知, 进程接收到通知后,请求内核读取数据.

水平触发,是因为数据就绪,可IO,满足条件,则发送通知.

边缘触发,是因为状态发生了变化, 则发送通知.

理想情况下, 两种触发方式都能满足需求.

但是当内核在读取数据的过程无法一次读完, 就会产生问题.

水平触发: 这里依旧有数据在, 发送通知!

边缘触发: 没有状态变化, 不发送...

于是, 边缘触发情况下,未读数据就再无法被读到.

相较而言 边缘触发的实际使用效率并没有大幅度提高, 而且还需要解决数据.

在epoll中, LT(Level Triggered)模式为缺省默认.

如果需要选择使用ET(Edge Triggered)模式, 则需要考虑, 如何解决数据读取问题.

原文地址:https://www.cnblogs.com/jrri/p/12056326.html

时间: 2024-11-05 16:02:28

epoll的水平触发和边缘触发的相关文章

实例浅析epoll的水平触发和边缘触发,以及边缘触发为什么要使用非阻塞IO

一.基本概念                                                          我们通俗一点讲: Level_triggered(水平触发):当被监控的文件描述符上有可读写事件发生时,epoll_wait()会通知处理程序去读写.如果这次没有把数据一次性全部读写完(如读写缓冲区太小),那么下次调用 epoll_wait()时,它还会通知你在上没读写完的文件描述符上继续读写,当然如果你一直不去读写,它会一直通知你!!!如果系统中有大量你不需要读写的就

epoll 水平触发和边缘触发的区别

EPOLLLT——水平触发EPOLLET——边缘触发 epoll有EPOLLLT和EPOLLET两种触发模式,LT是默认的模式,ET是“高速”模式.LT模式下,只要这个fd还有数据可读,每次 epoll_wait都会返回它的事件,提醒用户程序去操作,而在ET(边缘触发)模式中,它只会提示一次,直到下次再有数据流入之前都不会再提示了,无 论fd中是否还有数据可读.所以在ET模式下,read一个fd的时候一定要把它的buffer读光,也就是说一直读到read的返回值小于请求值,或者 遇到EAGAIN

IO多路复用的水平触发与边缘触发

在linux的IO多路复用中有水平触发,边缘触发两种模式,这两种模式的区别如下: 水平触发:如果文件描述符已经就绪可以非阻塞的执行IO操作了,此时会触发通知.允许在任意时刻重复检测IO的状态,没有必要每次描述符就绪后尽可能多的执行IO.select,poll就属于水平触发. 边缘触发:如果文件描述符自上次状态改变后有新的IO活动到来,此时会触发通知.在收到一个IO事件通知后要尽可能多的执行IO操作,因为如果在一次通知中没有执行完IO那么就需要等到下一次新的IO活动到来才能获取到就绪的描述符.信号

条件触发和边缘触发 及 epoll 的优点

条件触发: 只要输入缓冲有数据就会一直通知该事件 边缘触发: 输入缓冲收到数据时仅注册1次该事件,即使输入缓冲中还留有数据,也不会再进行注册 水平触发(level-triggered,也被称为条件触发):只要满足条件,就触发一个事件(只要有数据没有被获取,内核就不断通知你) 边缘触发(edge-triggered): 每当状态变化时,触发一个事件 举个读socket的例子,假定经过长时间的沉默后,现在来了100个字节,这时无论边缘触发和条件触发都会产生一个read ready notificat

水平触发和边缘触发的区别

水平触发(level-triggered,也被称为条件触发)LT:  只要满足条件,就触发一个事件(只要有数据没有被获取,内核就不断通知你) 边缘触发(edge-triggered)ET: 每当状态变化时,触发一个事件. "举个读socket的例子,假定经过长时间的沉默后,现在来了100个字节,这时无论边缘触发和条件触发都会产生一个read ready notification通知应用程序可读.应用程序读了50个字节,然后重新调用api等待io事件.这时条件触发的api会因为还有50个字节可读,

水平触发与边缘触发

水平触发(Level Triggered,也称条件触发):select()和poll()将就绪的文件描述符告诉进程后,如果进程没有对其进行IO操作,那么下次调用select()和poll()的时候将再次报告这些文件描述符,所以它们一般不会丢失就绪的消息. 边缘触发(Edge Triggered):只告诉进程哪些文件描述符刚刚变为就绪状态,它只说一遍,如果我们没有采取行动,那么它将不会再次告知,这种方式称为边缘触发. ? ? 两者都会带来一系列问题:例如当100字节到达后,应用程序只读取了一部分,

Linux网络编程之select、poll、epoll的比较,以及epoll的水平触发(LT)和边缘触发(ET)

Linux的网络通信先后推出了select.poll.epoll三种模式. select有以下三个问题: (1)每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大. (2)同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大. (3)select支持的文件描述符数量太小了,默认是1024. poll解决了第三个问题,select保存描述符fd的数据结构是数组,poll改成了链表,突破了fd的个数限制. 但是第1和第2个问题依然

水平出发和边缘出发的区别

在linux的IO多路复用中有水平触发,边缘触发两种模式,这两种模式的区别如下: 水平触发:如果文件描述符已经就绪可以非阻塞的执行IO操作了,此时会触发通知.允许在任意时刻重复检测IO的状态,没有必要每次描述符就绪后尽可能多的执行IO.select,poll就属于水平触发. 边缘触发:如果文件描述符自上次状态改变后有新的IO活动到来,此时会触发通知.在收到一个IO事件通知后要尽可能多的执行IO操作,因为如果在一次通知中没有执行完IO那么就需要等到下一次新的IO活动到来才能获取到就绪的描述符.信号

【安富莱二代示波器教程】第9章 示波器设计—自动触发和普通触发

第9章        示波器设计-自动触发和普通触发 自带触发和普通触发是示波器设计中比较重要的两个功能,本章节为大家讲解二代示波器中自动触发和普通触发的实现. 9.1    自动触发 9.2    普通触发 9.3     总结 9.1  自动触发 由于示波器模拟前端模块稍有些问题,所以自动触发功能是用软件实现的.软件实现自动触发比较容易实现,具体的实现代码如下: /* 通过软件检测实现上升沿触发,并保留最后600的数据不做检测,用于直接显示 2048-600 = 1448; */ j = 0