关于同步IO与阻塞IO的误解

解析linux同步与异步、阻塞与非阻塞概念以及五种IO模型 I/O复用模型会用到select、poll、epoll函数,这几个函数也会使进程阻塞,但是和阻塞I/O所不同的的,这两个函数可以同时阻塞多个I/O操作。而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O操作函数。这样我们的I/O操作函数将不断的测试数据是否已经准备好,如果没有准备好,继续测试,直到数据准备好为止。阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行)。 阅读详情

        我们知道,同步IO是指线程在发起一笔IO调用之后,仅当该调用所请求的数据成功到达指定的内存区域之后,才会继续发起下一笔IO调用。而异步IO是指线程在发起一笔IO调用之后不等数据返回就又发送一笔或者多笔IO调用。至于这两者的执行过程和性能差异,冬瓜哥不做过多描述。

        默认方式下,线程发起IO调用之后,后续执行过程便陷入OS内核态,内核会将该线程的状态改为“Suspend”,也就是挂起(阻塞)该线程,在IO数据返回之前,该线程的用户态部分将不会被执行,直到内核返回数据之后,内核将该线程改为“Ready”,以便后续继续调度执行。这种方式就被称为阻塞IO,其一定是同步IO。

        如果线程发起IO调用时给出了async参数,向内核声明采用异步的方式,那么当IO请求下发到内核之后,内核并不会将该线程置为挂起状态,该线程可以继续执行,而此时,该线程可以选择继续下发多笔IO,也可以选择不下发IO而做其他事情。此时,该线程并未处于阻塞状态,所以这种IO调用方式就不是阻塞IO,而属于异步IO调用。即便如此,如果该线程选择在上一笔IO数据返回之后再发起下一笔IO,那么其对外表现依然是同步IO的方式,只不过是主观故意的;而在阻塞IO调用模式下,线程只能发出一笔IO然后被内核强制挂起,此时该线程不管是主观上想批量下发多笔IO还是一去一回的同步IO方式,其对外表现只能是同步IO。

        所以,阻塞IO一定是同步IO,非阻塞IO(调用时给出async参数)可以是异步IO也可以是同步IO,取决于线程自身的逻辑。至于非阻塞IO调用时给出的参数叫做“async”,其实叫做“suspended”更好。        

        相关阅读:

《【冬瓜哥手绘】关于IO时延你被骗了多久?》

《【冬瓜哥手绘】并发IO—系统性能的根本!》

《如何测得IO路径上的等效并发度? 》




网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO 立即下载

相关推荐

SAP采购订单中项目类别B(限制)的控制逻辑

在笔者所在企业中,框架类采购订单中项目类别需要选择B(限制)。今天笔者从比较全面的角度分析了一下这个项目类别B到底可以决定些什么?控制到什么?先从后台SPRO中打开相应的配置菜单。 打开项目类别B之后,可以看到一些配置信息,这里有一点与其它配置不同的地方,即无法新增项目,也无法修改现有项目。这个疑惑今后再去解决吧。当前只研究项目类别B的控制逻辑。 下面就参考上图中的配置分段来分析和测试其控制逻辑, 1、如项目类别配置图,所需材料值为不允许;经测试,如下图在采购订单创建时,不能输入物料编号条目。

专注SAP应用技术文章写作,致力于拉近用户与系统间的距离; 6032

I/O中同步、异步、阻塞、非阻塞的关系梳理

同步、异步、阻塞、非阻塞 主要对于I/O中同步、异步、阻塞与非阻塞之间关系的梳理。因为他们之间的关系自我感觉太过于模糊,所以需要梳理以下。以下仅为个人的理解。 同步与异步 同步指:一个任务B依赖于任务A,只有等待任务A执行完成通知任务B之后,任务B才能继续进行进行;是可靠的。 异步指:一个任务B依赖于任务A,但是任务B不需要等待任务A执行完成就可以继续执行,置于任务A是否执行完成它(B)并不关心。 同步/异步体现的是一种消息通知机制,一个任务依赖另一个任务,同步需要等待被依赖任务完成并返回通知;而异步情

