Linux篇之IO多路复用

embedded/2024/10/19 0:19:47/

文章目录

  • 前言
  • 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/embedded/120999.html

相关文章

C++编程:实现简单的高精度时间日志记录小程序

0. 概述 为了检查是否存在系统时间跳变,本文使用C实现了一个简单的高精度时间日志记录小程序。该程序能够每隔指定时间(默认40毫秒)记录一次系统时间到文件中,并具备以下功能: 自定义时间间隔和文件名:通…

鸿蒙 如何退出 APP

terminateSelf() 停止Ability自身 在EntryAbility中这么使用 this.context.terminateSelf()在Pages页面中这么使用 import { common } from kit.AbilityKit (getContext(this) as common.UIAbilityContext)?.terminateSelf() 也可以直接封装: import common f…

初识算法 · 双指针(2)

目录 前言: 盛最多水的容器 题目解析: 算法原理: 算法编写: 有效三角形的个数 题目解析: 算法原理: 算法编写: 前言: 本文介绍两个题目,盛最多水的容器和有效三…

hive/impala/mysql几种数据库的sql常用写法和函数说明

做大数据开发的时候&#xff0c;会在几种库中来回跳&#xff0c;同一个需求&#xff0c;不同库函数和写法会有出入&#xff0c;在此做汇总沉淀。 1. hive 1. 日期差 DATEDIFF(CURRENT_DATE(),wdjv.creation_date) < 30 30天内的数据 2.impala 3. spark 4. mysql 1.时间差…

【SQL】未订购的客户

目录 语法 需求 示例 分析 代码 语法 SELECT columns FROM table1 LEFT JOIN table2 ON table1.common_field table2.common_field; LEFT JOIN&#xff08;或称为左外连接&#xff09;是SQL中的一种连接类型&#xff0c;它用于从两个或多个表中基于连接条件返回左表…

计算机毕业设计宠物领养网站我的发布领养领养用户信息/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序

目录 1.课题背景 2.课题意义 ‌ 3.技术介绍 4.技术性需求 4.1后端服务‌&#xff1a; 4.2 前端展示‌ 5.数据库设计‌&#xff1a; 6.系统性能‌&#xff1a; 7.安全性‌&#xff1a; 8. 功能介绍&#xff1a; 9. 部分代码 1.课题背景 近年来&#xff0c;随着宠物饲养数量…

Maven下载、安装与环境配置详解:从零开始搭建高效Java开发环境

下载 官方网站&#xff1a;http://maven.apache.org/ 下载页面&#xff1a;http://maven.apache.org/download.cgi 官网 下载页面 注&#xff1a;本教程使用的是3.3.9版本的maven。 安装 maven安装包下载完成后是一个压缩文件&#xff0c;如下图所示&#xff1a; 我们需要将…

前端开发设计模式——策略模式

目录 一、策略模式的定义和特点 1.定义&#xff1a; 2.特点&#xff1a; 二、策略模式的实现方式 1.定义策略接口&#xff1a; 2.创建具体策略类&#xff1a; 3.定义上下文类&#xff1a; 三、策略模式的应用场景 1.表单验证场景&#xff1a; 2.动画效果切换场景&…