一次I/O操作的过程

news2024/12/26 21:13:10

什么是IO呢?

IO,英文全称是Input/Output,翻译过来就是输入/输出。平时我们听得挺多,就是什么磁盘IO,网络IO。那IO到底是什么呢?是不是有种懵懵懂懂的感觉呀,好像大概知道它是什么,又好像说不清楚。

IO,即输入/输出,到底谁是输入?谁是输出呢?IO如果脱离了主体,就会让人疑惑。

计算机角度的IO

我们常说的输入输出,比较直观的意思就是计算机的输入输出计算机就是主体。大家是否还记得,大学学计算机组成原理的时候,有个冯.诺依曼结构,它将计算机分成分为5个部分:运算器、控制器、存储器、输入设备、输出设备。


输入设备是向计算机输入数据和信息的设备,键盘,鼠标都属于输入设备;输出设备是计算机硬件系统的终端设备,用于接收计算机数据的输出显示,一般显示器、打印机属于输出设备。

例如你在鼠标键盘敲几下,它就会把你的指令数据,传给主机,主机通过运算后,把返回的数据信息,输出到显示器。

鼠标、显示器这只是直观表面的输入输出,回到计算机架构来说,涉及计算机核心与其他设备间数据迁移的过程,就是IO。如磁盘IO,就是从磁盘读取数据到内存,这算一次输入,对应的,将内存中的数据写入磁盘,就算输出。这就是IO的本质。

操作系统的IO

我们要将内存中的数据写入到磁盘的话,主体会是什么呢?主体可能是一个应用程序,比如一个Java进程(假设网络传来二进制流,一个Java进程可以把它写入到磁盘)。

操作系统负责计算机的资源管理和进程的调度。我们电脑上跑着的应用程序,其实是需要经过操作系统,才能做一些特殊操作,如磁盘文件读写、内存的读写等等。因为这些都是比较危险的操作,不可以由应用程序乱来,只能交给底层操作系统来。也就是说,你的应用程序要把数据写入磁盘,只能通过调用操作系统开放出来的API来操作。

什么是用户空间?什么是内核空间?

以32位操作系统为例,它为每一个进程都分配了4G(2的32次方)的内存空间。这4G可访问的内存空间分为二部分,一部分是用户空间,一部分是内核空间。内核空间是操作系统内核访问的区域,是受保护的内存空间,而用户空间是用户应用程序访问的内存区域。

我们应用程序是跑在用户空间的,它不存在实质的IO过程,真正的IO是在操作系统执行的。即应用程序的IO操作分为两种动作:IO调用和IO执行。IO调用是由进程(应用程序的运行态)发起,而IO执行是操作系统内核的工作。此时所说的IO是应用程序对操作系统IO功能的一次触发,即IO调用。

操作系统的一次IO过程

应用程序发起的一次IO操作包含两个阶段:

IO调用:应用程序进程向操作系统内核发起调用。

IO执行:操作系统内核完成IO操作。

操作系统内核完成IO操作还包括两个过程:

准备数据阶段:内核等待I/O设备准备好数据

拷贝数据阶段:将数据从内核缓冲区拷贝到用户进程缓冲区


其实IO就是把进程的内部数据转移到外部设备,或者把外部设备的数据迁移到进程内部。外部设备一般指硬盘、socket通讯的网卡。一个完整的IO过程包括以下几个步骤:

应用程序进程向操作系统发起IO调用请求

操作系统准备数据,把IO外部设备的数据,加载到内核缓冲区

操作系统拷贝数据,即将内核缓冲区的数据,拷贝到用户进程缓冲区

阻塞IO模型

我们已经知道IO是什么啦,那什么是阻塞IO呢?

假设应用程序的进程发起IO调用,但是如果内核的数据还没准备好的话,那应用程序进程就一直在阻塞等待,一直等到内核数据准备好了,从内核拷贝到用户空间,才返回成功提示,此次IO操作,称之为阻塞IO


阻塞IO比较经典的应用就是阻塞socket、Java BIO

阻塞IO的缺点就是:如果内核数据一直没准备好,那用户进程将一直阻塞,浪费性能,可以使用非阻塞IO优化。

非阻塞IO模型

如果内核数据还没准备好,可以先返回错误信息给用户进程,让它不需要等待,而是通过轮询的方式再来请求。这就是非阻塞IO,流程图如下:


非阻塞IO的流程如下:

应用进程向操作系统内核,发起recvfrom读取数据。

操作系统内核数据没有准备好,立即返回EWOULDBLOCK错误码。

