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.mzph.cn/bicheng/55598.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在掌控板中加载人教版信息科技教学指南中的educore库

掌控板中加载educore库 人教信息科技数字资源平台(https://ebook.mypep.cn/free)中的《信息科技教学指南硬件编程代码说明》文件中提到“本程序说明主要供教学参考。需要可编程主控板须支持运行MicroPython 脚本程序。希望有更多的主控板在固件中支持ed…

AppointmentController

目录 1、 AppointmentController 1.1、 保存主页面信息 1.1.1、 //预约表 1.1.2、 维修明细表 1.1.3、 //配件明细表 1.1.4、 1.1.5、 //从某集合中删除其与另一个集合中相同的项;其实这个说简单点就是某集合中独有的元素(差集) 1.1.6、 //删除 1…

(JAVA)浅尝关于 “栈” 数据结构

1. 栈的概述: 1.1 生活中的栈 存储货物或供旅客住宿的地方,可引申为仓库、中转站。例如酒店,在古时候叫客栈,是供旅客休息的地方,旅客可以进客栈休息,休息完毕后就离开客栈 1.2计算机中的栈 将生活中的…

设计模式(3)builder

需求: 对于复杂的对象,我们只需要 通过 设置一些参数,就可以得到相对应的 实例。 简单来说, 需求就是用一个类 通过方法返回一个 新建的对象,而且可以通过方法去设置这个对象 public interface CarBuilder {void se…

有些硬盘录像机接入视频汇聚平台EasyCVR后通道不显示/显示不全,该如何处理?

EasyCVR视频监控汇聚管理平台是一款针对大中型项目设计的跨区域网络化视频监控集中管理平台。该平台不仅具备视频资源管理、设备管理、用户管理、运维管理和安全管理等功能,还支持多种主流标准协议,如GB28181、RTSP/Onvif、RTMP、部标JT808、GA/T 1400协…

Pikachu-Sql Inject-数字型注入(GET)

一、、破解 SQL 查询语句中的字段数 ?id1 order by 3 -- // -- 是注释, 加号 在MySQL中会转成空格 order by 1 ,by 数字几,就是按照第几列进行排序;如果没有这一行,则报错 如:以下语句,根据…

RabbitMQ(死信队列)

一、本文抒写背景 前面我也在延迟队列篇章提到过死信队列,也提到过一些应用场景! 今天呢,这篇文章,主要就是实战一个业务场景的小Demo流程,哈哈,那就是延迟关闭订单。 二、开始啦!letgo! 首…

Qt系统学习篇(6)-QMainWindow

QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个锚接部件(dock widgets)、一个状态栏(status bar)及一个中心部件(central widget),是许多应用程序的基础,如文本编辑器,图片编…

不同环境不同的配置文件;不同地区的数据库连接

不同地区的数据库不同,是怎么找到不同的数据库的 在Spring Boot项目中,如果存在application.yml、application-test.yml、application-prod.yml等多个配置文件,Spring Boot会根据当前激活的配置文件环境来决定使用哪个配置文件。以下是关于如…

MyBatisPlus——学习笔记

MyBatisPlus 一、导入依赖 <!-- MyBatisPlus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version></dependency><!-- MySql --><de…

物理学基础精解【41】

文章目录 核物理基础 Υ \varUpsilon Υ衰变1. Υ \varUpsilon Υ衰变的一般性质2. 具体的衰变模式3. 衰变公式和机制4. 实验观测和理论研究 Υ \varUpsilon Υ衰变概述一、定义二、公式三、定理一、定义二、公式三、定理 重带电粒子概述重带电粒子的性质重带电粒子的公式 重带…

【AIGC】VoiceControl for ChatGPT指南:轻松开启ChatGPT语音对话模式

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;安装VoiceControl for ChatGPT插件&#x1f4af;如何使用VoiceControl for ChatGPT进行语音输入VoiceControl for ChatGPT快捷键注意点 &#x1f4af;VoiceControl for C…

mfc140u.dll缺失?快速解决方法全解析,解决mfc140u.dll错误

当你的电脑出现找不到mfc140u.dll的问题&#xff0c;不少用户在使用电脑时陷入了困扰。这个错误提示就像一道屏障&#xff0c;阻挡了用户正常使用某些软件。无论是办公软件、游戏还是专业的设计工具&#xff0c;一旦出现这个问题&#xff0c;都会导致软件无法正常运行。如果您也…

jQuery 选择器

jQuery 是什么&#xff1f; jQuery 是一个非常流行的 JavaScript 库&#xff0c;它简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。本篇博客将介绍一些常用的 jQuery 方法&#xff0c;帮助你更轻松地使用 jQuery 进行 Web 开发。 一、DOM 选择与遍历 1.1 基本选择器 $…

python:reportlab 将多个图片合并成一个PDF文件

承上一篇&#xff1a;java&#xff1a;pdfbox 3.0 去除扫描版PDF中文本水印 # 导出扫描版PDF文件中每页的图片文件 java -jar pdfbox-app-3.0.3.jar export:images -prefixtest -i your_book.pdf 导出 Writing image: test-1.jpg Writing image: test-2.jpg Writing image: t…

webGL入门(六)图形旋转

效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</…

ndb9300public-ndb2excel简介

1 引言 ndb9300是一个自己定义的机载导航数据库劳作&#xff08;不敢称为项目&#xff09;代号&#xff0c;其中3表示是第3种数据库。 多年前&#xff0c;对在役民航客机中的某型机载导航数据库的二进制文件进行分析&#xff0c;弄明白它的数据结构后做了几个工具&#xff0c…

Redis-持久化机制

Redis持久化方式 rdb -> 全量 aof -> 增量 也可以两种同时开启&#xff0c;混合持久化(4.0 后) rdb 简介 配置文件 redis 6.0.16 及其以下 redis 6.2 7.0 配置说明 有两种触发方式&#xff1a;手动&#xff0c;自动 修改 save 5 2dir /myredis/dump (储存的文件夹需…

【机器学习】探索GRU:深度学习中门控循环单元的魅力

目录 &#x1f354; GRU介绍 &#x1f354; GRU的内部结构图 2.1 GRU结构分析 2.2 GRU工作原理 2.4 Bi-GRU介绍 2.3 使用Pytorch构建GRU模型 2.5 GRU优缺点 &#x1f354; 小结 学习目标 &#x1f340; 了解GRU内部结构及计算公式. &#x1f340; 掌握Pytorch中GRU工具…

1000题-计算机网络系统概述

术语定义与其他术语的关系SDU&#xff08;服务数据单元&#xff09;相邻层间交换的数据单元&#xff0c;是服务原语的表现形式。在OSI模型中&#xff0c;SDU是某一层待传送和处理的数据单元&#xff0c;即该层接口数据的总和。 - SDU是某一层的数据集&#xff0c;准备传递给下一…