wuraox的博客 178

踩坑记录:Clawdbot 对接 Minimax 报错 “401 token is unusable (1004)“ 的终极解决方案

如果你也在配置 Clawdbot 对接 Minimax 模型时,明明 API Key 是新申请的,却死活报错 `401 Unauthorized`,错误码 `1004`,提示 `token is unusable`——那么恭喜你,来对地方了。

hampeter的博客 2000

【IO基础知识】同步、异步、阻塞、非阻塞分析

上面的四个关键字虽然都与IO有关,但具体是由两组信息构成的。阻塞/非阻塞的概念主要与调用方式有关,主要为:指在调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能够执行其他业务。指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回,但想要得到这些结果需要不停地进行询问。虽然表面上看非阻塞的方式可以明显的提高CPU的利用率,但是也带了另外一种后果就是系统的线程切换增加。增加的CPU执行时间能不能补偿系统的切换成本需要好好评估。同步/异步的概念主要与消息的通知机制有关,主要为:一个任务的完成

singularity0001的博客 814

CH341的I2C流模式(StreamI2C)到底怎么用?从EEPROM读写到自定义设备,一篇讲清参数配置逻辑

本文详细解析了CH341的I2C流模式(StreamI2C)的使用方法,从EEPROM读写到自定义设备的参数配置逻辑。通过深入分析I2C协议基础、StreamI2C参数映射关系及典型设备配置示例,帮助开发者快速掌握StreamI2C的应用技巧,解决实际开发中的常见问题。

weixin_30932215的博客 446

还在用 RaiDrive/Rclone 挂载网盘?教您使用Windows 原生 WebDAV 丝滑直连 AList/Openlist,让你的网盘秒变本地硬盘!

网盘文件分散管理?😩 别再依赖第三方工具了!本文教你如何在 Windows 下,利用原生 WebDAV 功能,将 Openlist 网盘直接映射为本地硬盘!💻 操作简单,告别繁琐,让你的云端文件像本地文件一样丝滑!🚀 轻松实现高效管理,快来体验吧!

XiaoqiangClub的博客 2972

同步IO(阻塞IO、非阻塞IO), 异步IO的理解

用户进程发起请求从内核中获取数据那么这时候有两种情况: 操作系统还没有准备后数据,那么这时候怎么办,有两种方法:         a. 让用于进程等着(这种情况就是阻塞)         b. 如果没有数据就返回一个ERROR,不需要用户进程干等(这种情况就是非阻塞) 过了一会儿操作系统准备好数据了,这时候又有两种方法:         a. 啥也不管,等着用户进程再次来请求才把数据给它(这种情况就是同步)         b. 负责到底,数据准备好,直接给到用户进程,并且还发出一个信号,告诉用户

weixin_44306626的博客 2796

QGis二次开发 —— 1.1、ubuntu24.04下搭建QGis3.40.12二次开发环境(附:全部问题解决方法)

QGis二次开发 —— 1.1、ubuntu24.02下搭建QGis3.40.12二次开发环境(附:全部问题解决方法)

250

IO模式和IO多路复用

  网络编程里常听到阻塞IO、非阻塞IO、同步IO、异步IO等概念,总听别人装13不如自己下来钻研一下。不过,搞清楚这些概念之前,还得先回顾一些基础的概念。 1 基础知识回顾 注意:咱们下面说的都是Linux环境下,跟Windows不一样哈~~~ 1.1 用户空间和内核空间   现在操作系统都采用虚拟寻址,处理器先产生一个虚拟地址,通过地址翻译成物理地址(内存的地址),再通过总线的传递,最...

weixin_30733003的博客 322

手把手教你用 Cursor 写一个完整的 Web 应用(含前后端 + 部署)

