Linux篇之IO多路复用

ops/2025/3/19 20:45:48/

文章目录

  • 前言
  • IO操作
  • IO阻塞
  • 多路IO
  • 多个流的IO请求处理
  • 水平触发
  • 边缘触发
  • 最后

前言

你好,我是醉墨居士,今天介绍一下Linux中的IO多路复用机制

流是一种用于在程序与外部数据源(如文件、网络连接、内存等)之间传输数据的机制,表示一种数据的流动和处理方式
文件、管道、套接字、stdin、stdout等等可以表示为一个流
可以通过文件描述符(fd)来进行IO流的操作

IO操作

IO操作是对流的读写操作,流是 IO 操作的抽象表示

IO阻塞

如果流中没有数据,那么此时读取数据的过程就会被阻塞,对于该阻塞事件会延伸出来两种处理方式:

  • 阻塞等待:等待流中存在数据可以读取之后唤醒读取数据的过程,等待过程中不消耗资源,但是同一时刻只能处理一个流的阻塞监听
  • 非阻塞,忙轮询:不断轮询检查流中是否存在数据可以读取,轮询过程中消耗资源

多路IO

能够阻塞等待,并能够同一时刻监听多个流的事件触发

多个流的IO请求处理

  • 方案一
    使用多进程/多线程/多协程,每个进程/线程/协程处理一个流的IO请求
    缺点:进程/线程/协程间的克隆、调度、切换消耗资源

  • 方案二
    依次非阻塞、忙轮询多个流,依次处理每个流的IO请求
    缺点:轮询过程中消耗资源

  • 方案三
    使用select,监听多个流的IO请求,当存在IO请求待处理时触发处理逻辑
    缺点:触发IO请求的逻辑时,不知道是来自哪个文件描述符的IO请求,需要轮询找到待处理的文件描述符中的IO请求进行处理。同时监听文件描述符数量上限有限制

  • 方案四
    使用poll,监听多个流的IO请求,当存在IO请求待处理时触发处理逻辑,相较于select解决监听文件描述符限制的问题
    缺点:和select一样,触发IO请求的逻辑时,不知道是来自哪个文件描述符的IO请求,需要轮询找到待处理的文件描述符中的IO请求进行处理

  • 方案四
    使用epoll,监听多个流的IO请求,当存在IO请求待处理时触发处理逻辑能够获取到哪些流存在待处理的IO请求,我们只需要遍历有待处理事件的流即可

水平触发

只要文件描述符上有可读或可写数据,就会一直触发通知

编程相对简单,因为只要有数据可读或可写,应用程序就会得到通知,不需要特别考虑事件的边界
但是,如果应用程序不及时处理数据,可能会导致频繁触发事件,浪费系统资源

边缘触发

仅在状态发生变化时触发通知。对于可读事件,只有当新数据到达时才触发;对于可写事件,只有当缓冲区从不可写变为可写时才触发

编程相对复杂,需要应用程序确保在触发事件时一次性处理完所有的数据,否则可能会错过事件
由于只在状态变化时触发,所以可以减少不必要的通知,提高系统性能

最后

我是醉墨居士,我们介绍了Linux的IO多路复用,感谢你的浏览,希望多多支持


http://www.ppmy.cn/ops/121672.html

相关文章

前端开发设计模式——单例模式

目录 一、单例模式的定义和特点: 1.定义: 2.特点: 二、单例模式的实现方式: 1.立即执行函数结合闭包实现: 2.ES6类实现: 三、单例模式的应用场景 1.全局状态管理: 2.日志记录器: …

【C++算法】10.滑动窗口_长度最小的子数组

文章目录 题目链接:题目描述:解法C 算法代码:图解 题目链接: 209. 长度最小的子数组 题目描述: 解法 解法一:暴力求解(会超时) 暴力枚举出所有子数组的和。 查找子数组n2&#xff0…

TryHackMe 第6天 | Web Fundamentals (一)

这一部分我们要简要介绍以下 Web Hacking 的基本内容,预计分三次博客。 在访问 Web 应用时,浏览器提供了若干个工具来帮助我们发现一些潜在问题和有用的信息。 比如可以查看网站源代码。查看源代码可以 右键 网页,然后选择 查看网站源代码&…

Pikachu-xss防范措施 - href输出 js输出

总体原则: 输入做过滤,输出做转义 过滤:根据业务需要进行过滤,如:输入点要求输入手机号,则只允许输入手机号格式的数字; 转义:所有输出到前端的数据,都根据输出点进行转…

第33次CCF计算机软件能力认证【T1~T3】:词频统计、相似度计算、化学方程式配平

题目概括词频统计枚举相似度计算STL工具(tranform()转换大小写) 模拟化学方程式配平大模拟高斯消元 1、词频统计 在学习了文本处理后,小 P 对英语书中的 n 篇文章进行了初步整理。 具体来说,小 P 将所有的英文单词都转化为了整数…

IDEA使用技巧

在使用IntelliJ IDEA(简称IDEA)这类集成开发环境(IDE)时,掌握一些高效的使用技巧和安装合适的插件可以显著提升开发效率。以下将从IDEA的使用技巧和插件推荐两个方面进行详细阐述。 一、IDEA使用技巧 1. 快捷键操作 …

Flink源码剖析

写在前面 最近一段时间都没有更新博客了,原因有点离谱,在实现flink的两阶段提交的时候,每次执行自定义的notifyCheckpointComplete时候,好像就会停止消费数据,完成notifyComplete后再消费数据;基于上述原因…

79. 单词搜索

思路 每次以当前位置为初始位置开始遍历,看是否找到单词 (以官方题解做出) v:代表等于work[k]且已走过的位置 d:四个方向 回溯(遍历): 匹配不上:终止 找到了:终止(先…