深入理解同步/异步与阻塞/非阻塞区别
haoteby 2025-05-26 15:52 6 浏览
编者按:高可用架构分享及传播在架构领域具有典型意义的文章,本文由「那谁」投稿。转载请注明来自高可用架构公众号「ArchNotes」。
「那谁」,codedump.info 博主,多年从事互联网服务器后台开发工作。
几年前曾写过一篇描写同步/异步以及阻塞/非阻塞的文章,最近再回头看,还存在一些理解和认知误区,于是重新整理一下相关的概念,希望对网络编程的同行能有所启发。
同步与异步
首先来解释同步和异步的概念,这两个概念与消息的通知机制有关。
举个例子,比如一个用户去银行办理业务,他可以自己去排队办理,也可以叫人代办,办完之后再告知用户结果。对于要办理这个银行业务的人而言,自己去办理是同步方式,而别人代办完毕再告知则是异步方式。
两者的区别在于,同步的方式下,操作者主动完成了这件事情;而异步方式下,调用指令发出后,操作马上就返回了,操作者并不能马上知道结果,而是等待所调用的异步过程(在这个例子中是帮忙代办的人)处理完毕之后,再通过通知手段(在代码中通常是回调函数)来告诉操作者结果。
在上图的异步 IO 模型中,应用程序调用完 aio_read 之后,不论是否有数据可读,这个操作都会马上返回,这个过程相当于这个例子中委托另一个人去帮忙代办银行业务的过程,当数据读完拷贝到用户内存之后,会发一个信号通知原进程告诉读数据操作已经完成(而不仅仅是有数据可读)。
阻塞与非阻塞
接着解释阻塞与非阻塞的概念。这两个概念与程序处理事务时的状态有关。
同样用前面的例子,当真正执行办理业务的人去办理银行业务时,前面可能已经有人排队等候。如果这个人一直从排队到办理完毕,中间都没有做过其他的事情,那么这个过程就是阻塞的,这个人当前只在做这么一件事情。
在上图中,应用程序发起 recvfrom 操作之后,要等待数据拷贝成功才能返回。整个过程中,不能做其它的操作,这个就是典型的阻塞 IO。
反之,如果这个人发现前面排队的人不少,于是选择了出去逛逛,过了一会再回来看看有没有轮到他的号被叫到,如果没有又继续出去逛,过一阵再回来看看……如此以往,这个过程就是非阻塞的。因为处理这个事情的人,在这整个过程中,并没有做到除了这件事之外不做别的事情,他的做法是反复的过来检测,如果还没有完成就下一次再次尝试完成这件事情。
上图与前面阻塞 IO 图的区别在于,当没有数据可读时,同样的 recvfrom 操作返回了错误码,表示当前没有可读数据。换言之,即使没有数据也不会一直让这个应用阻塞在这个调用上,这就是非阻塞 IO。
到了这里,可以先简单的小结一下这两组概念
阻塞与非阻塞:区别在于完成一件事情时,当事情还没有完成时,处理这件事情的人除此之外不能再做别的事情;
同步与异步:是自己去做这件事情,还是等别人做好了来通知有结果,然后再自己去拿结果。注意这里说的是拿结果,如果只是别人告诉你可以做某事,然后自己去操作,这种情况下也是同步的操作,在后面多路复用I/O中会进行阐述。
可见,两组概念不是一个维度的概念。我们把需要办理银行业务的人称为 A,把代办理的人称为 B,那么在 A 委托 B 办理业务的情况下,假设 A 在交代 B 帮忙办事之后,A 就去做别的事情,那么 A 并不存在针对办理银行业务这件事情而言是阻塞还是非阻塞,办理事务时阻塞与否,是针对真正需要办理这件事情的人,也就是这个例子里的 B。
与多路复用 I/O 的联系
前几年写这篇文章时,将多路复用 I/O 类的 select/poll 等和异步操作混为一谈,在这里特别做一些补充说明。
在以前笔者包括不少同行的理解中,就这个例子而言,列举下面情况,当去办理业务的人,需要排队时通常都会先去取号,拿到一个纸条的号码,然后等待银行叫号。在那个例子里面,曾经将银行叫号理解成 select 操作,把纸条比作向 select 注册的回调函数,一旦可以进行操作的条件满足,就会根据这个回调函数来通知办理人,然后办理人再去完成工作,因此 select 等多路复用操作是异步的行为。
但上面这种理解最大的错误在于,同步与异步的区别在于是不是要求办理者自己来完成,所有需要自己完成的操作都是同步操作,不管是注册了一个回调(这里的叫号小纸条)等待回调你,还是自己一直阻塞等待。
在上例中,虽然对需要办理业务的人而言,通过叫号小纸条,他可以等待银行的办理通知。等待的同时可以去别的事情,比如浏览手机上网,但只要可以办理该业务的条件满足,真正叫到号可以办理业务时,办理者是需要自己去完成办理的。
换言之,在完成一件事情时,需要区分处理两种状态:一是这个事情是不是可以做了(条件满足的消息,如 select 告诉你某个文件描述符可读),另外一个是否完成了这件事情(如调用 read/write 完成 IO 操作)。多路复用 IO 记录下来有哪些人在等待消息的通知,在条件满足时负责通知办理者,而完成这件事情还是需要办理者自己去完成。只要是自己去完成的操作,都是同步的操作。
UNP 的 6.2 节中,最后对异步与同步做的总结非常准确。
POSIX defines these two terms as follows:
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.
Using these definitions, the first four I/O models—blocking, nonblocking, I/O multiplexing, and signal-driven I/O—are all synchronous because the actual I/O operation (recvfrom) blocks the process. Only the asynchronous I/O model matches the asynchronous I/O definition.
本文由「那谁」投稿,想更多交流上述话题,可以回复 join 申请进群。转载本文请注明来自高可用架构 「ArchNotes」微信公众号并包含以下二维码。
- 上一篇:异步调用如何使用是最好的方式?
- 下一篇:阻塞、非阻塞、同步、异步 的区别
相关推荐
- wordpress集团公司网站模板:XSgr
-
小兽wordpress推出一款高端集团公司主题,打造高品质官网。高端是一种态度和坚持,因为我坚信贴合产品及品牌理念的高端深度定制才能最大化地呈现企业的务实严谨与产品的专业品质相比,某种程度上讲–...
- 宝塔搭建WordPress跨境电商外贸商城模板汉化woodmart7.5.1源码
-
大家好啊,欢迎来到web测评。本期给大家带来一套php开发的WoodmartV7.5.1汉化主题|跨境电商|外贸商城|产品展示网站模板WordPress主题,是wordpress开发的。上次是谁要的系...
- Wordpress建站设计技巧:用好Wordpress自带样板功能
-
作者:悦然wordpress建站(悦然建站)...
- 微软推出Azure平台WordPress模板:分分钟搭建博客
-
IT之家讯微软Azure云服务平台可以托管各种各样的Web服务,从企业应用后端服务到视频托管服务等等。WordPress是目前最为流行的博客平台,驱动着全球1/4的互联网网站。不过用户想要在Azur...
- wordpress公司展示型通用模板:XShw
-
主题介绍xshw公司模板是一款现代化风格、通用型公司展示的Wordpress公司建站模板,采用经典的颜色搭配、精致的模块布局、完善的列表模板、响应式自适应技术以及配置的大幅全屏轮播图、公司简介、业务介...
- WP模板开发中,怎样给wordpress网站的文章,添加点赞功能?
-
我们在网上浏览某些网站的文章时,在文章的结尾处,都会有一个点赞的按钮,如果觉得文章内容非常不错,就可以点击这个“点赞”按钮,给这篇文章进行点赞一下。在wordpress网站的模板主题开发中,我们可不可...
- 免费的WordPress模板
-
免费的WordPress模板有很多种类,适用于不同类型的网站需求。以下是一些推荐的免费WordPress模板,它们各具特色,适合多种用途:...
- 东港边检站开展全面清理自制执勤执法证件表单专项工作
-
为进一步提高边检机关依法行政和服务管理水平,根据部局和总站统一部署,6月3日下午,东港边检站迅速开展全面清理自制执勤执法证件表单专项工作。一是统一思想,提高认识。该站于6月3日召开专题会议,传达部局视...
- 两款超级好用的二维码生成器软件,铁铁们快码住
-
今天分享两款超级好用的二维码生成器,个人认为衡量是否是好用的二维码生成器的主要有以下维度(仅从用户体验角度)...
- 扫码填表如何拍摄现场照片?表单添加图片的二维码制作方法
-
现在通过扫描二维码来登记信息的方式非常的常见,有很多的应用场景会使用这种方式来统计数据,比如问卷调查、用户反馈、巡检结果等类型。通过扫码填写信息后,制作者可以及时的获取对应的数据做出反馈。那么表单二维...
- 纯干货∣教你如何制作一份具有法律效应的“电子合同”
-
表单中使用电子合同时,不仅需要进行功能设置,还需要制作一份PDF格式的模板...
- 金山表单硬核功能“在线考试”上线
-
近日,金山文档针对教师用户群体上线“在线考试”考试功能。教育从业者可在金山文档内完成考试、练习测验、竞赛和作业布置。与此同时,该功能还具备自动批改计分、答案解析、成绩展示、信息收集等特色功能。充分适配...
- 报名小程序怎么制作?借助这个报名表单工具一键搞定
-
报名表单广泛应用于各类活动、课程、会议和招募等场景中,用于收集报名者的个人信息和参与意愿,方便组织者进行统计、管理和沟通。表单制作不需要写代码,学会借助线上报名表单工具就能一键搞定。...
- 货代人的表单制作方式,该升级了!
-
很多在货代行业工作的人可能会思考是否将销售岗位转为操作岗位,因为货代销售工作需要不断迎接业绩的挑战,每个月都要全力以赴,但绩效考核的结果并不总是确定的。...
- 为你的WordPress widget建立表单
-
通过之前的三部分教程我们已经创建了一个自己的WordPresswidget。今天我们将给大家介绍如何为你的widget创建表单,以至于WordPress可以及时的更新widget设置。为widget...