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

一. 基础

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


Nginx源码分析
研读nginx源码

一群热爱代码的人 研究Nginx PHP Redis Memcache Beanstalk 等源码 以及一群热爱前端的人

7.1k 声望
12.7k 粉丝
0 条评论
推荐阅读
【转发】来自西红柿(李乐)的《深入理解Go语言
作者:李乐 原文地址:[链接]第一章 Go语言快速入门  第一篇 基本语法  第二讲 数组与切片  第三讲 字符串  第四讲 哈希表MAP  第五讲 结构体与接口 &em...

LNMPRG源码研究1阅读 1k

如何选择适合你的微服务 API 网关:对比 Kong、APISIX、Tyk、Apigee 和其他网关
API 网关并非一个新兴的概念,在十几年前就已经存在了,它的作用主要是作为流量的入口,统一的处理和业务相关的请求,让请求更加安全、快速和准确的得到处理。它有以下传统的功能:

API7_技术团队8阅读 8.7k评论 2

有了 NGINX 和 Kong,为什么还需要 Apache APISIX?
2021 年 5 月,云原生社区技术沙龙·广州站,API7.ai(支流科技)联合创始人 & CTO,Apache APISIX PMC 王院生在活动上做了《有了 NGINX 和 Kong,为什么还需要 Apache APISIX》的分享,以下是现场分享的文字版。...

API7_技术团队1阅读 4.2k

Nginx 配置常用参数,看这一篇就够了
最近在全面学习Nginx,当作笔记了,如有错误,欢迎指出或深入交流。主模块 {代码...} 事件模块 {代码...} http部分 {代码...} 部分参数详细说明server_name {代码...} location {代码...} location表达式类型 {代...

开源到2阅读 1.9k

化虹为桥 - Nginx 如何代理 UDP “连接”
众所周知,UDP 并不像 TCP 那样是基于连接的。但有些时候,我们需要往一个固定的地址发送多个 UDP 来完成一个 UDP 请求。为了保证服务端能够知道这几个 UDP 包构成同一个会话,我们需要在发送 UDP 包时绑定某个端...

spacewander4阅读 1.6k

Nginx unexpected end of file 配置证书遇到问题,如何解决?
通过 letsencrypt 申请证书后,默认服务器安装了 Nginx 1.8 发现,在默认的 /etc/nginx/sites-enabled/default 内容配置 SSL 的 site.com.key 后。重启 Nginx 出现一下错误:

程序员泥瓦匠1阅读 1.2k

mac M1 nginx配置文件位置
mac nginx配置的原位置/usr/local/etc/nginx/nginx.confmac M1 nginx配置位置/usr/local/Homebrew/etc/nginx/nginx.confnginx -t 查看位置

寿兽阅读 3k

一群热爱代码的人 研究Nginx PHP Redis Memcache Beanstalk 等源码 以及一群热爱前端的人

7.1k 声望
12.7k 粉丝
宣传栏