本文介绍如何利用Cursor AI工具从零开发一个完整的全栈待办事项Web应用。文章针对开发者常见痛点——无法独立完成项目闭环,提供了一套AI驱动的全栈开发范式。通过Vue3+Node.js+MySQL技术栈,全程由Cursor自动生成项目架构、前后端代码、数据库设计,并解决联调、部署等关键问题。重点展示了如何用AI完成:项目规划与架构设计、后端接口开发、前端页面实现、跨域联调、打包优化及云端部署全流程。该方法将传统需要3-5天的开发工作压缩至1小时内完成,产出规范可上线的项目,特别适合想突破"碎

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 633

在SAP系统中,公司间关联交易(Intercompany Transactions)或内部往来主要有三种经典的实现模式。这些模式的选择取决于企业的业务复杂度、自动化需求以及对实时性的要求

SAP系统中公司间关联交易的三种实现模式分析:1)手工记账模式(FB60/FB70)适用于低频交易,灵活性高但易出错;2)SD/MM跨公司销售采购模式(VA01/VF01/ME21N)适用于真实业务流转,业务财务集成度高;3)自动清算模式(F.13/ICR)适合高频交易集团企业,支持实时自动对账。关键成功要素包括正确配置贸易伙伴字段、统驭科目及专用凭证类型。建议根据企业规模、业务复杂度及自动化需求选择合适模式,其中大型集团优先考虑自动对账方案以确保合并报表准确性。

金牌架构师 551

IO实现方式(同步阻塞、同步非阻塞、IO多路复用)

同步阻塞io在数据在数据拷贝到两个阶段都是阻塞的,即把socket的数据拷贝到内核缓冲区和把内核缓冲区的数据拷贝到用户态到应用程序缓冲区都是阻塞的。用户线程在这个期间不能处理其他任务。优点:简单易用缺点:为每一次io请求都要分配一个线程,如果获取不到数据会一直阻塞。

weixin_43993064的博客 1722

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

同步/异步,阻塞/非阻塞概念深度解析

‍‍原文:https://blog.youkuaiyun.com/lengxiao1993/article/78154467更新:极客重生网络IO作为网络编程核心基础知识,是所以程序员都需要理解掌握的,最近小伙伴在星球群里对这些基本概念理解比较混乱,大多数人可能都没有认真深入去理解过这些基础概念,之前我直播时候说过:内功深厚其实就是对这些基础概念的理解深度,我们学习和工作都是在不断加...

极客重生 3330

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

什么是阻塞/非阻塞和同步/异步

作者:萧萧 链接:https://www.zhihu.com/question/19732473/answer/241673170 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 IO 概念区分四个相关概念:同步(Synchronous)异步( Asynchronous)阻塞( Blocking )非阻塞( Nonblocking)这四个概念的含义以及相互之间的区别与联系,并不如很多网络博客所写的那么简单, 通过举一些什么商店购物, 买书买报的例子就能讲清楚。进程间通信的同

Woosual的博客 903

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

IO流的认识(2)

• 处理流(包装流):嵌套在节点流/其他处理流之上,扩展功能(如缓冲、压缩、序列化、编码转换),是“管道的增强器”(如Java的BufferedInputStream、ObjectOutputStream);数据按“先进先出”顺序传输,无法随机跳读/跳写(除非流支持随机访问,如Java的RandomAccessFile,但这是特殊实现,非标准流特性)——流的传输是“单向线性”的,如同水流过水管,只能按顺序通过。→ 核心差异:线程是否参与IO等待,以及等待的方式(阻塞挂起、轮询检查、异步通知)。

2401_89015270的博客 719

linux 同步IO: sync、fsync, O_SYNC

sync和fsync baidu一下,有大量文章说明其作用。 下面举一个来自csdn的blog文章: http://blog.youkuaiyun.com/cywosp/article/details/8767327 其中说明如下: sync函数只是将所有修改过的块缓冲区排入写队列,然后就返回,它并不等待实际写磁盘操作结束。 fsync函数只对由文件描述符filedes指定的单一文件起作

Fybon的专栏 3248

oracle方案是什么意思,oracle方案是什么?

