同步IO、异步IO、阻塞IO、非阻塞IO、复用IO

2023-11-07

参考:同步IO 异步IO
作者:今天天气眞好
发布时间: 2021-04-19 09:42:29
网址:https://blog.csdn.net/qq_51118175/article/details/115857196?spm=1001.2014.3001.5501

同步IO与异步IO的区别?

答:如果是同步IO,当执行IO操作时,应用程序必须等待,直到该IO操作完成。而异步IO操作在后台运行,可以与应用程序同时运行,提高系统性能,提高IO流量。

解读:在同步IO文件中,线程启动一个IO操作然后立即进入等待状态,直到IO操作完成才醒来继续执行。而异步IO文件中,线程发送一个IO请求到内核,然后继续处理其他事情,内核完成IO请求后,就会通知线程IO操作完成了。

1.POSIX

同步IO、异步IO、阻塞IO、非阻塞IO,这几个词常见于各种各样的与网络相关的文章之中,往往不同上下文中它们的意思是不一样的

POSIX(可移植操作系统接口)把同步IO操作定义为导致进程阻塞直到IO完成的操作,反之则是异步IO

按POSIX的描述似乎把同步和阻塞划等号异步和非阻塞划等号,但是为什么有的人说同步IO不等于阻塞IO呢?先来说说几种常见的IO模型吧。

2.IO模型

这里统一使用Linux下的系统调用recv作为例子,它用于从套接字上接收一个消息,因为是一个系统调用,所以调用时会从用户进程空间切换到内核空间运行一段时间再切换回来。默认情况下recv会等到网络数据到达并且复制到用户进程空间或者发生错误时返回,而第4个参数flags可以让它马上返回。

阻塞IO模型

使用recv的默认参数一直等数据直到拷贝到用户空间,这段时间内进程始终阻塞。A同学用杯子装水,打开水龙头装满水然后离开。这一过程就可以看成是使用了阻塞IO模型,因为如果水龙头没有水,他也要等到有水并装满杯子才能离开去做别的事情。很显然,这种IO模型是同步的。

非阻塞IO模型

改变flags,让recv不管有没有获取到数据都返回,如果没有数据那么一段时间后再调用recv看看,如此循环。B同学也用杯子装水,打开水龙头后发现没有水,它离开了,过一会他又拿着杯子来看看……在中间离开的这些时间里,B同学离开了装水现场(回到用户进程空间),可以做他自己的事情。这就是非阻塞IO模型。但是它只有是检查无数据的时候是非阻塞的,在数据到达的时候依然要等待复制数据到用户空间(等着水将水杯装满),因此它还是同步IO。
在这里插入图片描述

IO复用模型

这里在调用recv前先调用select或者poll,这2个系统调用都可以在内核准备好数据(网络数据到达内核)时告知用户进程,这个时候再调用recv一定是有数据的。因此这一过程中它是阻塞于select或poll,而没有阻塞于recv,有人将非阻塞IO定义成在读写操作时没有阻塞于系统调用的IO操作(不包括数据从内核复制到用户空间时的阻塞,因为这相对于网络IO来说确实很短暂),如果按这样理解,这种IO模型也能称之为非阻塞IO模型,但是按POSIX来看,它也是同步IO,那么也和楼上一样称之为同步非阻塞IO吧。

这种IO模型比较特别,分个段。因为它能同时监听多个文件描述符(fd)。这个时候C同学来装水,发现有一排水龙头,舍管阿姨告诉他这些水龙头都还没有水,等有水了告诉他。于是等啊等(select调用中),过了一会阿姨告诉他有水了,但不知道是哪个水龙头有水,自己看吧。于是C同学一个个打开,往杯子里装水(recv)。这里再顺便说说鼎鼎大名的epoll(高性能的代名词啊),epoll也属于IO复用模型,主要区别在于舍管阿姨会告诉C同学哪几个水龙头有水了,不需要一个个打开看(当然还有其它区别)。

信号驱动IO模型

