女友:不跟我解释清楚 Linux I/O 晚上你就睡沙发吧

news2024/9/28 11:17:27

目录

    • 阻塞 I/O
    • 非阻塞 I/O
    • I/O复用
    • 信号驱动 I/O
    • 异步 I/O
    • 总结

在这里插入图片描述
I/O 其实就是 input 和 output(输入输出)

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

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

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

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

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

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

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

在这里插入图片描述
接下来我们来看一下五种 Linux I/O 模型,不然晚上就得睡沙发了捏

阻塞 I/O

阻塞 I/O 称为 Blocking I/O,简称 BIO

在阻塞 I/O 模型里面,当进程发起一个读取文件的请求时(recvfrom 系统调用),如果内核缓冲区没有缓存对应的数据,那么内核就会去读取磁盘,将对应数据放到内核缓冲区,当数据读取完毕后,返回给进程

这便是第一个阶段,在第一阶段中,进程是阻塞的,它干不了任何事,只能乖乖地等内核将数据读取到内核缓冲区

当进程收到内核的响应之后,把内核缓冲区中的数据 copy 一份到程序缓冲区,最后完成读取文件的操作

这便是第二阶段,在第二阶段中,进程也是堵塞的,它只能乖乖地将数据从内核缓冲区 copy 到程序缓冲区

总结:在阻塞 I/O 模型里面,从硬件到内核,从内核到程序空间,都是阻塞的在这里插入图片描述

非阻塞 I/O

在非阻塞 I/O 模型中,当进程发起一个读取文件的请求时(recvfrom 系统调用),如果内核缓冲区没有缓存对应的数据,那么内核就会去读取磁盘,将对应数据放到内核缓冲区

但此时进程的请求不是堵塞的,内核在读取磁盘数据的时候会先返回一个错误信息给进程——数据暂时还没准备好,你待会再来试试

于是进程就会不断地向内核发起重试,一直问:数据准备好了没数据准备好了没

当内核读取数据完毕后,就会通知进程:数据已经准备好了,你可以来拿了

于是第一阶段就此结束,在第一阶段里面进程不会在这里干等,而是不断的轮询重试,但也是阻塞的

当进程收到内核的响应之后,把内核缓冲区中的数据 copy 一份到程序缓冲区,最后完成读取文件的操作

于是第二阶段就此结束,在第二阶段里面进程是堵塞的,它只能乖乖地将数据从内核缓冲区 copy 到程序缓冲区

总结:在非阻塞 I/O 模型里面,从硬件到内核,从内核到程序空间,都是阻塞的。但比阻塞 I/O 有进步了一点,并不是站在那里干等,而是时不时跑去问一下内核。即使是无用功,效率多少还是提高了一点的在这里插入图片描述

I/O复用

之所以叫复用,是因为在这个模型中进程可以同时操作多个数据流,而不像前面所讲的阻塞 I/O、非阻塞 I/O 同一时间只能操作一个数据流

在 I/O 复用模型中,进程监听多个数据流,然后去不断的轮询,当其中一个数据流有数据之后,内核便会通知进程

UNIX/Linux 下的 select、poll、epoll 就是干这个的(epoll 比 poll、select 效率高,做的事情是一样的)

于是第一阶段就此结束,在第一阶段里面进程会不断地对多个数据流进行轮询重试,但依旧是阻塞的

当收到内核的通知之后,进程就会将数据从内核缓冲区 copy 到 程序缓冲区,最后完成读取文件的操作

于是第二阶段就此结束,在第二阶段里面进程是堵塞的,它只能乖乖地将数据从内核缓冲区 copy 到程序缓冲区

I/O 多路复用中有 select、poll、epoll 函数,select 调用是内核级别的,select轮询相对非阻塞的轮询的区别在于——select 轮询可以监听多个数据流,当其中任何一个数据流的数据准备好了,就能返回成功

