首页
学习
活动
专区
工具
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模式下,必须一次性将数据读完,就要进行循环读取直到读取不到!这样也就必须使用非阻塞读取了(才能支持循环读取)!

6100

又被百度捞起来了,能赢

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

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

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

    2.2K50

    javanio是水平触发

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

    85540

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

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

    84131

    【译文】epoll() 3步搞定

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

    60320

    Linux下几种并发服务器实现模式(详解)

    2>循环服务器和并发服务器 1.循环服务器:一个server只能一次只能接收一个client,当当前client结束访问之后才能进行下一个client连接。...之后有的epoll,实用方法是:用一个线程专门进行端口监听,accept接收到连接时候,把连接设置成非阻塞方式,把epoll时间设置成边缘触发方式,加入epoll管理。...接收线程阻塞在epoll等待事件函数。另外一个线程专门用于数据发送。 注意: 1.如果把epoll设置成水平触发效率就下降采用select水平。...epoll时间设置有边缘触发方式和水平触发方式 1.水平触发方式: 如果文件描述符已经就绪可以非阻塞执行IO操作了,此时会触发通知。...eg:现在有一个1000个字节报文,无论是水平触发还是边缘触发,都会发送一个只读通知,当收到了100个字节后,水平触发因为还有字节没有读完,就会发送一个只读通知,但是边缘触发会一直保持等待通知,等待接下来报文到来

    92221

    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.3K51

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

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

    91610

    Netty如何做到单机百万并发

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

    64720

    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.2K83

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

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

    47140

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

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

    22420

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

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

    71630

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

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

    9700

    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 模式时候,必须使用非阻塞套接口,以避免由于一个文件句柄阻塞读 / 阻塞写操作把处理多个文件描述符任务饿死。

    51310

    深入分析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方式 水平触发边缘触发代码实现方式

    98331

    网络编程之reactor和proactor模式

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

    28400

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

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

    1K132

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

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

    75110

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券