通过调用sigaction注册信号函数,等内核数据准备好的时候系统中断当前程序,执行信号函数(在这里面调用recv)。D同学让舍管阿姨等有水的时候通知他(注册信号函数),没多久D同学得知有水了,跑去装水。是不是很像异步IO?很遗憾,它还是同步IO(省不了装水的时间啊)。

异步IO模型

调用aio_read,让内核等数据准备好,并且复制到用户进程空间后执行事先指定好的函数。E同学让舍管阿姨将杯子装满水后通知他。整个过程E同学都可以做别的事情(没有recv),这才是真正的异步IO。

在这里插入图片描述

五种IO模型比较

在这里插入图片描述

总结:
IO分两阶段:

1.数据准备阶段
2.内核空间复制回用户进程缓冲区阶段

一般来讲:阻塞IO模型、非阻塞IO模型、IO复用模型(select/poll/epoll)、信号驱动IO模型都属于同步IO,因为阶段2是阻塞的(尽管时间很短)。只有异步IO模型是符合POSIX异步IO操作含义的,不管在阶段1还是阶段2都可以干别的事。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

同步IO、异步IO、阻塞IO、非阻塞IO、复用IO 的相关文章

  • 如何将 javax.xml.transform.Source 转换为 InputStream?

    我怎样才能转换javax xml transform Source进入输入流 实施Source is javax xml transform dom DOMSource Source inputSource messageContext g
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d
  • 如何从 Rust 中的文件读取结构体?

    有没有办法可以直接从 Rust 文件中读取结构 我的代码是 use std fs File struct Configuration item1 u8 item2 u16 item3 i32 item4 char 8 fn main let
  • Java 中是否有与 StringWriter 等效但内部带有 StringBuilder 的东西?

    我注意到 StringWriter 在内部使用 StringBuffer 但是 如果您不需要同步开销 是否有与 StringWriter 等效的内部使用 StringBuilder 的方法 如果你恰好使用 Apache Commons IO
  • 二进制文件 I/O

    如何用D语言读写二进制文件 在 C 语言中是 FILE fp fopen home peu Desktop bla bin wb char x 4 RIFF fwrite x sizeof char 4 fp 我在 D 找到了 rawWri
  • 将二进制文件读入结构体

    我正在尝试使用 C 读取二进制数据 我拥有有关我想要读取的文件中的数据布局的所有信息 我能够 逐块 读取数据 即将前 40 个字节的数据转换为字符串 然后获取接下来的 40 个字节 由于数据至少有三个略有不同的版本 我想将数据直接读入结构中
  • Hadoop setInputPathFilter错误

    我正在使用 Hadoop 0 20 2 无法更改 并且我想向我的输入路径添加一个过滤器 数据如下 path1 test a1 path1 test a2 path1 train a1 path1 train a2 我只想处理所有文件trai
  • 使用 Node.js 就地流式传输和转换文件

    我想做这样的事情 var fs require fs var through require through var file path to file json var input fs createReadStream file utf
  • 从相对路径读取文件

    我知道这个问题之前已经被问过 1000 次了 我确实尝试了所有解决方案 Java项目中如何从相对路径读取文件 java io File 找不到指定的路径 https stackoverflow com questions 3844307 h
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE
  • 从 createProcess 外部获取的句柄读取

    我正在尝试创建一个进程 并通过我在外部提供的句柄与其进行通信createProcess功能 stdOutH lt openFile logDir gt stdout log ReadWriteMode hSetBuffering stdOu
  • 更新写入 java 文本文件的对象

    将 Java 对象或列表写入文本文件是可以的 但我想知道如何更新或重写以前写入的对象而不再次写入对象 例如 假设有一个 java util List 有一组对象 然后将该列表写入文本文件 然后稍后该文件将被再次读取并从列表中获取所有对象 然
  • 常规文件读取可以从非阻塞 IO 中受益吗?

    对我来说似乎不是 我找到了一个支持我的观点的链接 http www remlab net op nonblock shtml 你怎么认为 您发布的链接内容是正确的 以非阻塞模式打开的常规文件套接字将始终 准备好 读取 当您实际尝试读取它时
  • Erlang:如何将小数转换为填充零的十六进制字符串

    我想在 Erlang 中将 42 基数 10 转换为 000002A 基数 16 我在网上找到了一些提示 io format 8 0B n 42 gt 00000042 And io format 16B n 42 gt 2A 但我似乎无法
  • java中filewriter的flush和close函数之间的区别

    我需要知道Java中的flush和close函数之间的确切区别是什么 当在写入文件期间将数据转储到文件中时 请提供一个例子 flush just确保所有缓冲数据都写入磁盘 在这种情况下 更一般地说 通过您正在使用的任何 IO 通道刷新 之后
  • 为什么 .NET 异步等待文件复制比同步 File.Copy() 调用消耗更多 CPU?

    为什么下面的代码会产生 public static class Program public static void Main params string args var sourceFileName C Users ehoua Desk
  • Haskell 输入返回元组

    我想知道 IO 函数是否可以返回元组 因为我想从这个函数中获取这些元组作为另一个函数的输入 investinput IO gt Char Int investinput do putStrLn Enter Username username
  • 何时使用 Java 中的 Writer 子类;常见做法

    我一直对 Java 中不同 IO 实现的数量感到有点困惑 现在我完全陷入了项目开发 同时我花时间阅读有用的东西 我意识到没有适合新手的比较 除了简短的解释 Writer 类的 API http download oracle com jav
  • 在 Android 上生成 FileDescriptor 而不先打开文件

    在Android中 是否可以直接从字节数组生成FileDescriptor 而不必先打开文件 在 Android 2 2 中 我动态生成 MIDI 文件 然后使用 MediaPlayer 进行播放 我在下面包含了成功执行此操作的 Main
  • phonegap html5 android 同步文件系统 IO

    如何使用 PhoneGaps 文件系统 API 同步读写文件 有可用的同步包装器吗 无法通过提供的 api 同步访问文件 从phonegap的实现方式猜测 我怀疑您是否可以编写一个插件来同步执行此操作