总结:

  • I/O 复用模型的第二阶段与阻塞 I/O、非阻塞 I/O 的第二阶段是一致的,但是在第一阶段中,进程能够同时轮询多个数据流,监听多个数据流,其效率有巨大的提升
  • I/O 多路复用是阻塞在select,epoll 这样的系统调用之上,而没有阻塞在真正的 I/O 系统调用如 recvfrom 之上
  • I/O 多路复用在阻塞到 select 阶段时,用户进程是主动等待并调用 select 函数获取数据就绪状态消息,并且其进程状态为阻塞。所以,把IO多路复用归为同步阻塞模式在这里插入图片描述

信号驱动 I/O

信号驱动 I/O 可以说是 I/O 模型上的一个里程碑

它与前面三个 I/O 模型的区别在于信号这个词

信号驱动 I/O 在第一阶段,即等待内核将数据从磁盘读取到内核缓冲区这个阶段,进程是不阻塞的,而是设置了一个信号回调,当数据到达内核缓冲区之后,内核调用程序的回调

在第一阶段里面进程是非阻塞的,它可以去干其他事情

当数据到达内核缓存区,进程收到内核的信号之后,进程再将数据从内核缓冲区 copy 到程序缓冲区,最后完成读取文件的操作

第二阶段就此结束,在第二阶段里面进程是堵塞的,它只能乖乖地将数据从内核缓冲区 copy 到程序缓冲区

总结:

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

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

异步 I/O

异步I/O 相比前面四个 I/O 模型,无论是第一阶段还是第二阶段都实现了非阻塞

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

即用户进程进行 aio_read 系统调用之后,无论内核数据是否准备好,都会直接返回给用户进程,然后用户态进程可以去做别的事情

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

总结:异步 IO 不仅仅是在第一阶段实现了信号回调,其也在第二阶段实现了信号回调,两个过程都是非阻塞的,从而完全实现了异步 IO 操作在这里插入图片描述

总结

我们根据这五种 I/O 模型在第一第二阶段的表现来总结一下:

  • 阻塞 I/O
    • 第一阶段(硬件到系统内核),阻塞
    • 第二阶段(系统内核到程序空间),阻塞
  • 非阻塞 I/O
    • 第一阶段(硬件到系统内核),轮询阻塞
    • 第二阶段(系统内核到程序空间),阻塞
  • I/O 复用
    • 第一阶段(硬件到系统内核),多路轮询阻塞
    • 第二阶段(系统内核到程序空间),阻塞
  • 信号驱动 I/O
    • 第一阶段(硬件到系统内核),信号驱动不阻塞
    • 第二阶段(系统内核到程序空间),阻塞
  • 异步 I/O
    • 第一阶段(硬件到系统内核),信号驱动不阻塞
    • 第二阶段(系统内核到程序空间),信号驱动不阻塞

从上面的 5 种 I/O 模型,我们可以看出,真正实现异步非阻塞的只有异步 IO 这种模型,而其他四种都是同步 I/O

因为在第二阶段:从内核缓冲区复制到程序缓冲区的时候,不可能干其他事情

最后再来简单说说阻塞与非阻塞、同步与异步的区别

阻塞与非阻塞:

  • 阻塞 I/O 会一直 block 对应的进程,直到 I/O 操作完成
  • 非阻塞 I/O 在内核还在准备数据的情况下会立刻返回给进程

同步与异步:

在说明synchronous IO和asynchronous IO的区别之前,需要先给出两者的定义。POSIX的定义是这样子的:

A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes;

An asynchronous I/O operation does not cause the requesting process to be blocked;

两者区别就在于——同步 I/O 做 I/O 操作(I/O operation)时会将进程阻塞掉,按照这个定义,之前所述的阻塞I/O、非阻塞 I/O,I/O 多路复用都属于同步 I/O

可能这里有人会想:非阻塞 I/O 并没有被 block 啊,请注意上面说的定义,定义中所指的 I/O 操作是指真实的 I/O 操作,就是上面例子中的 recvfrom 这个系统调用

