做个家务,让我搞懂了 Linux I/O 模型

news2024/11/17 5:38:34

I/O 其实就是 input 和 output(输入输出)

在计算机操作系统中对应数据流的输入与输出,在 Linux 中,既有文件的 I/O,也有网络 I/O

无论是文件 I/O 还是网络 I/O,其传输过程都是类似的

今天我们以文件 I/O 为例,来深入浅出一下 Linux 的 I/O 模型

我们的程序想要打开一个文件,去查看里面的内容,那么就需要将文件内容加载到内存里面,这个过程是一个比较复杂的过程

首先需要通过内核将数据从硬盘中读取出来,然后放到操作系统的内核缓冲区中,然后再将数据拷贝到程序缓冲区,这时候程序才能获取到相应的数据,打开相应的文件

简单来说,无论什么 I/O 模型,其读取过程都会经历下面两个阶段:

  • 将数据放到内核缓冲区(等待数据过程)
  • 将内核缓冲区的数据拷贝(copy)到程序缓冲区(拷贝数据过程)

在这里插入图片描述

上面两个阶段完成之后,进程才能够对数据进行操作(读 or 写)

为了让大家能够更好的理解 Linux I/O 模型,咸鱼用囤了一个星期的臭衣服来作为例子(主要是懒)

一个轻松惬意的周六下午,咸鱼看着满满一篮子的臭衣服,痛定思痛,决定今天一定要把这堆衣服洗了

但是咸鱼家的洗衣机比较老旧,别人家的洗衣机都是洗涤甩干一条龙的,咸鱼家的洗衣机只能先洗涤,等洗涤完毕后咸鱼再去按甩干按钮进行衣服甩干(太惨了)

那么就将洗衣服可以分为两个阶段:

  • 按下洗涤按钮,洗衣机对衣服进行洗涤
  • 按下甩干按钮,洗衣机对衣服进行甩干

以上两个阶段均完成了之后,咸鱼才能把衣服拿去晾晒

阻塞 I/O

咸鱼在按下了洗衣机的洗涤按钮之后,就拿个小板凳在旁边干等着,在洗涤完衣服之前咸鱼啥事都不能干,只能乖乖地等洗衣机洗涤衣服

当洗衣机洗完衣服之后,咸鱼就按下甩干按钮,然后依旧坐在小板凳上干等着,直到洗衣机甩干好衣服为止

以上这两个阶段(洗涤和甩干阶段),咸鱼都处在一个阻塞的状态,他啥也干不了,只能乖乖地等洗衣机工作完

总结:

在阻塞 I/O 模型里面,将数据放到内核缓冲区(等待数据过程)以及将内核缓冲区的数据拷贝(copy)到程序缓冲区(拷贝数据过程),进程都是阻塞的

非阻塞 I/O

跟第一次不一样的是,咸鱼按下了洗衣机的洗涤按钮之后,他会不断地去打开洗衣机盖子,去看衣服洗好了没有

等洗衣机洗好了衣服之后,咸鱼按下洗衣机的甩干按钮,然后坐在小板凳上干等着,直到洗衣机甩干好衣服为止

以上这两个阶段(洗涤和甩干阶段),咸鱼都处在一个阻塞的状态,他啥也干不了,但是在第一阶段(洗涤阶段),咸鱼并没有干等着,而是不断地去查看洗衣机的状态——是否洗好衣服了

总结:

在非阻塞 I/O 模型里面,将数据放到内核缓冲区(等待数据过程)以及将内核缓冲区的数据拷贝(copy)到程序缓冲区(拷贝数据过程),都是阻塞的。

但比阻塞 I/O 有进步了一点,进程并不是站在那里干等,而是时不时跑去问一下内核。即使是无用功,效率多少还是提高了一点的

I/O复用

这一天,邻居家里有事外出了,但邻居也在洗衣服,于是邻居就拜托咸鱼帮忙看一下洗衣机

邻居家的洗衣机跟咸鱼家的洗衣机一样老旧,同样需要先洗涤后甩干

这个时候咸鱼就需要去不断地来回跑,先去看看自己家的洗衣机洗好衣服了没,然后再去看看邻居家洗衣机洗好衣服了没,接着再去看看自己家洗衣机洗好衣服了没

循环往复,直到看到某一台洗衣机完成洗涤

当咸鱼看到某一台洗衣机完成洗涤之后,就需要按下甩干按钮然后乖乖等衣服甩干

在洗涤阶段里面,咸鱼会不断地对洗衣机进行轮询查看,但依旧是阻塞的,因为咸鱼干不了其他事

在甩干阶段里,也是堵塞的,咸鱼只能乖乖地等洗衣机将衣服甩干

总结:

I/O复用模型的第二阶段与阻塞 I/O、非阻塞 I/O 的第二阶段是一致的(进程是堵塞的只能乖乖地将数据从内核缓冲区 copy 到程序缓冲区)