随机推荐

  • 购物商城---freemarker在项目中的应用

    一 1 通过模板 数据 生成静态化页面 2 缺点 数据不实时 3 适用于于数据长时间不更新的情况 二 在项目中搭建freemarker freemarker xml
  • pandas对dataframe内部数据的增删改查操作整理汇总

    文章目录 一 增加数据 1 增加行数据 2 增加列数据 二 删除数据 删除前 后 N 行 三 修改数据 四 查询 索引数据 五 合并Dataframe 1 按行合并 根据行index合并 自定义合并规则 2 按列合并 根据列名称合并 六 拆
  • 【福利】光荣之路公开课视频下载大全

    最新视频 JAVA编程系列 六哥 第七讲 日志 异常和反射 6月6日 http yun baidu com s 1mhA7Sbm Python编程系列 第十五讲 网络编程和pyh应用举例 3月14日 http yun baidu com s
  • Linux解压命令

    Linux解压命令 解压到当前文件下 unzip test zip 3D打印梦想库了解一下
  • 系统稳定性方法论 - 提感知、快响应、做复盘

    之前在 lt 系统稳定性方法论 gt 中提到了稳定性建设的四大抓手 在 lt 降发生 gt 之后 今天来说一说其余的三点 提感知 快响应 做复盘 提感知 何为 提感知 提感知指的是 对于已经出现问题 能够及时且精准的进行告警 提升对异常的感
  • 关于scrapy爬虫的注意事项

    1 图片下载的设置 class ClawernameSpider scrapy Spider 定制化设置 custom settings LOG LEVEL DEBUG Log等级 默认是最低级别debug ROBOTSTXT OBEY F
  • XMPP客户端库Smack 4.1.4版官方开发文档之六

    一 处理出入的字节 smacke 类库 提供了处理传入的字节 主要依靠两个类 org jivesoftware smack PacketCollector 和 org jivesoftware smack PacketListener or
  • lpad用法 oracle,oracle中lpad函数的用法详解

    oracle中lpad函数的用法详解 oracle中lpad的用法 pad翻译 填充 lpad函数 在字符串的左侧添加指定字符串 用法 www jb51 net lpad String 截取长度 添加的字符串 说是添加字符串也不准确 比较准
  • DCMTK读取dcm图片+opencv显示图片

    读取DCM格式图片中的一些基本信息 DcmFileFormat是最基本的文件对象 OFCondition是每一次操作的返回值 用来判断操作是否成功 所有的数据都存在DcmDataSet对象中 用getDataSet方法得到 void Loa
  • webpack(4版本)使用

    webpack简介 webpack 是一种前端资源构建工具 一个静态模块打包器 module bundler 在 webpack 看来 前 端的所有资源文件 js json css img less 都会作为模块处理 它将根据模块的依赖关系
  • 利用神经网络实现股票预测

    神经网络 NeuralNetworks 是一种用训练数据拟合目标函数的黑箱模型 只要数据量足够大 它可以拟合出输入到输出之间的任意函数关系 本篇教程我们将使用神经网络进行股市的预测 利用数据样本学习 得到相关因素预测股票走势 01 问题描述
  • 区块链+跨境支付有哪些优势?

    全球互联网的高速发展也带动了跨境电商的快速发展 跨境支付也瞬间成为第三方支付领域的一个风口 而将区块链技术应用在跨境支付领域也逐渐成为市场的热点需求 传统的跨境支付方式中间环节繁杂 费时又费力 而且跨境电商卖家在跨境支付环节 存在境外银行账
  • ModuleNotFoundError: No module named ‘fused_layer_norm_cuda‘

    No module named fused layer norm cuda Issue 161 NVIDIA apex GitHub 按照以下方式安装 可解决问题 apex 安装步骤 1 git clone https github com
  • android和iOS平台的崩溃捕获和收集

    通过崩溃捕获和收集 可以收集到已发布应用 游戏 的异常 以便开发人员发现和修改bug 对于提高软件质量有着极大的帮助 本文介绍了iOS和android平台下崩溃捕获和收集的原理及步骤 不过如果是个人开发应用或者没有特殊限制的话 就不用往下看
  • pycharm preparing workspace 项目打不开怎么办?

    屏幕一直显示 preparing workspace 无法打开项目时 找出保存最近项目信息的xml文件 Library Preferences Pycharm2019 2 options recentProjectsDirectories
  • Unity3D下如何采集camera场景数据并推送RTMP服务?

    Unity3D使用场景 Unity3D是非常流行的游戏开发引擎 可以创建各种类型的3D和2D游戏或其他互动应用程序 常见使用场景如下 游戏开发 Unity3D是一个广泛用于游戏开发的环境 适用于创建各种类型的游戏 包括动作游戏 角色扮演游戏
  • vue2.0+ 使用v-model 及报错解决办法;

    div div
  • 【WSL】使用WSL在Windows上安装Linux(Ubuntu20.04)

    文章目录 WSL 使用WSL在Windows上安装Linux Ubuntu20 04 一 环境说明 二 开启WSL功能 三 安装Linux子系统 四 升级内核 五 安装完成 六 Windows家庭版Hyper V功能开启 WSL 使用WSL
  • 通过SQL 语句删除重复记录并且只保留一条记录

    这里写自定义目录标题 1 重复字段 2 查询全部重复的数据 3 删除全部重复试题 4 查询表中多余重复试题 根据 depno 来判断 除了 rowid 最小的一个 4 1 第一种方法 4 2 第二种方法 4 3 第三种方法 5 删除表中多余
  • 同步IO、异步IO、阻塞IO、非阻塞IO、复用IO

    参考 同步IO 异步IO 作者 今天天气眞好 发布时间 2021 04 19 09 42 29 网址 https blog csdn net qq 51118175 article details 115857196 spm 1001 20