简述linux同步与异步、阻塞与非阻塞概念以及五种IO模型1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...为什么Java中字符串是不可变的前言 在Java中,字符串是一个不可变的类,一个不可变的类指的是它的实例对象不能被修改,所有关于这个对...

weixin_33099015的博客 248

NIO-select和epull

待补充

wangxinlin44的博客 1443

为什么数据库和数据库连接池不采用类似java nio的IO多路复用技术使用一个连接来维护和数据库的数据交换?

传统的阻塞IO为了提高效率,需要创建一定数量的连接形成连接池,而nio仅需要一个连接即可(大部分情况下一个连接即可)。但是一般我们在使用DB时,还是经常性采用c3p0,tomcat connection pool等技术来与DB连接,哪怕整个程序已经变成以Netty为核心。至于这些事件的处理方式,到底是业务代码循环着处理、丢到队列里,还是交给线程池处理,由业务代码决定。对于使用DB的程序来讲,不管使用多路复用,还是连接池,都要维护一组网络连接,支持并发的查询。在网络服务中,IO多路复用起的作用是。

harmful_sheep的博客 533

tornado小总结

tornado框架 tornado的误解 tornado 只需要将耗时的操作放在线程池中就可以达到高并发------很多库是同步 tornado tornado 中使用了大量的同步io -----使用大量的同步代码 只要使用tornado 就是高并发 事件循环 tornado 中的多线程和协诚的单线程是不是冲突- ---- 不冲突 同步可以调用阻塞 和非阻塞的 阻塞,非阻塞是线程停止 同步和异步关注的是获取结果的方式,同步是获取到结果之后才进行下一步操作,阻塞非阻塞关注的是接口时当前线程的状态,同步可以

qq_41248532的博客 155

Python异步编程从入门到不懵:asyncio实战踩坑指南

异步函数里所有IO操作都要用异步版本,别用同步的调用异步函数必须加await,或者包装成task共享变量修改要加锁异常要捕获,别让整个程序崩溃我一开始学的时候觉得这玩意儿太绕了,写多了之后发现其实比多线程多进程简单多了,没有那么多锁和进程间通信的问题。现在我写IO密集型的项目首先想到的就是asyncio,效率提升真的很明显。如果你也经常写爬虫、API服务、定时任务这类IO密集型的代码,真的推荐你好好学一下asyncio,绝对不亏。

CHNIM的博客 280

并发与并行、同步与异步、阻塞与非阻塞以及Linux五种IO模型

1. 进程线程状态转换图 1.1 进程状态转换图 1.1.1未引入挂起操作的进程状态转换图 1.1.1.1 未引入挂起操作进程状态转换图:三态模型   在多道程序系统中,进程在处理器上交替运行,状态也不断地发生变化。进程一般有3种基本状态:运行、就绪和阻塞。   (1) 运行:当一个进程在处理机上运行时,则称该进程处于运行状态。处于此状态的进程的数目小于等于处理器的数目,对于单处理机系统,处于运行...

Chasing__Dreams的博客 972

【Linux kernel】Linux中同步与异步、阻塞与非阻塞概念以及五种IO模型

相信很多从事linux后台开发工作的都接触过同步&异步、阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞、异步就是非阻塞,下面我们先剖析下这几个概念分别是什么含义。

weixin_41028159的博客 1080

recvfrom不阻塞_一文带你区分阻塞、非阻塞、同步、异步IO

前言:在之前的Redis面试套路拆解的文章[Redis面试套路拆解(一)]中有提到过IO模型,并且IO模型本身也是一个比较容易混淆的高频面试考点,小黑板将在本篇文章帮你理清思路,区分各种IO模型~其实网络上已经有很多博客讲了这个问题,但是总是觉得看完之后还是迷迷糊糊的,感觉大家有点太执着于把这个问题讲的通俗易懂了,经常会举各种各样的例子,比如烧水、去银行办理业务之类的,然而看完之后反倒会产生更多的...

weixin_31100705的博客 1570
上一篇: 评宏杉科技的CloudSAN架构
下一篇: 关于SSD HMB与CMB
大话存储
博客等级 码龄9年 568粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值