Linux下的I/O模型

目录

一、什么是IO?

二、IO操作的两个阶段

三、五种I/O模型

1、阻塞I/O(blocking I/O)

2、非阻塞I/O(non-blocking I/O)

3、多路复用I/O(multiplexing I/O)

4、信号驱动I/O(signal-driven I/O)

5、异步I/O(asynchronous I/O)

四、五种I/O模型比较


一、什么是IO?

IO 是 Input/Output 的缩写,指的是输入和输出。在计算机当中,IO 操作通常指将数据从一个设备或文件中读取到计算机内存中,或将内存中的数据写入设备或文件中。这些设备可以包括硬盘驱动器、网卡、键盘、屏幕等。

通常用户进程中的一个完整I/O分为两个阶段:用户进程空间→内核空间→设备空间

I/O分为内存I/O、网络I/O和磁盘I/O三种


二、IO操作的两个阶段

Linux中进程无法直接操作I/O设备,其必须通过系统调用请求内核来协助完成I/O操作。
内核会为每个I/O设备维护一个缓冲区。
对于一个输入操作来说,进程I/O系统调用后,内核会先看缓冲区中有没有相应的缓存数据,没有的话再到设备(比如网卡设备)中读取(因为设备I/O一般速度较慢,需要等待);

内核缓冲区有数据则直接复制到用户进程空间。所以,对于一个网络输入操作通常包括两个不同阶段:

1、等待网络数据到达网卡,把数据从网卡读取到内核缓冲区,准备好数据。

2、从内核缓冲区复制数据到用户进程空间。

网络I/O的本质是对socket的读取,socket在Linux系统中被抽象为流,I/O可以理解为对流的操作。

网络I/O的模型可分为两种:
●异步I/O(asynchronous I/O)
●同步I/O(synchronous I/O)


同步I/O又包括
●阻塞I/O(blocking I/O)
●非阻塞I/O(non-blocking I/O)
●多路复用I/O(multiplexing I/O)
●信号驱动I/O(signal-driven I/O)


强调一下:信号驱动I/O属于同步I/O,原因往后看。


三、五种I/O模型

1、阻塞I/O(blocking I/O)

对于一个套接字上的输入操作,第一步通常涉及等待数据从网络中到达,当所有等待分组到达时,它被复制到内核中的某个缓冲区。第二步是把数据从内核缓冲区复制到应用程序缓冲区。

同步阻塞I/O模型是最常用、最简单的模型。在Linux中,默认情况下,所有套接字都是阻塞的。下面我们以阻塞套接字的recvfrom的调用图来说明阻塞,如图所示


2、非阻塞I/O(non-blocking I/O)

非阻塞的recvform系统调用之后,进程并没有被阻塞,内核马上返回给进程,如果数据还没准备好,此时会返回一个error(EAGAIN或EWOULDBLOCK)。
进程在返回之后,可以先处理其他的业务逻辑,稍后再发起recvform系统调用。采用轮询的方式检查内核数据,直到数据准备好。再拷贝数据到进程,进行数据处理。

在Linux下,可以通过设置套接字选项使其变为非阻塞。非阻塞的套接字的recvfrom操作如图所示


可以看到前三次调用recvfrom请求时,并没有数据返回,内核返回errno(EWOULDBLOCK),并不会阻塞进程。当第四次调用recvfrom时,数据已经准备好了,于是将它从内核空间拷贝到程序空间,处理数据。

在非阻塞状态下,I/O执行的等待阶段并不是完全阻塞的,但是第二个阶段依然处于一个阻塞状态(调用者将数据从内核拷贝到用户空间,这个阶段阻塞)。

3、多路复用I/O(multiplexing I/O)

I/O多路复用的好处在于单个进程就可以同时处理多个网络连接的I/O。它的基本原理是不再由应用程序自己监视连接,而由内核替应用程序监视文件描述符。

以select函数为例,当用户进程调用了select,那么整个进程会被阻塞,而同时,kernel会“监视”所有select负责的socket,当任何一个socket中的数据准备好,select就会返回。


这个时候用户进程再调用read操作,将数据从内核拷贝到用户进程,如下图所示。

4、信号驱动I/O(signal-driven I/O)

该模型允许socket进行信号驱动I/O,并注册一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据,如图所示