应用程序进程轮询调用,继续向操作系统内核发起recvfrom读取数据。

操作系统内核数据准备好了,从内核缓冲区拷贝到用户空间。

完成调用,返回成功提示。

非阻塞IO模型,简称NIO,Non-Blocking IO。它相对于阻塞IO,虽然大幅提升了性能,但是它依然存在性能问题,即频繁的轮询,导致频繁的系统调用,同样会消耗大量的CPU资源。可以考虑IO复用模型,去解决这个问题。

IO多路复用模型

既然NIO无效的轮询会导致CPU资源消耗,我们等到内核数据准备好了,主动通知应用进程再去进行系统调用,那不就好了嘛?

在这之前,我们先来复习下,什么是文件描述符fd(File Descriptor),它是计算机科学中的一个术语,形式上是一个非负整数。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。

IO复用模型核心思路:系统给我们提供一类函数(如我们耳濡目染的select、poll、epoll函数),它们可以同时监控多个fd的操作,任何一个返回内核数据就绪,应用进程再发起recvfrom系统调用。

IO多路复用之select

应用进程通过调用select函数,可以同时监控多个fd,在select函数监控的fd中,只要有任何一个数据状态准备就绪了,select函数就会返回可读状态,这时应用进程再发起recvfrom请求去读取数据。

非阻塞IO模型(NIO)中,需要N(N>=1)次轮询系统调用,然而借助select的IO多路复用模型,只需要发起一次询问就够了,大大优化了性能。

但是呢,select有几个缺点:

监听的IO最大连接数有限,在Linux系统上一般为1024。

