首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用边缘触发的epoll,我应该循环发送吗?

在这个问答内容中,我们涉及到了两个关键技术:边缘触发(Edge-triggered)和 epoll。首先,我们来了解一下这两个概念。

边缘触发(Edge-triggered):边缘触发是一种事件通知机制,当某个事件从未发生变为发生时,就会触发一次事件通知。这意味着如果事件一直处于发生状态,不会再次触发事件通知。

epoll:epoll 是 Linux 内核提供的一种 I/O 多路复用技术,它可以高效地处理大量的并发连接。epoll 相较于传统的 select 和 poll,具有更高的性能和更低的资源消耗。

现在回到问题:使用边缘触发的 epoll,我应该循环发送吗?

在这种情况下,你不需要循环发送。边缘触发的 epoll 会在某个文件描述符发生变化时通知你,这样你可以避免无限循环发送。当你收到 epoll 的事件通知后,你应该处理相应的文件描述符,然后重新注册 epoll 事件。这样可以确保你在需要时才处理事件,提高程序的性能和效率。

总结一下,使用边缘触发的 epoll 时,你不需要循环发送。当收到事件通知时,处理相应的文件描述符并重新注册 epoll 事件即可。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【Linux】从零开始使用多路转接IO --- 理解EPOLL的 LT水平触发模式 与 ET边缘触发模式

EPOLL的工作模式有两种: LT水平触发 ET边缘触发 上面现象是LT模式下的产物,那么怎么理解LT与ET呢?...李四:只有包裹变化的时候,我才来通知你拿快递。 在这个例子中,快递就是数据,张三对应LT水平触发模式,李四对应ET边缘触发模式。一般情况下是LT水平触发模式。 这两种模式哪一个更加高效呢?...毕竟李四比张三打的电话少的多得多! LT水平触发是默认的,那么一个如何设置成ET边缘触发模式呢?...边缘触发 Edge Triggered 工作模式 如果将 socket 添加到 epoll 描述符的时候使用了 EPOLLET 标志,epoll 进入 ET 工作模式。...由于是ET模式,在客户端发送新的数据之前,服务端一直不会进行读取!所以ET模式下,必须一次性将数据读完,就要进行循环读取直到读取不到!这样也就必须使用非阻塞的读取了(才能支持循环读取)!

14810

又被百度捞起来了,能赢吗?