注意:虽然信号驱动IO在注册完信号处理函数以后,就可以做其他事情了。但是第二阶段拷贝数据的过程当中进程依然是被阻塞的,而后要介绍的异步IO是完全不会阻塞进程的,所以信号驱动虽然具有异步的特点,但依然属于同步IO, 原因就是其在从内核中将数据拷贝到用户空间的时候时阻塞的。


5、异步I/O(asynchronous I/O)


相对于同步I/O,异步I/O不是按顺序执行。用户进程进行aio_read系统调用之后,就可以去处理其他逻辑了,无论内核数据是否准备好,都会直接返回给用户进程,不会对进程造成阻塞。这是因为
aio_read只向内核递交申请,并不关心有没有数据。

等到数据准备好了,内核直接复制数据到进程空间,然后内核向进程发送通知,此时数据已经在用户空间了,可以对数据进行处理。

四、五种I/O模型比较


前四种I/O模型都是同步I/O操作,它们的区别在于第一阶段,而第二阶段是一样的:在数据从内核复制到应用缓冲区期间(用户空间),进程阻塞于recvfrom调用。


相反,异步I/O模型在等待数据和接收数据的这两个阶段都是非阻塞的,可以处理其他的逻辑,用户进程将整个I/O操作交由内核完成,内核完成后会发送通知。在此期间,用户进程不需要检查I/O操作的状态,也不需要主动拷贝数据。

总结一下:其实只要是涉及到用户进程到内核空间进行数据拷贝这一个动作的都属于是同步IO, 像aio_read这样的系统调用连数据的拷贝都是内核帮我们完成的, 这种才是真正意义上的异步。
好了, 分享到此结束了, 希望对需要的人有启发和帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ElasticSearch启动报错:Exception in thread “main“ SettingsException

Exception in thread "main" SettingsException[Failed to load settings from [elasticsearch.yml]]; nested: ParsingException[Failed to parse object: expecting token of type [START_OBJECT] but found [VALUE_STRING]]; 这个报错说明elasticsearch.yml这个配…

Java虚拟机运行原理