非阻塞 I/O 在第一阶段,也就是执行 recvfrom 这个系统调用的时候,如果内核数据还没有准备好,是不会 block 进程的,但是在第二阶段,如果内核的数据准备好并要 copy 到用户缓冲区中,这个时候进程就会被 block

而异步 I/O 则不一样,它实现了两个阶段都是非阻塞的,当进程发起 I/O 操作之后,就直接返回再也不理睬了,直到内核发送一个信号,告诉进程说 I/O 完成。在这整个过程中,进程完全没有被block

在这里插入图片描述

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

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

相关文章

【大厂高频真题100题】《整数转罗马数字》 真题练习第21题 持续更新~

整数转罗马数字 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并列…

【解决方案】智慧城管非现场执法系统

通过自建摄像头或利用辖区现有监控摄像头,利用人工智能技术,通过深度学习算法,系统能够全天候自动识别和采集城管违章行为,实现店外经营智能分析、无证游商智能分析、乱堆物堆料智能分析、暴露垃圾等场景的智能分析,从…

黄金分析师职级如何评定?初级、高级如何划分?

自从中国加入WTO以后,对外贸易和境外投资持续高速增长,为国家带来了了巨额外汇积累。发展黄金市场、提高黄金投资需求,成为我国应对国际金融风险显现和美元贬值的重要举措。然而,黄金投资市场健康、持续的发展,需要大量…

shell的模拟实现

目录 整体框架分析 代码演示 代码分析 整体框架分析 考虑下面这个与shell典型的互动: [xzyecs-333953 date16]$ ls makefile mycmd mycmd.cpp myexec myexec.c test.py [xzyecs-333953 date16]$ psPID TTY TIME CMD 21919 pts/0 00:00:00 bash …

jmeter之数据库配置及修改(工作日记3)

首先,jmeter要配置数据库需要安装 jdbc.jar包 官网连接:https://dev.mysql.com/downloads/ 步骤1: 步骤二: 步骤三: 步骤四: 接着我们去jmeter导入此jar包: 然后我们就可以在jmeter中去…

CSS3 多列布局

文章目录CSS3 多列布局概述常用属性使用column-count 列数column-width 列宽column-gap 间距column-rule 边框column-span 跨列案例瀑布流布局CSS3 多列布局 概述 在CSS3之前,如果想要设计类似报纸那样的多列布局,有两种方式可以实现:一种是…

kaggle平台学习复习笔记 | pandas

目录1.Creating, Reading and Writing2.Indexing, Selecting & Assigning3.Summary Functions and Maps4.Grouping and Sorting5.Data Types and Missing Values6.Renaming and Combining获得开展独立数据科学项目所需的技能。 1.Creating, Reading and Writing DataFram…

安全帽识别算法技术原理

应用背景:安全帽作为一种最常见和实用的个人防护用具,能够有效地防止和减轻外来危险源对头部的伤害。但在现场操作过程中,安全帽的佩戴很容易人为忽略,引发了不少人身伤害事故。为了保证工作人员都能在作业中佩戴安全帽&#xff0…

CentOS/Red Hat 安装cuDNN

创建于:2023.01.04 修改于:2023.01.04 文章目录1、找到cuDNN版本号2、下载cuDNN3、安装cuDNN4、参考资料本文是在Linux Red Hat下安装的cuDNN,且假定您已经安装好了NVIDIA驱动、CUDA。 本文是在CUDA 11.2 Red Hat条件下安装的cuDNN。 1、找…

超高清直播“出圈”下的沉浸式文博会

在引领文化产业发展的文博会现场,前沿科技元素随处可见。VR、AR、4K/8K、元宇宙……各种“文化科技”的元素以刷新视听极限的美好体验,冲击着观众的眼球和感知。文博会现场,BOSMA博冠于数字文化展区展示国产8K超高清摄像机、BOSMA博冠望远镜等…