eopll水平测发和边缘测发的差距 答:(看到过,但是忘记了)对这个问题不是很清楚 补充: epoll 支持两种事件触发模式,分别是边缘触发(*edge-triggered,ET*)**和**水平触发(...使用边缘触发模式时,当被监控的 Socket 描述符上有可读事件发生时,服务器端只会从 epoll_wait 中苏醒一次,即使进程没有调用 read 函数从内核读取数据,也依然只苏醒一次,因此我们程序要保证一次性将内核缓冲区的数据读取完...如果使用边缘触发模式,I/O 事件发生时只会通知一次,而且我们不知道到底能读写多少数据,所以在收到通知后应尽可能地读写数据,以免错失读写的机会。...一般来说,边缘触发的效率比水平触发的效率要高,因为边缘触发可以减少 epoll_wait 的系统调用次数,系统调用也是有一定的开销的的,毕竟也存在上下文的切换。...select/poll 只有水平触发模式,epoll 默认的触发模式是水平触发,但是可以根据应用场景设置为边缘触发模式。 那么你在Linux环境下有调用过系统接口去创建过线程什么的吗?

10110
  • C++网络库都干了什么?

    早些年的时候有过 select 和 poll,但是各有各的弊端,这个不是本文重点,在此不再详述。现在在windows上使用 IOCP,在 Linux 上使用 epoll 做事件触发,基本已经算是共识。...你告诉 IOCP 我要发送这些数据,IOCP 就会默默的把这些数据写进发送窗体,然后告诉你说:“ 头儿,我干完了 ” 。...你告诉 epoll 我要监测这个 socket 的发送和读取事件,当事件到来的时候,epoll 不会管怎么干活儿,只会冷淡的敲敲窗户告诉你:”有事儿了,出来干活儿吧“。...这又设计到 epoll 的两种触发模式,水平触发和边缘触发。...边缘触发模式时,每次 epoll_wait 时只需要将活动事件链表取出即可,但是水平触发模式时,还需要将数据未全部读取的 socket 再次放置到链表中。 CppNet 采用的是边缘触发模式。

    2.2K50

    java的nio是水平触发吗

    java的nio是水平触发吗?在linux上,其实现是基于linux epoll的。所以首先我们要了解epoll。...epoll 水平触发 在epoll 水平触发与边缘触发一文中讲述了水平触发的条件: 对于读操作 只要缓冲内容不为空,LT模式返回读就绪。 对于写操作 只要缓冲区还不满,LT模式会返回写就绪。...所以,Linux epoll的水平触发是以缓冲区空满状态来判断的。 那java nio是水平触发吗 首先我们知道了,Linux epoll的水平触发是以缓冲区空满状态来判断的。...如果能多次触发读事件,就应当是水平触发,我们用以下代码验证: 在下列代码中: 客户端发送"hello world"后即停止运行。...即使调用了keys.remove();删除key,在之后的循环中依旧会一直触发读取事件。 结论 只要缓冲区非空,就能一直触发读取事件。所以linux中,java nio是水平触发的

    85940

    Netty如何做到单机百万并发?

    最后,epoll_wait 会遍历链表来处理已经准备好的 socket,然后通过预先设置的水平触发或者边缘触发来进行数据的感知操作。...水平触发和边缘触发 上面说到了 epoll,主要讲解了 client 端怎么连进来,但是并未详细的讲解 epoll_wait 怎么被唤醒的,这里我将来详细的讲解一下。...可以看到,这次发送,由于发送的长度大于 buffer size,所以内容被折成两段进行接收,由于用了边缘触发方式,buffer 的情况是从空到非空,所以只会产生一次通知。...②水平触发 水平触发则简单多了,他包含了边缘触发的所有场景,简而言之如下: 当接收缓冲区不为空的时候,有数据可读,则读事件会一直触发: ?...数据结构中并将fd设置为EPOLLIN可读,同时根据ET开关来决定使用水平触发还是边缘触发模式 * 注意:默认为水平触发,或上EPOLLET则为边缘触发 */ void AddFd(int epoll_fd

    91831

    Netty 如何做到单机百万并发?

    最后,epoll_wait 会遍历链表来处理已经准备好的 socket,然后通过预先设置的水平触发或者边缘触发来进行数据的感知操作。...水平触发和边缘触发上面说到了 epoll,主要讲解了 client 端怎么连进来,但是并未详细的讲解 epoll_wait 怎么被唤醒的,这里我将来详细的讲解一下。...可以看到,这次发送,由于发送的长度大于 buffer size,所以内容被折成两段进行接收,由于用了边缘触发方式,buffer 的情况是从空到非空,所以只会产生一次通知。...②水平触发水平触发则简单多了,他包含了边缘触发的所有场景,简而言之如下:当接收缓冲区不为空的时候,有数据可读,则读事件会一直触发:图片当发送缓冲区未满的时候,可以继续写入数据,则写事件一直会触发:图片同样的...数据结构中并将fd设置为EPOLLIN可读,同时根据ET开关来决定使用水平触发还是边缘触发模式 * 注意:默认为水平触发,或上EPOLLET则为边缘触发*/void AddFd(int epoll_fd

    8200

    【译文】epoll() 3步搞定

    由于它与其他Linux文件描述符一样,所以我们可以使用close()。 水平触发和边缘触发的事件通知 水平触发和边缘触发是从电气工程学借来的术语。当我们使用epoll时,它们的区别很重要。...在边缘触发模式下,我们仅在监视文件描述符的状态更改时才接收事件;而在水平触发模式下,我们将持续接收事件,直到相应的文件描述符不再处于就绪状态为止。...一般来讲,水平触发是默认设置,更易于使用,也是本教程将使用的,但是要了解边缘触发模式也是可用。...我在这里添加了一些新变量来支持和表达我在做什么。我还添加了一个while循环,该循环将持续从正在监视的文件描述符中读取数据,直到其中一个数据说“stop”为止。...Read 'stop ' 首先,我给了一个适合缓冲区的短字符串,它可以正常工作,并继续迭代循环。

    61020

    Linux 的 epoll 使用 LT + 非阻塞 IO 和 ET + 非阻塞 IO 有效率上的区别吗?

    写这篇文章的初衷是回答一位同学学习网络模型时的困惑。 他的问题: Linux 的 epoll 使用 LT + 非阻塞 IO 和 ET + 非阻塞 IO 有效率上的区别吗? 问题补充:请看清楚。。...处于高电平状态 边缘模式的触发条件 1....可写 socket 可写事件边缘模式触发条件: 1. socket不可写 => socket可写 也就是说,如果对于一个非阻塞 socket,如果使用 epoll 边缘模式去检测数据是否可读,触发可读事件以后...这就意味着,使用 LT 模式,如果你的实现依赖于可写事件触发去发送数据,那么你一定要在数据发送完之后移除检测可写事件,避免没有数据发送时无意义的触发;使用 ET 模式时,如果你的实现也依赖于可写事件触发去发送数据...最后容我再啰嗦几句,总结起来: LT 模式下,读事件触发后,可以按需收取想要的字节数,不用把本次接收到的数据收取干净(即不用循环到 recv 或者 read 函数返回 -1,错误码为 EWOULDBLOCK

    2.4K51

    Netty如何做到单机百万并发

    最后,epoll_wait 会遍历链表来处理已经准备好的 socket,然后通过预先设置的水平触发或者边缘触发来进行数据的感知操作。...水平触发和边缘触发 上面说到了 epoll,主要讲解了 client 端怎么连进来,但是并未详细的讲解 epoll_wait 怎么被唤醒的,这里我将来详细的讲解一下。...可以看到,这次发送,由于发送的长度大于 buffer size,所以内容被折成两段进行接收,由于用了边缘触发方式,buffer 的情况是从空到非空,所以只会产生一次通知。...②水平触发 水平触发则简单多了,他包含了边缘触发的所有场景,简而言之如下: 当接收缓冲区不为空的时候,有数据可读,则读事件会一直触发: 当发送缓冲区未满的时候,可以继续写入数据,则写事件一直会触发:...数据结构中并将fd设置为EPOLLIN可读,同时根据ET开关来决定使用水平触发还是边缘触发模式 * 注意:默认为水平触发,或上EPOLLET则为边缘触发 */ void AddFd(int epoll_fd

    65820

    Netty如何做到单机百万并发?

    最后,epoll_wait 会遍历链表来处理已经准备好的 socket,然后通过预先设置的水平触发或者边缘触发来进行数据的感知操作。...水平触发和边缘触发 上面说到了 epoll,主要讲解了 client 端怎么连进来,但是并未详细的讲解 epoll_wait 怎么被唤醒的,这里我将来详细的讲解一下。...可以看到,这次发送,由于发送的长度大于 buffer size,所以内容被折成两段进行接收,由于用了边缘触发方式,buffer 的情况是从空到非空,所以只会产生一次通知。...②水平触发 水平触发则简单多了,他包含了边缘触发的所有场景,简而言之如下: 当接收缓冲区不为空的时候,有数据可读,则读事件会一直触发: 当发送缓冲区未满的时候,可以继续写入数据,则写事件一直会触发:...数据结构中并将fd设置为EPOLLIN可读,同时根据ET开关来决定使用水平触发还是边缘触发模式 * 注意:默认为水平触发,或上EPOLLET则为边缘触发 */ void AddFd(int epoll_fd

    93910

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

    与 poll 的事件宏相比,epoll 新增了一个事件宏 EPOLLET,这就是所谓的边缘触发模式(Edge Trigger,ET),而默认的模式我们称为 水平触发模式(Level Trigger,LT...那么水平模式的触发条件是状态处于高电平,而边缘模式的触发条件是新来一次电信号将当前状态变为高电平,即: 水平模式的触发条件 1. 低电平 => 高电平 2. 处于高电平状态 边缘模式的触发条件 1....socket 可写事件边缘模式触发条件: 1. socket不可写 => socket可写 也就是说,如果对于一个非阻塞 socket,如果使用 epoll 边缘模式去检测数据是否可读,触发可读事件以后...这就意味着,使用 LT 模式,如果你的实现依赖于可写事件触发去发送数据,那么你一定要在数据发送完之后移除检测可写事件,避免没有数据发送时无意义的触发;使用 ET 模式时,如果你的实现也依赖于可写事件触发去发送数据...最后容我再啰嗦几句,总结起来: LT 模式下,读事件触发后,可以按需收取想要的字节数,不用把本次接收到的数据收取干净(即不用循环到 recv 或者 read 函数返回 -1,错误码为 EWOULDBLOCK

    11.6K83

    这次答应我,一举拿下 IO 多路复用!

    epoll 支持两种事件触发模式,分别是边缘触发(edge-triggered,ET)和水平触发(level-triggered,LT)。 这两个术语还挺抽象的,其实它们的区别还是很好理解的。...一般来说,边缘触发的效率比水平触发的效率要高,因为边缘触发可以减少 epoll_wait 的系统调用次数,系统调用也是有一定的开销的的,毕竟也存在上下文的切换。...select/poll 只有水平触发模式,epoll 默认的触发模式是水平触发,但是可以根据应用场景设置为边缘触发模式。...因此,在不应该阻塞的 socket 上使用 O_NONBLOCK 可能更安全。...而且,epoll 支持边缘触发和水平触发的方式,而 select/poll 只支持水平触发,一般而言,边缘触发的方式会比水平触发的效率高。

    73130

    这次答应我,一举拿下 IO 多路复用!

    epoll 支持两种事件触发模式,分别是边缘触发(edge-triggered,ET)和水平触发(level-triggered,LT)。 这两个术语还挺抽象的,其实它们的区别还是很好理解的。...一般来说,边缘触发的效率比水平触发的效率要高,因为边缘触发可以减少 epoll_wait 的系统调用次数,系统调用也是有一定的开销的的,毕竟也存在上下文的切换。...select/poll 只有水平触发模式,epoll 默认的触发模式是水平触发,但是可以根据应用场景设置为边缘触发模式。...因此,在不应该阻塞的 socket 上使用 O_NONBLOCK 可能更安全。...而且,epoll 支持边缘触发和水平触发的方式,而 select/poll 只支持水平触发,一般而言,边缘触发的方式会比水平触发的效率高。

    47340

    【Linux】高级IO --- Reactor网络IO设计模式

    在上面的这两个例子中,其实小李的工作模式就是水平触发Level Triggered模式,简称LT模式,小王的工作模式就是边缘触发Edge Triggered模式,简称ET模式,也是多路转接接口高效的模式...而反观LT模式,虽然每次epoll_wait都是阻塞式等待,但epoll_wait每次都会返回,每次都会告知程序员,这就是两者的不同。边缘触发只会触发一次,水平触发会一直触发。...业务逻辑处理方法应该在本次循环读取到所有的数据之后再进行处理。 3....,那你还怎么发送剩余数据啊,所以这个时候你就应该设置写事件关心了,让epoll_wait帮你监视sock上的写事件,以便于下次epoll_wait通知你时,你还能够继续发送上次没发完的数据。...如果我这次设置了写关心,但下次发送数据的时候,还是没发送完毕(因为内核发送缓冲区可能没有剩余空间了),那后面ET模式是不是就不会通知我了呀,那我还怎么继续发送剩余的数据呢?

    23120

    【Linux】高级IO --- Reactor服务器IO设计模式

    在上面的这两个例子中,其实小李的工作模式就是水平触发Level Triggered模式,简称LT模式,小王的工作模式就是边缘触发Edge Triggered模式,简称ET模式,也是多路转接接口高效的模式...而反观LT模式,虽然每次epoll_wait都是阻塞式等待,但epoll_wait每次都会返回,每次都会告知程序员,这就是两者的不同。边缘触发只会触发一次,水平触发会一直触发。...,那你还怎么发送剩余数据啊,所以这个时候你就应该设置写事件关心了,让epoll_wait帮你监视sock上的写事件,以便于下次epoll_wait通知你时,你还能够继续发送上次没发完的数据。...如果我这次设置了写关心,但下次发送数据的时候,还是没发送完毕(因为内核发送缓冲区可能没有剩余空间了),那后面ET模式是不是就不会通知我了呀,那我还怎么继续发送剩余的数据呢?...json我也不会,只能简单的使用一下,没有系统的学过,所以下面我只能说说我们自己的序列化和反序列化方案,不过值得注意的是,实际在公司使用中,对于序列化和反序列化是有现成的解决方案的,程序员绝对不会自己去写

    12700

    网络编程之reactor和proactor模式

    使用水平触发时,当客户端发送了一条数据后,操作系统会不停地向服务器程序通知该事件,直到服务器程序将该数据从缓冲区中读取出来。...下面是一个简单的边缘触发的例子:假设我们有一个服务器程序,它需要监听多个客户端连接,并读取客户端发送的数据。...使用边缘触发时,当客户端发送了一条数据后,操作系统只会向服务器程序通知该事件一次,即事件发生时刻。如果服务器程序没有立即处理该事件,则下次事件发生时刻,操作系统不会再次通知服务器程序。...应用程序可以通过一些系统调用(如select、epoll、kqueue等)来从事件队列中读取事件并进行处理。水平触发和边缘触发是两种不同的事件处理方式。...需要注意的是,使用边缘触发时,应用程序需要立即处理事件,否则可能会出现事件丢失的情况。

    32600

    深入分析select&poll&epoll原理

    epoll对ready_list进行操作的时候会通过全局加锁的方式完成 epoll技术的边缘触发与水平触发 水平触发 1) socket接收数据的缓冲区不为空的时候,则一直触发读事件,相当于"不断地询问是否有数据可读..." 2) socket发送数据的缓冲区不全满的时候,则一直触发写事件,相当于"不断地询问是否有空闲区域可以让数据写入" 本质上就是一个不断进行交流的过程, 水平触发如下图所示: ?...边缘触发 1) socket接收数据的缓冲区发生变化,则触发读取事件,也就是当空的接收数据的socket缓冲区这个时候有数据传送过来的时候触发 2) socket发送数据的缓冲区发生变化,则触发写入事件...,也就是当满的发送数据的socket缓冲区这个时候刚刷新数据初期的时候触发 本质上就是socket缓冲区变化而触发,边缘触发如下图所示: ?...上述的触发事件会调用epoll_wait方法,也就是 1) 水平触发会多次调用epoll_wait 2) 边缘触发在socket缓冲区中不发生改变那么就不会调用epoll_wait的方式 水平触发与边缘触发代码实现方式

    1K31

    epoll,求知者离我近点

    目前效率相对较高的是 epoll+ET+非阻塞I/O 模型,在具体情况下应该合理选用当前情形中最优的搭配方案。...边缘触发与水平触发,阻塞I/O与非阻塞I/O 阻塞I/O与非阻塞I/O 为了方便理解后面的内容,我们先看几张图,关于阻塞与非阻塞I/O的。...阻塞式文件I/O 非阻塞式文件I/O 多路复用I/O 好,有了上面这几张图垫着,咱来看看边缘触发和水平触发。...ET V/S LT EPOLL 事件有两种模型: Edge Triggered (ET) 边缘触发 只有数据到来,才触发,不管缓存区中是否还有数据。...epoll 工作在 ET 模式的时候,必须使用非阻塞套接口,以避免由于一个文件句柄的阻塞读 / 阻塞写操作把处理多个文件描述符的任务饿死。

    51910

    day02 真正的高并发还得看IO多路复用

    // EPOLLET:边缘触发(后面细讲) epfd: epoll_create创建的epoll_fd op: 要操作的类型: a....边缘触发:只有套接字的状态由不可写到可写或由不可读到可读时,才会触发epoll_wait返回。...边缘触发处理起来会比水平触发比较麻烦,但性能会比水平触发高,因为减少 epoll 相关系统调用次数 讲完epoll的使用方法,我们把前面的伪代码套上epoll的边缘触发模式,完整代码如下: #include...使用非阻塞IO处理方式:我们只要循环的read,直到读完全部的数据即可(read返回0)。...使用阻塞IO处理方式:每次只能调用一次read,因为我们并不知道下一次循环中还有没有数据可读,如果没数据就会阻塞整个进程了,所以只能等待下一次的epoll_wait返回了。

    1.1K132

    高性能网络编程5--IO复用与并发编程

    select的使用方法是这样的: 返回的活跃连接 ==select(全部待监控的连接) 什么时候会调用select方法呢?在你认为需要找出有报文到达的活跃连接时,就应该调用。...于是,epoll_wait执行时只是检查左上方的链表,并返回左上方链表中的连接给用户。这样,epoll_wait的执行效率能不高吗?...最后,再看看epoll提供的2种玩法ET和LT,即翻译过来的边缘触发和水平触发。其实这两个中文名字倒也有些贴切。...肯定不能使线程阻塞的,那么就不发送响应了。但是,下一次epoll_wait时可能又把这个连接返回给你了,你还得检查下是否要处理。...ET叫做 边缘触发,就是指,只有连接从一个状态转到另一个状态时,才会触发epoll_wait返回它。

    75610

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券