select函数返回后,是通过遍历fdset,找到就绪的描述符fd。(仅知道有I/O事件发生,却不知是哪几个流,所以遍历所有流

因为存在连接数限制,所以后来又提出了poll。与select相比,poll解决了连接数限制问题。但是呢,select和poll一样,还是需要通过遍历文件描述符来获取已经就绪的socket。如果同时连接的大量客户端,在一时刻可能只有极少处于就绪状态,伴随着监视的描述符数量的增长,效率也会线性下降

因此经典的多路复用模型epoll诞生。

IO多路复用之epoll

为了解决select/poll存在的问题,多路复用模型epoll诞生,它采用事件驱动来实现,流程图如下:epoll先通过epoll_ctl()来注册一个fd(文件描述符),一旦基于某个fd就绪时,内核会采用回调机制,迅速激活这个fd,当进程调用epoll_wait()时便得到通知。这里去掉了遍历文件描述符的坑爹操作,而是采用监听事件回调的机制。这就是epoll的亮点。

我们一起来总结一下select、poll、epoll的区别

selectpollepoll

底层数据结构数组链表红黑树和双链表

获取就绪的fd遍历遍历事件回调

事件复杂度O(n)O(n)O(1)

最大连接数1024无限制无限制

fd数据拷贝每次调用select,需要将fd数据从用户空间拷贝到内核空间每次调用poll,需要将fd数据从用户空间拷贝到内核空间使用内存映射(mmap),不需要从用户空间频繁拷贝fd数据到内核空间

epoll明显优化了IO的执行效率,但在进程调用epoll_wait()时,仍然可能被阻塞。能不能酱紫:不用我老是去问你数据是否准备就绪,等我发出请求后,你数据准备好了通知我就行了,这就诞生了信号驱动IO模型

IO模型之信号驱动模型

信号驱动IO不再用主动询问的方式去确认数据是否就绪,而是向内核发送一个信号(调用sigaction的时候建立一个SIGIO的信号),然后应用用户进程可以去做别的事,不用阻塞。当内核数据准备好后,再通过SIGIO信号通知应用进程,数据准备好后的可读状态。应用用户进程收到信号之后,立即调用recvfrom,去读取数据。

信号驱动IO模型,在应用进程发出信号后,是立即返回的,不会阻塞进程。它已经有异步操作的感觉了。但是你细看上面的流程图,发现数据复制到应用缓冲的时候,应用进程还是阻塞的。回过头来看下,不管是BIO,还是NIO,还是信号驱动,在数据从内核复制到应用缓冲的时候,都是阻塞的。还有没有优化方案呢?AIO(真正的异步IO)!

IO 模型之异步IO(AIO)

前面讲的BIO,NIO和信号驱动,在数据从内核复制到应用缓冲的时候,都是阻塞的,因此都不算是真正的异步。AIO实现了IO全流程的非阻塞,就是应用进程发出系统调用后,是立即返回的,但是立即返回的不是处理结果,而是表示提交成功类似的意思。等内核数据准备好,将数据拷贝到用户进程缓冲区,发送信号通知用户进程IO操作执行完毕。

流程如下:

异步IO的优化思路很简单,只需要向内核发送一次请求,就可以完成数据状态询问和数据拷贝的所有操作,并且不用阻塞等待结果。日常开发中,有类似思想的业务场景:

比如发起一笔批量转账,但是批量转账处理比较耗时,这时候后端可以先告知前端转账提交成功,等到结果处理完,再通知前端结果即可。

阻塞、非阻塞、同步、异步IO划分

IO模型

阻塞I/O模型同步阻塞

非阻塞I/O模型同步非阻塞

I/O多路复用模型同步阻塞

信号驱动I/O模型同步非阻塞

异步IO(AIO)模型异步非阻塞

一个通俗例子读懂BIO、NIO、AIO

同步阻塞(blocking-IO)简称BIO

同步非阻塞(non-blocking-IO)简称NIO

异步非阻塞(asynchronous-non-blocking-IO)简称AIO

一个经典生活的例子:

小明去吃同仁四季的椰子鸡,就这样在那里排队,等了一小时,然后才开始吃火锅。(BIO)

小红也去同仁四季的椰子鸡,她一看要等挺久的,于是去逛会商场,每次逛一下,就跑回来看看,是不是轮到她了。于是最后她既购了物,又吃上椰子鸡了。(NIO

小华一样,去吃椰子鸡,由于他是高级会员,所以店长说,你去商场随便逛会吧,等下有位置,我立马打电话给你。于是小华不用干巴巴坐着等,也不用每过一会儿就跑回来看有没有等到,最后也吃上了美味的椰子鸡(AIO)。



作者:马云生
链接:https://www.jianshu.com/p/f3cc37e6b90d
 

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

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

相关文章

ARIMA模型

1、简介 ARIMA模型(Autoregressive Integrated Moving Average model),差分整合移动平均自回归模型,又称整合移动平均自回归模型,时间序列预测分析方法之一。ARIMA(p,d,q)中,AR是"自回归",p为自回归项数;MA…

二叉树题目:最大层内元素和

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题:最大层内元素和 出处:1161. 最大层内元素和 难度 4 级 题目描述 要求 给定一个二叉树的根结点 ro…

zookeeper可视化工具ZooInspector用法

最近在做银行的项目,用到了thrift,rpc和zookeeper,所有应用都是注册到zookeeper上的,想知道哪些应用注册上了,就用到ZooInspector这个可视化的工具。 1,下载 链接:https://issues.apache.org/…

flex弹性盒模型与阿里图标的使用

华子目录 flex布局flex布局原理flex使用三要素 阿里图标(字体) flex布局 相关学习网站:http://c.biancheng.net/css3/flex.html 1.flex是当前最主流的布局方式:用它布局起来更方便,取代了浮动的作用。 2.浮动布局有缺…

BUG:阿里巴巴图标库引入链接后,icon有时候会不显示的话svg下载到本地使用

忽然icon图标就不显示,但是代码、icon链接地址都没有发生变化 解决办法:将icon图标下载到本地,记住前后引用本地的名字要保持一致

学习jQuery库的第一天

简介 什么是 jQuery ? jQuery 是一个广泛使用的 JavaScript 库。它简化了网页开发中常见的许多任务,例如 HTML 文档遍历、操作 HTML 元素、处理事件、动画效果、Ajax 网络请求等。通过使用 jQuery,开发人员可以更加高效地编写跨浏览器兼容的…

如何制作一个成功的超市购物小程序

随着互联网的普及和移动支付的便捷性,越来越多的消费者选择在网上购物,这也促使越来越多的商家开始搭建自己的小程序商城。对于超市便利店来说,拥有一个便捷、易用的小程序商城能够吸引更多的消费者,提高销售效率。那么如何快速搭…

MyBatis初级

文章目录 一、mybatis1、概念2、JDBC缺点2.1、之前jdbc操作2.2 、原始jdbc操作的分析 3、mybatis的使用3.1、导入maven依赖3.2、新建表3.3、实体类3.4、编写mybatis的配置文件3.5、编写接口 和 映射文件3.6、编写测试类3.7、注意事项 4、代理方式开发5、mybatis和spring整合5.1…

数学实验-最佳分数近似值(Mathematica实现)

一、实验名称:最佳分数近似值 二、实验环境:Mathematica 10.3软件 三、实验目的:研究怎样用分数近似值去对给定的无理数作最佳逼近,“最佳”就是既要误差小,又要分母小。我们首先需要对“最佳”定出具体而明确的标准…

动态IP代理是什么?一文看懂动态代理IP

一、什么是动态IP代理? 动态IP代理是一种代理服务,而动态IP是由ISP动态分配给用户的IP地址,这些IP地址会周期性地更改。每次链接互联网时,用户会被分配一个新的IP地址,因而也称为”轮换IP”。 IP地址轮换是一个过程&…

Roreg复现

一、roreg复现 [github链接][参考] 1.1 报错1 Traceback (most recent call last): File "setup.py", line 52, in <module> import torch File "/home/w/anaconda3/envs/pty_roreg/lib/python3.7/site-packages/torch/__init__.py", line …

公司中一个好的管理者应该是什么样的?

一个好的管理者&#xff0c;不仅在公司中发挥着至关重要的作用&#xff0c;而且能够对组织的成功和员工的幸福产生深远的影响。那么&#xff0c;一个好的管理者应该具备哪些特质和技能呢&#xff1f;以下是我根据现有研究和经验总结出来的一些观点。 强大的领导力&#xff1a;…

【干货超全】国内外常见的Ai大模型汇总!!!

国内外常见的Ai大模型汇总: 点击文字即可跳转 1&#xff09;国内 讯飞星火大模型 https://xinghuo.xfyun.cn 百度文心一言 https://yiyan.baidu.com 阿里通义千问 https://tongyi.aliyun.com 华为盘古大模型 https://pangu.huaweicloud.com/ 清华智谱清言链接&#xff1…

卖课不挣钱,为什么还要卖?背后原因你绝对想不到

#职场经验谈# 大家好&#xff0c;这里是程序员晚枫&#xff0c;全网同名。 这几年一直在维护一个开源项目&#xff1a;python-office&#xff0c;GitHub和gitee都能搜索到。 我今晚算了一下&#xff0c;在维护这个开源项目的过程中&#xff0c;通过技术答疑、制作课程、发布广…

观测云接入 NewRelic .NET 探针

背景 部分客户系统采用的是.NET 4.5 部署研发的、基于 IIS 进行发布的 Web 项目&#xff0c;需要接入到观测云进行链路信息展示&#xff0c;ddtrace 和 otel 对于低版本.NET 支持力度有限。 环境信息 IIS 4.0.NET core 4.0、4.5、4.6Window Server 2012 R2 域名配置 准备一…

释放数据价值这道难题,Smartbi V11有解

《未来简史》预言&#xff1a;数据将成为人们未来的信仰。 未来已来&#xff0c;将至已至。如今&#xff0c;数据所扮演的角色与作用超乎想象。从政府将数据要素列入生产要素之中&#xff0c;到数据驱动型业务场景涌现&#xff0c;企业与组织对于数据及其价值的认可度明显提升…

【皇帝的新装】从不一样的视角看OKR

OKR是“目标和关键成果”&#xff0c;是企业进行目标管理的一个简单有效的系统&#xff0c;能够将目标管理自上而下贯穿到基层&#xff1b;为什么公司和个人都要用OKR&#xff1f; 一、Why 我们分两点来谈“为什么要用OKR”&#xff0c;一个点是“我们公司&#xff08;老板&am…

【Linux】—— 在Linux上进行读写文件操作

前言&#xff1a; 在之前&#xff0c;我已经对进程的相关知识进行了详细的介绍。本期开始&#xff0c;我们将要学习的是关于 “基础I/O”的知识&#xff01;&#xff01;&#xff01; 目录 &#xff08;一&#xff09;C文件接口 &#xff08;二&#xff09;系统文件I/O 1、接…

git中无法使用方向键的问题

windows下使用git命令行执行react脚本安装&#xff0c;发现无法使用上下键来去选中选项。最后只能换成cmd命令执行&#xff0c;发现可以上下移动以选中需要的选项。 bash命令行&#xff1a;移动光标无法移动选项 cmd命令行

为职场注入新活力,中国人民大学与加拿大女王大学金融硕士项目伴你追光而行

在金融职场从业多年的你&#xff0c;是否觉得有点疲惫呢&#xff0c;踏入职场一路过关闯将走到了今天&#xff0c;居于中高层管理的你是否需要注入新的能量呢&#xff0c;中国人民大学与加拿大女王大学金融硕士项目为你带来全新的课程体验&#xff0c;伴你追光而行。 中国人民大…