但是在第一阶段中,进程能够同时轮询多个数据流,监听多个数据流,其效率有巨大的提升

信号驱动 I/O

咸鱼发现,在小板凳上干等着多浪费时间啊,俗话说浪费时间无异于自杀,咸鱼决定在洗衣机洗涤阶段去干其他家务活,当洗衣机洗涤完毕后,会发出滴滴的声音,咸鱼听到这个声音之后就回来对衣服甩干

于是在洗涤阶段,咸鱼再也不用坐在小板凳上干等着,而是去拖地、烧水(干其他事)

当洗衣机洗涤完毕后,发出滴滴声音(信号),咸鱼听到这个声音之后就回来然后对衣服进行甩干

但是在甩干阶段咸鱼还是需要坐在小板凳上乖乖地等着

总结:

虽然说信号驱动 I/O 模型的第二阶段跟前面三个 I/O 模型一样,即进程是阻塞的。但在第一阶段做到了真正的异步

信号驱动 IO 在第一阶段,进程去请求内核读取数据,这时候其不会阻塞,也不会去轮询,而是设置一个信号回调。 当数据完全拷贝到系统内核时,系统发出 SIGIO 信号,通知进程去进行第二阶段,将数据拷贝到程序缓冲区

异步 I/O

聪明的咸鱼再次发现,既然我在洗涤阶段可以去干其他事,当我听到洗衣机洗涤完毕发出的滴滴声时我再回来进行甩干

那我为什么不能在甩干阶段也去干其他事情呢,当衣服甩干之后,洗衣机发出嘟嘟声,我听到嘟嘟声就知道甩干完毕了

于是在洗涤阶段和甩干阶段,咸鱼都不需要坐在小板凳上干等着,而是去干别的事情,当洗涤完毕或者甩干完毕的时候,洗衣机会发出滴滴或嘟嘟的声音

咸鱼听到声音就知道洗衣机洗涤或甩干完毕了,这时候他再过来处理衣服就行了

总结:

与信号驱动 I/O 类似,异步 I/O 模型在第一阶段通过信号回调的方式实现了进程的非阻塞

而在第二阶段,进程将数据从内核缓冲区 copy 到程序缓冲区的时候并非阻塞,而是同样设置一个信号回调,当 copy 完成后,进程收到通知,再去执行相应的操作

异步 IO 不仅仅是在第一阶段实现了信号回调,其也在第二阶段实现了信号回调,从而完全实现了异步 IO 操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/82979.html

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

相关文章

【Unity学习笔记】UnrealToUnity教程:(网上购买的素材导入Unreal+插件转Unity)

【Unity学习笔记】UnrealToUnity教程: 最近想从Unreal那边化点缘借借素材,没想到踩到一个大坑 一,素材导入Unreal 这个教程比较多,根据素材的来源,传送门是以下这几个: 1.项目之间互相迁移,不…

PGL 系列(一)图的基础概念

一、图知识 图的节点间是否有方向,可将图分为无向图与有向图; 图的边是否有权重,可以将图分为无权图和有权图; 图的边和点是否具有多种类型,可以将图分为同构图和异构图 度是图上一节点,其边的条数 邻居指的是图上一节点的相邻节点 无向图:临界矩阵就是

值得一看,阿里又杀疯了开源内部“M9”级别全彩版分布式实战笔记

学习是一种基础性的能力。然而,“吾生也有涯,而知也无涯。”,如果学习不注意方法,则会“以有涯随无涯,殆矣”。 学习就像吃饭睡觉一样,是人的一种本能,人人都有学习的能力。我们在刚出生的时候…

汽车以太网物理层IOP自动化测试解决方案

解决方案功能介绍 该解决方案的测试目的是定义一组测试,以确保使用具有100 BASE-T1或1000BASE-T1能力的PHYs的多个设备之间的互操作性,要求每个PHY能够在给定的时间限制内建立稳定的链路,能够可靠地监视当前链路状态并将其传递到上层&#x…

CRMEB电商商城系统阿里云ECS服务器安装配置搭建教程文档

阿里云ECS服务器配置教程:一、推荐使用宝塔Linux面板,简单好用。二、放行服务器端口。详细步骤: 1.在阿里云控制台,云服务器ECS,实例,点击最右侧更多→实力状态→停止。 2.选择停止,点击确定. …

Java培训堆 Heap永久区

永久区 永久存储区是一个常驻内存区域,用于存放JDK自身所携带的 Class,Interface 的元数据,也就是说它存储的是运行环境必须的类信息,被装载进此区域的数据是不会被垃圾回收器回收掉的,关闭 JVM 才会释放此区域所占用的内存。 J…

Cross-modal Pretraining in BERT(跨模态预训练)

