IO多路复用的两种触发机制:ET和LT触发机制。以及IO操作是异步的还是同步的理解

本文旨在深入探讨两个关键问题:

  1. 为什么 ET(边缘触发)模式必须结合非阻塞 I/O 使用?

  2. 如何准确判断一个 I/O 操作是同步还是异步?


🔍 一、ET 触发机制为何必须搭配非阻塞 I/O?

在深入讨论之前,我们先简要回顾 I/O 多路复用的几种事件通知模式:selectpollepoll。其中,epoll 支持两种事件触发机制:

  • LT(Level-Triggered,水平触发) :每次调用 epoll_wait 时,只要对应的文件描述符(FD)处于就绪状态,就会通知用户程序。如果缓冲区中的数据未被完全读取,下一次调用 epoll_wait 时该 FD 会再次被返回。

  • ET(Edge-Triggered,边缘触发) :仅在 FD 状态发生变化时(例如从不可读变为可读)通知一次。调用 epoll_wait 后,内核会清空就绪列表,若用户未一次性读完缓冲区数据,剩余数据将无法被再次通知,从而导致事件丢失。

🔥 因此,ET 模式必须搭配非阻塞 I/O 使用,以避免数据漏读和事件丢失。

从系统调用行为理解"阻塞"与"非阻塞":
  • 阻塞 I/O :用户进程调用 read 后,若内核无数据可读,进程将进入挂起状态,直到数据到达才返回。

  • 非阻塞 I/O :用户进程调用 read 后,若内核无数据可读,立即返回 -1,并设置 errnoEAGAINEWOULDBLOCK,不会等待数据。

场景推演:四种组合的对比
场景 模式组合 行为描述
① 用户 buffer 1KB 内核 buffer 2KB LT + 非阻塞 用户读取 1KB 后,因缓冲区未空,epoll_wait 再次触发,继续读取剩余数据。
② 用户 buffer 2KB 内核 buffer 1KB LT + 阻塞 用户读取 1KB 后,因未满足期望读取量,进程阻塞等待新数据;新数据到达后再次触发。
③ 用户 buffer 2KB 内核 buffer 1KB ET + 非阻塞 用户读取 1KB 后立即返回,不阻塞;待新数据到达后再次触发,完成读取。
④ 用户 buffer 2KB 内核 buffer 1KB ET + 阻塞 用户读取 1KB 后因未读满而阻塞,但 ET 模式不会再次通知,导致永久等待

✅ 只有"ET + 非阻塞"能避免进程阻塞与事件丢失的双重风险。


🧠 二、如何判断 I/O 操作是同步还是异步?

判断一个 I/O 操作是同步还是异步,关键在于观察数据在内核缓冲区与用户缓冲区之间的拷贝过程

  • 同步 I/O :数据从内核缓冲区拷贝到用户缓冲区的过程由用户线程完成,线程在此期间会阻塞等待。

  • 异步 I/O :数据拷贝过程由内核线程完成,完成后通知用户线程,用户线程在整個过程中不会被阻塞。

简言之:"谁在搬数据,线程等不等"------用户线程搬并等待为同步;内核线程搬且用户不等即为异步。


💎 总结

  • ET 模式 必须搭配非阻塞 I/O,以避免因单次未读完数据而导致的事件丢失与进程死锁。

  • 判断 I/O 的同步与异步,本质是看数据拷贝的执行者是否为用户线程 ,以及用户线程是否会被阻塞

理解这两点,有助于我们在高并发、高性能网络编程中做出更合理的技术选型与问题排查。

相关推荐
杜子不疼.12 分钟前
仓颉语言构造函数深度实践指南
java·服务器·前端
风一样的美狼子15 分钟前
仓颉语言 LinkedList 链表实现深度解析
java·服务器·前端
无敌最俊朗@16 分钟前
SQLite 约束:INTEGER PRIMARY KEY 与 ROWID
java·开发语言
LDG_AGI25 分钟前
【推荐系统】深度学习训练框架(二):深入剖析Spark Cluster模式下DDP网络配置解析
大数据·网络·人工智能·深度学习·算法·机器学习·spark
wanhengidc32 分钟前
云手机 基于云计算的虚拟手机
运维·服务器·游戏·智能手机·云计算
华普微HOPERF5 小时前
Matter协议,如何塑造更宜居、流畅的智能家居网络?
服务器·网络·智能家居
默 语6 小时前
MySQL中的数据去重,该用DISTINCT还是GROUP BY?
java·数据库·mysql·distinct·group by·1024程序员节·数据去重
小志biubiu7 小时前
【Linux】Ext系列文件系统
linux·服务器·c语言·经验分享·笔记·ubuntu·操作系统
DooTask官方号7 小时前
DooTask 1.3.38 版本更新:MCP 服务器与 AI 工具深度融合,开启任务管理新体验
运维·服务器·人工智能·开源软件·dootask
oDeviloo8 小时前
新版IntelliJ IDEA个性化设置兼容老版习惯
java·ide·intellij-idea