(小甲鱼python)集合笔记合集一 集合(上)总结 集合的简单用法 集合的各种方法合集:子、交、并、补、差、对称差集、超集

一、基础复习 集合与字典区别 集合中所有元素都是独一无二的&#xff0c;并且也是无序的。 集合具有唯一性、无序性、有限性 >>> type({}) #字典 <class dict> >>> type({"one"}) #集合 <class set> >>> type…

微服务保护 Sentinel 实战

目录Sentinel什么是雪崩问题&#xff1f;服务保护技术对比Sentinel介绍和安装初识Sentinel安装Sentinel微服务整合Sentinel流量控制簇点链路快速入门流控模式关联模式链路模式流控效果warm up排队等待热点参数限流全局参数限流热点参数限流案例隔离和降级FeignClient整合Sentin…

nVisual各项隐藏项配置说明

nVisual可以部署在不同的项目中&#xff0c;但是每个项目都有自己不同的使用场景&#xff0c;有的不需要报表功能&#xff0c;有的不需要监测功能&#xff0c;还有的不需要连接外网的功能等。针对这些不同的需求&#xff0c;有必要且有可使用的机制来满足这些场景。 nVisual使…

PageRank算法

什么是PageRank&#xff1f; PageRankPageRankPageRank算法由GoogleGoogleGoogle创始人LarryPageLarry\ PageLarry Page在斯坦福大学时提出&#xff0c;又称PRPRPR&#xff0c;佩奇排名。主要针对网页进行排名&#xff0c;计算网站的重要性优化搜索引擎的搜索结果。PRPRPR值表示…

Java大学生档案系统高校学生档案系统

简介 Java基于springboot开发的学生档案系统&#xff0c;包含了权限管理&#xff0c;学生档案&#xff0c;学生成绩录入&#xff0c;教师管理等。 演示视频 https://www.bilibili.com/video/BV1XV411b761/?share_sourcecopy_web&vd_sourceed0f04fbb713154db5cc611225d92…

SQL速算N日留存

之前才哥发布了《用SQL进行用户留存率计算》 链接&#xff1a;https://mp.weixin.qq.com/s/QJ8JUO00bVJe_K6sx_ttaw 简化数据后得到如下结构的数据&#xff1a; 由于用户和登录日期被设置为主键所以不需要再进行去重&#xff0c;下面看看如何快速求七日留存。 数据下载地址&…

数据中心基础设施管理(DCIM)工具

什么是DCIM DCIM (Data Center Infrastructure management) 数据中心基础设施管理 是将IT&#xff08;信息技术&#xff09;和设备管理结合起来对数据中心关键设备进行集中监控、容量规划等集中管理。通过软件、硬件和传感器等&#xff0c;DCIM提供一个独立的管理平台&#xf…

网购平台如何保障公平交易

抢购&#xff0c;是这三年来重复出现的关键词。 疫情初始&#xff0c;口罩、测温枪是抢购热点&#xff1b;随后&#xff0c;蔬菜从口罩接过“抢购”接力棒&#xff1b;不久后&#xff0c;退烧药、抗原、血氧仪、“特效药”先后成为抢购热点&#xff1b;甚至元旦假期间&#xf…

【微服务】服务拆分及远程调用

文章目录服务拆分服务拆分原则服务拆分示例导入Sql语句导入demo工程实现远程调用案例案例需求分析注册RestTemplate实现远程调用提供者与消费者服务拆分 服务拆分原则 我们拿到一个单体架构&#xff0c;一般按照功能模块进行拆分。 微服务拆分时的几个原则&#xff1a; 不同…

数据结构_红黑树(C语言)

数据结构总目录红黑树 介绍&#xff1a; 红黑树是一种特化的AVL树&#xff08;平衡二叉树&#xff09;&#xff0c;都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡&#xff0c;从而获得较高的查找性能。红黑树是一种平衡二叉查找树的变体&#xff0c;它的左右子树…