在 Java 中新建一个类Test: class Test {int a; }在Main方法中创建两个 Test 对象,并给 a 赋不同的值。 写一个 exchange 方法,在方法中交换两个Test 对象,最后输出两个对象中 a 的值。 public class Main {public static void…

OpenCV4.9的是如何进行图像操作

返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV4.9矩阵上的掩码操作 下一篇:使用 OpenCV 添加(混合)两个图像 输入/输出 C 图像 从文件加载图像 Mat img imread(filename); 如…

NVIDIA 宣布推出适用于人形机器人的 GR00T 项目基础模型和主要 Isaac 机器人平台更新

NVIDIA 宣布推出适用于人形机器人的 GR00T 项目基础模型和主要 Isaac 机器人平台更新 Isaac 机器人平台现为开发人员提供新的机器人训练模拟器、Jetson Thor 机器人计算机、生成式 AI 基础模型以及 CUDA 加速感知和操作库 GTC — NVIDIA 今天宣布推出 GR00T 项目,这…

【数据分享】1929-2023年全球站点的逐月平均露点(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、能见度等指标,说到气象数据,最详细的气象数据是具体到气象监测站点的数据! 有关气象指标的监测站点数据,之前我们分享过1929-2023年全球气象站…

为什么有些网站会提示不安全,提示您与此网站之间建立的连接不安全

有时候当我们尝试访问一个网站时,浏览器会弹出一个警告,提示“您与此网站之间建立的连接不安全”。这是什么意思?这种网站真的不安全吗? 理解HTTP与HTTPS HTTP(超文本传输协议)是互联网上用于传输数据的基…

利用sin/cos原理驱动步进电机

利用sin/cos原理控制步进电机转动 前言什么是步进电机驱动器细分控制电机内部结构图片步进电机驱动原理(重要)步进电机参数1、步距角:收到一个脉冲转动的角度2、细分数 :1/&#xf…

qrcode插件-生成二维码

安装 yarn add qrcodejs2 --save npm install qrcodejs2 --save 使用 <template><div><div id"qrcodeImg"></div><!-- 创建一个div&#xff0c;并设置id --></div> </template> <script> import QRCode from q…

【超图 SuperMap3D】【基础API使用示例】52、超图SuperMap3D - 绘制点|线|多边形面的缓冲区

前言 引擎下载地址&#xff1a;[添加链接描述](http://support.supermap.com.cn/DownloadCenter/DownloadPage.aspx?id2524) 绘制缓冲区主要依赖[turfjs](https://turfjs.org/docs/#buffer) 先根据点线面的数据turfjs计算得到缓冲区的坐标数据&#xff0c;再行绘制效果 完整代…

《深入Linux内核架构》第3章 内存管理(3)

目录 3.3 页表 3.3.1 数据结构 3.3.2 特定于PTE的信息 3.3.3 页表项的创建和操作 3.3 页表 页表作用&#xff1a; 将虚拟地址转换为物理地址。 内核总是使用四级页表。所以如果体系架构只支持两级页表&#xff0c;则需模拟第三和第四级页表。 四级页表&#xff1a; PGD&am…

pycharm连接服务器运行时找不到文件或目录

选择你要修改的python interpreter 进入下图界面&#xff0c;默认选择的是Deployment configuration,需要将其改成SSH。 再将上图python interpreter path和pycharm helpers path 配置成服务器上相应地址即可。 over

【Java项目】基于jspssm的高校二手交易平台

目录 背景 技术简介 系统简介 界面预览 背景 随着互联网技术的不断进步&#xff0c;高校二手交易市场通过网络平台得到了显著的扩展。开发这一平台时&#xff0c;首要任务是深入挖掘并满足用户的实际需求&#xff0c;通过精准把握用户需求来构建一个专门化的高校二手交易系…

基于Django(python+sql)的校园二手交易系统设计与实现(完整程序+开题报告+论文)

随着互联网的迅猛发展&#xff0c;校园内的二手交易市场也逐渐呈现出蓬勃的发展态势。学生们在校园生活中会产生大量的闲置物品&#xff0c;而其他学生也有可能需要这些物品。本论文研究了校园二手交易系统的需求分析、系统实现和测试三个部分&#xff0c;旨在提高校园二手交易…

10.测试教程-性能测试loadrunner1

文章目录 1.LoadRunner的安装2.Loadrunner的基本概念3.开发测试脚本3.1录制基本的用户脚本3.2插入事务3.3插入集合点3.4参数化输入3.5插入函数3.6插入检查点3.7运行时设置3.8单机运行测试脚本 4.玩转三个测试工具4.1Virtual User Generator(此处讲解和3.1是一致的)4.2Controlle…

简单破除github的2FA验证

简单破除github的2FA验证 文章目录 简单破除github的2FA验证&#x1f468;‍&#x1f3eb;Authenticator工具 &#x1f468;‍&#x1f3eb;Authenticator工具 最近使用github的时候发现要搞一个2FA的验证才可以 验证的途径有两种&#xff1a;一种是用手机电话验证&#xff0c;…

Java基于微信小程序的校园请假系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#…

HTML作业2

作业1: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>table…

金三银四面试题(四):Full GC 和 Minor GC

如何触发Full GC&#xff1f;这是面试中的高频题。同样了解Full GC和Minor GC对于理解Java应用程序的性能和内存管理非常重要。 区分 GC 在此之前&#xff0c;我们要搞清楚&#xff0c;什么是Full GC&#xff0c;什么是Minor GC&#xff1f; Minor GC Minor GC是Java虚拟机…

Unity构建详解(3)——SBP的依赖计算

【前置知识】 先要搞清楚Asset和Object的关系&#xff0c;可以简单理解为一个Asset对应多个Object。 unity自定义的Asset也要有一个存储的标准&#xff0c;其采用的是YAML&#xff0c;我们看到的所有Unity自定义的Asset格式&#xff0c;例如.prefab&#xff08;预制体&#x…

基于SSM框架的酒店预订系统

基于SSM框架的酒店预订系统的设计与实现 摘要 当今世界的互联网信息技术飞速发展&#xff0c;网络化的工作模式已经几乎覆盖到各个工作领域中的业务内&#xff0c;人们的日常生活也渐渐离不开互联网。因此&#xff0c;在当下全国各处的酒店都开始构建起了自己的网络预订系统。…