资讯专栏INFORMATION COLUMN

【基础知识】水平触发与边沿触发

MrZONT / 737人阅读

摘要:一基础水平触发基本概念读缓冲区不为空时读事件触发。开启时,会把监听套接字所有可读的事件全部读取,此时可以使用边沿触发。但为了保证连接不丢失,仍然采用水平触发通信套接字设置对于与客户端通信使用的套接字默认使用水平触发。

一. 基础 1.1 水平触发 基本概念

读缓冲区不为空时, 读事件触发。
写缓冲区不为满时, 写事件触发。
处理流程

accept新的连接, 监听读事件。
读事件到达, 处理读事件。
需要写入数据, 向fd中写数据, 一次无法写完, 开启写事件监听。
写事件到达, 继续写入数据, 写完后关闭写事件。
优缺点

不会遗漏事件, 易编程。
长连接需要写入的数据量大时, 会频繁开启关闭写事件。

1.2 边沿触发 基本概念

读缓冲区状态变化时, 读事件触发, 网卡接受到新数据。
写缓冲区状态变化时, 写事件触发, 网卡发出了新数据。
处理流程

accept新的连接, 同时监听读写事件。
读事件到达, 需要一直读取数据, 直到返回EAGAIN。
写事件到达, 无数据处理则不处理, 有数据待写入则一直写入,直到写完或者返回EAGAIN。
优缺点

不需要频繁开启关闭事件, 效率较高。
读写事件处理不当, 可能导致事件丢失, 编程教复杂。

1.3 选择 概述

对于读事件而言,总体而言, 采用水平触发方式较好。应用程序在读取数据时,可能会一次无法读取全部数据,边沿触发在下一次可能不会触发。如果能够保证一次读取缓存的全部数据,可以采用边沿触发,效率更高, 但同时编程复杂度也高。
对于写事件,当客户端服务端采用短连接或者采用长连接但发送的数据量比较少时(例如: Redis), 采用水平触发即可。当客户端与服务端是长连接并且数据写入的量比较大时(例如: nginx), 采用边沿触发, 因为边沿触发效率更高。
目前,linux不支持读写事件分别设置不同的触发方式,具体采用哪种方式触发,需要根据具体需求。
监听套接字事件设置

监听套接字不需要监听写事件,只需要监听读事件。
监听套接字一般采用水平触发方式。(nginx开启multi_accept时,会把监听套接字所有可读的事件全部读取,此时可以使用边沿触发。但为了保证连接不丢失,nginx仍然采用水平触发)
通信套接字设置

redis对于与客户端通信使用的套接字默认使用水平触发。
nginx对于与客户端通信使用的套接字默认采用边沿触发。

二. 参考

https://blog.csdn.net/dongfuy...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/40202.html

相关文章

  • 【Redis学习笔记】2018-05-30 Redis源码学习之Ziplist、Server

    摘要:函数原型本身会占用一个文件描述符,不用时应将其关闭。对而言,操作系统需要遍历所有文件,从而找出发生事件的文件描述符。操作系统为每个维护了一个双向链表,当某个文件可读或者可写时,通过回调事先设定的回调函数,将文件描述符写入这个双向链表。 作者:施洪宝 顺风车运营研发团队一. 压缩列表压缩列表是Redis的关键数据结构之一。目前已经有大量的相关资料,下面几个链接都已经对Ziplist进行...

    starsfun 评论0 收藏0
  • epoll LT/ET 深入剖析

    摘要:深入剖析事件有两种模型水平触发接收缓冲区不为空有数据可读读事件一直触发发送缓冲区不满可以继续写入数据写事件一直触发符合思维习惯,返回的事件就是的状态边沿触发的接收缓冲区状态变化时触发读事件,即空的接收缓冲区刚接收到数据时触发读事件的发送缓冲 epoll LT/ET 深入剖析 EPOLL事件有两种模型: Level Triggered (LT) 水平触发.socket接收缓冲区不为空 有...

    microelec 评论0 收藏0
  • epoll LT/ET 深入剖析

    摘要:深入剖析事件有两种模型水平触发接收缓冲区不为空有数据可读读事件一直触发发送缓冲区不满可以继续写入数据写事件一直触发符合思维习惯,返回的事件就是的状态边沿触发的接收缓冲区状态变化时触发读事件,即空的接收缓冲区刚接收到数据时触发读事件的发送缓冲 epoll LT/ET 深入剖析 EPOLL事件有两种模型: Level Triggered (LT) 水平触发.socket接收缓冲区不为空 有...

    tomato 评论0 收藏0
  • epoll LT/ET 深入剖析

    摘要:深入剖析事件有两种模型水平触发接收缓冲区不为空有数据可读读事件一直触发发送缓冲区不满可以继续写入数据写事件一直触发符合思维习惯,返回的事件就是的状态边沿触发的接收缓冲区状态变化时触发读事件,即空的接收缓冲区刚接收到数据时触发读事件的发送缓冲 epoll LT/ET 深入剖析 EPOLL事件有两种模型: Level Triggered (LT) 水平触发.socket接收缓冲区不为空 有...

    williamwen1986 评论0 收藏0
  • 用c++开发一个简版http服务器

    摘要:每个子进程都是一个,采用和非阻塞实现事件循环。使用,同样通过监听上的可读事件来统一事件源。将其设置为边沿触发,不然水平触发将一直告知该事件。时间堆的实现定时器的精度目前为采用最小堆来实现。 初衷 在阅读了TLPI和深入理解计算机系统之后,学会了如何使用linux系统api,想在写代码的过程中来加深自己对知识的理解,更想用这些知识来去做一个更酷的东西,而不仅仅是教课书上的简单服务器。而且...

    wanghui 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<