BERT以及BERT后时代在NLP各项任务上都是强势刷榜,多模态领域也不遑多让…仅在2019 年就有8篇的跨模态预训练的论文挂到了arxiv上…上图是多篇跨模态论文中比较稍迟的VL-BERT论文中的比较图,就按这个表格的分类(Architecture)整理这…

[LeetCode 1781]所有子字符串美丽值之和

题目描述 题目链接:所有子字符串美丽值之和 一个字符串的 美丽值 定义为:出现频率最高字符与出现频率最低字符的出现次数之差。 比方说,“abaacc” 的美丽值为 3 - 1 2 。 给你一个字符串 s ,请你返回它所有子字符串的 美丽值…

微信小程序框架(五)-全面详解(学习总结---从入门到深化)

目录 UI框架_TDesign 引入TDesign UI框架_TDesign组件 Rate 评分 Toast 轻提示 UI框架_Vant 使用方式 引入组件 UI框架_Vant组件 Overlay 遮罩层 Grid 宫格 Card 商品卡片 UI框架_TDesign TDesign 企业级设计体系(前端UI组件库) 地址:…

影响项目进度的因素有哪些?如何跟踪项目计划?

影响项目进度的因素: 1、项目经理能力不足 一名优秀的项目经理,要对制定项目计划、安全、质量、成本管理等各项工作都熟悉,也要能管理好项目团队。 如果无法有效管理团队、没有完全掌握项目管理方法等都是项目经理能力不足的表现&#xff…

跳槽一次能涨多少?今天见识到跳槽天花板。

2022年马上就快结束了,最近内卷严重,各种跳槽裁员,相信很多小伙伴也在准备明年的金三银四的面试计划。 在此分享一套学习笔记 / 面试手册,年后跳槽的朋友可以好好刷一刷,还是挺有必要的,它几乎涵盖了所有的…

软件测试必须要加班吗?

我在面试时一般会问面试官:“公司每次迭代周期多久?加班多么?”这个问题一般都是看这家公司的上班节奏怎么样,加班多不多,自己能不能扛住加班的压力。一般来说,刚进公司,需要对环境、业务、代码…

10:30面试,10:31就出来了 ,问的实在是太...

从外包出来,没想到算法死在另一家厂子 自从加入这家公司,每天都在加班,钱倒是给的不少,所以也就忍了。没想到8月一纸通知,所有人不许加班,薪资直降30%,顿时有吃不起饭的赶脚。 好在有个兄弟内推…

CMake中target_include_directories的使用

CMake中target_include_directories命令用于向target中添加包含目录,其格式如下: target_include_directories(<target> [SYSTEM] [AFTER|BEFORE]<INTERFACE|PUBLIC|PRIVATE> [items1...][<INTERFACE|PUBLIC|PRIVATE> [items2...] ...]) 指定在编译给定targ…

MySQL 事务特性和事务隔离级别

1. MySQL 事务的四大特性 2. MySQL 事务的并发问题 3. MySQL 事务的隔离级别 --------------------------------------------------------- 1. MySQL 事务的四大特性 MySQL 事务具有四个特性&#xff1a;原子性、一致性、隔离性、持久性&#xff0c;这四个特性简称 ACID 特性…

写文章常用的几款软件

编写文章Typora Typora网址 就是一款非常优秀的桌面端笔记本软件, 支持实时预览的 Markdown 文本编辑器. 支持导出HTML, PDF, Word等格式 画图excalidraw excalidraw在线网址 一个开源免费的画图软件 目前看到的最舒服的画图软件, 拥有丰富的图库, 好看的风格 录制GIF的LICEc…

Go开发中如何进行自定义Response.go封装实现

自定义Respone好处 在写接口的时候&#xff0c;我们通过都需要将前端小伙伴发给我们的请求进行校验和返回数据&#xff0c;如果是正确的请求参数&#xff0c;那么也符合我们的校验&#xff0c;则需要返回数据给他们&#xff0c;并且给予提示&#xff1b;反之&#xff0c;如果请…

不知道WPS转PPT怎么转换?来看看我自用的两种方法就知道了

wps转ppt怎么转换 &#xff08;百&#xff09;wps转ppt怎么转换&#xff1f;分享这几种转换方法 &#xff08;搜&#xff09;WPS怎么转PPT&#xff1f;今天教你学会WPS转PPT &#xff08;企&#xff09;WPS如何转PPT&#xff1f;WPS转PPT转换方法分享 &#xff08;网&#xff…

Datax

1、Datax简要描述 DataX 是阿里云 DataWorks数据集成 的开源版本&#xff0c;在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。DataX 实现了包括 MySQL、Oracle、OceanBase、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、Hologres、…

ADI Blackfin DSP处理器-BF533的开发详解39:图像处理专题-图像灰度均衡处理(含源码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 代码实现了图像灰度均衡&#xff0c;代码运行时&#xff0c;会通过文件系统打开工程文件根目下" …/ImageView"路径中的 tes…