当前位置: 首页 > article >正文

Linux篇之IO多路复用

文章目录

  • 前言
  • 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.kler.cn/news/329079.html

相关文章:

  • 滚雪球学MySQL[6.2讲]:MySQL数据恢复详解:从备份中恢复数据与策略
  • 关于BSV区块链覆盖网络的常见问题解答(上篇)
  • 【游戏分组】
  • 网络抓包04 - SSLSocket
  • Oracle bbed编译安装及配置
  • 深入Volatile
  • 【数据结构】MapSet
  • spring loCDI 详解
  • 文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于节点碳势响应的新型电力系统鲁棒优化调度 》
  • springbot,JWT令牌的使用。实现http请求拦截校验。
  • 如何使用ssm实现影院管理系统的设计与实现
  • vscode中配置python虚拟环境
  • 大数据-151 Apache Druid 集群模式 配置启动【上篇】 超详细!
  • [深度学习]基于YOLO高质量项目源码+模型+GUI界面汇总
  • 如何通过Dockfile更改docker中ubuntu的apt源
  • Linux 搭建与使用yolov5训练和检验自建模型的步骤
  • Jenkins pipeline配置示例
  • NLP任务一些常用的数据集集锦
  • 解决 Adobe 盗版弹窗
  • 【Linux 从基础到进阶】HBase数据库安装与配置
  • 【DAY20240926】06从入门到精通:掌握 Git 分支操作的实用指南
  • 修复OpenSSH远程代码执行漏洞:版本升级到9.9p1
  • springboot启动流程
  • vue基于Spring Boot框架的高校实验室预约管理系统
  • 论文阅读:多模态医学图像融合方法的研究进展
  • golang rpc
  • TCP\IP标准与OSI标准
  • JS进阶 1——作用域、解构、箭头函数
  • 滚雪球学MySQL[3.2讲]:MySQL聚合函数与分组详解:COUNT、SUM、AVG、MAX、MIN及GROUP BY与HAVING
  • Qt 每日面试题 -5