同步、异步、堵塞、非堵塞和函数调用及I/O之间的组合概念
在我们工作和学习中,经常会接触到“同步”、“异步”、“堵塞”和“非堵塞”这些概念,但是并不是每个人都能将它们的关系和区别说清楚。本文将对这些基本概念进行讨论,以期让大家有更清楚的认识。(转载请指明出于breaksoftware的csdn博客)
IT技术和相关术语均为舶来品,于是其相关的问题也并非只有我们讲中文的分不清。在一些外文网站上,我们可以发现外国人也会对这些概念进行区分和探讨。于是,我觉得通过一些英文资料来解释这些问题比较合适,毕竟从语言的角度说,它们更贴近问题的起源。
对于资料的选择,我优先选择相信大家公认的一些权威资料。比如RFC标准是最高的;其次是一些权威专家的论著,比如Addison Wesley的《UNIX Network Programming》;再其次是一些权威网站上的信息,比如百度百科、维基百科、IBM或者微软官网上一些论述。
为了把问题说清楚,我决定先去探讨意思相对的概念。比如“同步”和“异步”就是相对的概念,因为我们从来不会说这是一个“同步异步……”;同样“堵塞”和“非堵塞”也是一对相对的概念,我们也不会说那是一个“堵塞非堵塞……”。然后我们将探讨这两对相对的概念的区别,比如“同步”和“堵塞”的区别,“异步”和“非堵塞”的区别。最后我们将结合“函数调用”和“I/O”来探讨组合出的概念。
同步/异步
同步
“同步”这个概念的探讨将非常有意思,因为我们从这个词可以感受下外语翻译成中文后产生的偏差。
现在我们先“忘记”自己是IT从业人员,“同步”对我们来说可以按百度百科中的解释为:
同步指两个或两个以上随时间变化的量在变化过程中保持一定的相对关系。
怎么具体化这个解释呢?比如战争中,一个集团军的统帅命令自己部下左、中、右三军“同步”前进。于是我们补脑一下,可以想象出同在一个时间段内,三个不同的个体在同时做三件事,而这三个个体存在一定的关联性——同时听命于集团军的统帅。于是这就产生了一种混乱,当我们学习了IT技术,特别是了解了“线程”概念后,可能马上把集团军的统帅想成一个“进程”,而三个“同步”前进的军队就是三个“线程”。那么此时“同步”是不是就是指若干个个体同时发生变化且存在一定关联性呢?是不是更像“Asynchronous”的概念?其实这个问题并非我的臆测,之前在学校时,经常有同学将“同步”的概念理解成“Asynchronous”的行为特点,而我也曾被它们弄混淆过。
虽然我没有去考证过,但是我觉得上面对“同步”的解释更加符合普通民众的认知。
然后不知何时“Synchronization”也被翻译成“同步”了。于是我们在百度百科里看到如下的解释
同步(英语:Synchronization),指对在一个系统中所发生的事件(event)之间进行协调,在时间上出现一致性与统一化的现象。在系统中进行同步,也被称为及时(in time)、同步化的(synchronous、in sync)。
其实这段解释和维基百科中对“Synchronization”解释是一致的
Synchronization is the coordination of events to operate a system in unison. The familiar conductor of an orchestra serves to keep the orchestra in time. Systems operating with all their parts in synchrony are said to be synchronous or in sync; those which are not are asynchronous.
这个解释并不是我们关注的重点,因为它和我们探讨的重心没太多关系。我引入它只是为了说明“Synchronization”也被翻译成“同步”这样一件事的存在。
然而,维基百科里还有一段关于计算机术语中“Synchronization”的解释,它被拿到一个单独的页面中解释——足以说明它和传统意义上“Synchronization”的不同
In computer science, synchronization refers to one of two distinct but related concepts: synchronization of processes, and synchronization of data. Process synchronization refers to the idea that multiple processes are to join up or handshake at a certain point, in order to reach an agreement or commit to a certain sequence of action. Data synchronization refers to the idea of keeping multiple copies of a dataset in coherence with one another, or to maintain data integrity. Process synchronization primitives are commonly used to implement data synchronization.
这段解释将“同步”分为两种:数据同步和过程同步。数据同步不是我们讨论的重点,所以忽略。过程同步(至于此处翻译成“进程”还是“过程”,我觉得“过程”所以可以更加宽泛些而且合理,所以选用“过程”一词)是指多个过程通过一定组织方式达到某种协调,这种协调包含“按一定顺序执行”。这种解释就非常像我们IT民工理解中的“synchronous”了。可惜汉语中“同步”至少在字面上是没有这层意思的。
异步
“异步”这个词在汉语中应该没有历史包袱,所以它的表意和英语中“asynchronous”一致。于是没什么好讨论的。唯一有意思的是这个词是如何被选中来表示“asynchronous”的。可能是因为“synchronous”和“asynchronous”在英语中意思相反,而中文中已经找到“同步”来翻译“synchronous”,于是取“同”相反的修饰词“异”来翻译“asynchronous”为“异步”。
在维基百科上,我找到“Asynchrony”一词的解释,其含义可以解释“asynchronous”
Asynchrony, in computer programming, refers to the occurrence of events independently of the main program flow and ways to deal with such events. These may be "outside" events such as the arrival of signals, or actions instigated by a program that take place concurrently with program execution, without the program blocking to wait for results
堵塞/非堵塞
堵塞
堵塞(Blocking)在维基百科中的解释如下:
In computing, a process is an instance of a computer program that is being executed. A process always exists in exactly one process state. A process that is blocked is one that is waiting for some event, such as a resource becoming available or the completion of an I/O operation.
其意思是过程需要等待一个事件的变化而处于某个状态中。这个事件可以是个资源,比如:内存、CPU、网络、磁盘等。
In a multitasking computer system, individual tasks, or threads of execution, must share the resources of the system. These resources might be:• the CPU• network• memory• disk
非堵塞
我在维基百科上没有找到“非堵塞(Non-blocking)”的词条,但是找到一个类似的“Non-blocking algorithm”
In computer science, an algorithm is called non-blocking if failure or suspension of any thread cannot cause failure or suspension of another thread
同步/异步和堵塞/非堵塞
假如我们只有上述知识,还是很难将“同步”和“堵塞”分清楚,也不太能说清“异步”和“非堵塞”的区别。目前我看国内很多论坛上关于这个问题的讨论也显得前后矛盾。
为了把概念区分开,我们可以借鉴下Addison Wesley的《UNIX Network Programming》中关于同步I/O和异步I/O的一个讨论:
Synchronous I/O versus Asynchronous I/O
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 modelsblocking, nonblocking, I/O multiplexing, and signal-driven I/Oare all synchronous because the actual I/O operation (recvfrom) blocks the process. Only the asynchronous I/O model matches the asynchronous I/O definition.
其大意是“同步I/O”要求过程堵塞直到I/O操作完成。后面我们会讲到,即使使用O_NONBLOCK修饰的I/O,也会因为在调用read等函数时,需要等待内核层把读取的数据运输到用户层。于是I/O操作的完成(completes)与否要视数据是否全部进入用户层。
也就是说“同步”强调的是操作最终完成了,而非中间状态。“堵塞”强调的是对系统资源的等待。相应的,“异步”强调的是操作没有完成,处于中间状态。“非堵塞”强调的是没有对系统资源产生等待行为。之后我们将结合他们和“函数调用”及“I/O”的组合概念来加以区分。
同步/异步、堵塞/非堵塞和函数调用
以下图为例,1、2的操作我们可以认为是“非堵塞的”,我们称之为“非堵塞调用”或者“异步调用”;3操作需要把数据从内核态运送到用户态,于是发生资源等待,从而发生堵塞,我们可以称之为“堵塞调用”或者“同步调用”(整个操作完成)。以更高的视角来看,1、2和3这一组操作最终达到的是一个“同步调用”的结果。
可见“同步调用”是由“堵塞的调用”和“非堵塞的调用”组成,其过程可以没有“非堵塞的调用”,但是必须至少有一个“堵塞的调用”。而“异步调用”和“非堵塞调用”则可以视为一个意思。
同步/异步、堵塞/非堵塞和I/O
这块的讨论我将结合Addison Wesley的《UNIX Network Programming》和IBM官网的《Boost application performance using asynchronous I/O》。
选用Addison的论著无可厚非,毕竟他是大牛,而且《UNIX Network Programming》还是经典之作。选用《Boost application performance using asynchronous I/O》则是因为它在国内被很多人翻译成了中文,之后的示例图也都源于这篇文章,而我对其解释持保留看法。
堵塞I/O
堵塞I/O是默认的I/O类型,因为它不需要使用O_NONBLOCK去修饰。以I/O读取为例,在用户态read函数会一直等待内核态返回结果。这种模型还可称为“同步堵塞模型”。
非堵塞I/O
非堵塞I/O需要使用O_NONBLOCK去修饰。这样在操作该I/O时,如果系统尚未将数据准备好,则直接从内核态返回一个错误。如果数据准备好了,则用户态会等待内核将数据输送到用户态。这种模型可以称之为“同步非堵塞模型”,因为从整个操作来看,这是个同步I/O。而从IO自身来看,因为被O_NONBLOCK修饰,所以是非堵塞的。
多路复用I/O
不管I/O是否被O_NONBLOCK修饰,遇到select/poll方法都会被堵塞。所以多路复用I/O可以是“同步堵塞模型”,也可以是“同步非堵塞模型”。
但是在《Boost application performance using asynchronous I/O》一文(后称《Boo》文)中,将使用O_NONBLOCK修饰的多路复用模型称之为“Asynchronous blocking I/O”,这个观点我是不认可的。
为什么呢?当我们定义一个名称时,前面的定语可能用于修饰不同的概念。如果按照《Boo》文描述,Asynchronous应该是用于修饰I/O的,Blocking是用于修饰Select函数调用的。但是之前我们讲过,Addison Wesley根据RFC对Synchronous I/O的定义,认定多路复用I/O不属于异步IO。同样,如果Asynchronous不是修饰I/O,那么Blocking是用于修饰I/O的么?那当然更不对,因为I/O被O_NONBLOCK修饰了。那如果Asynchronous和Blocking都不是修饰I/O的,那么Asynchronous blocking I/O和Synchronous non-blocking I/O又有什么区别呢?
异步I/O
这种I/O在Linux系统上叫AIO,在windows系统上交IOCP(完成端口)。这种模型最大的特征执行用户态响应前,数据已经进入用户态,从而不会发生像同步I/O一样,需要等待内核态往用户态输送数据。这种模型也称“异步非堵塞模型”。
参考链接:
http://library.tebyan.net/en/Viewer/Text/164873/92#ch06fig01
https://www.ibm.com/developerworks/library/l-async/
https://stackoverflow.com/questions/748175/asynchronous-vs-synchronous-execution-what-does-it-really-mean
http://www.programmr.com/blogs/difference-between-asynchronous-and-non-blocking
https://stackoverflow.com/questions/8416874/whats-the-differences-between-blocking-with-synchronous-nonblocking-and-asynch
https://blogs.msdn.microsoft.com/csliu/2009/08/27/io-concept-blockingnon-blocking-vs-syncasync/
http://www.cs.unc.edu/~dewan/242/s07/notes/ipc/node9.html
https://coelhorjc.wordpress.com/2014/12/18/using-non-blocking-and-asynchronous-io-ck10-problem-in-linux-and-windows-with-epool-iocp-aiolibaio-libeventlibevlibuv-boost-asio/
http://www.cnblogs.com/whyandinside/archive/2012/03/04/2379234.html
http://www.fsl.cs.sunysb.edu/~vass/linux-aio.txt
https://stackoverflow.com/questions/2625493/asynchronous-vs-non-blocking
http://blog.csdn.net/historyasamirror/article/details/5778378
http://www.dart.com/help/ptsslnet/UsingSynchronousVsAsynchronous.html
https://en.wikipedia.org/wiki/Asynchronous_method_invocation
相关文章:
“抗击”新型肺炎!阿里达摩院研发AI算法,半小时完成疑似病例基因分析
利用技术辅助抗击疫情,阿里巴巴、百度等科技巨头各显身手。此前,AI科技大本营采访报道了阿里达摩院《数十名工程师作战5天,阿里达摩院连夜研发智能疫情机器人》一文,后者为了解决客服人力不足的局面,快速响应政府需求开…

反编译工具jad简单用法
反编译工具jad简单用法 下载地址:[url]http://58.251.57.206/down1?cidB99584EFA6154A13E5C0B273C3876BD4CC8CE672&t2&fmt&usrinput[/url]反编译工具jad &dt2002000一. 不用安装,只要解压就行(有这样两个文件jad.exe&#x…
ubuntu 系统设置bugzilla制
随着时间的推移。在大脑中形成的记忆总会慢慢的淡去。人的记忆力就是这样。所以最好的办法就是形成博客去记录下来,一方面给自己以后回想用。一方面也算是自己的一个积累。所以一旦选择了一个行业,最好不要轻 易转行,由于非常多知识须要不断的…
静态分析C语言生成函数调用关系的利器——cflow
除了《静态分析C语言生成函数调用关系的利器——calltree》一文中介绍的calltree,我们还可以借助cflow辅助我们阅读理解代码。(转载请指明出于breaksoftware的csdn博客) cflow的说明和安装cflow是一款静态分析C语言代码的工具,通过…
我在MongoDB年终大会上获二等奖文章:由数据迁移至MongoDB导致的数据不一致问题及解决方案...
作者 | 上海小胖来源 | Python专栏(ID:xpchuiit)故事背景企业现状2019年年初,我接到了一个神秘电话,电话那头竟然准确的说出了我的昵称:上海小胖。我想这事情不简单,就回了句:您好,我是小胖&…

注意String.Split的几个重载形式
String.Split应该是经常用到的一个函数了,经常的有下面两种形式 public string[] Split(char[] separator, StringSplitOptions options); public string[] Split(string[] separator, StringSplitOptions options); 1. 多数情况下我们会使用第一种,代码里可能这…

如何让猎头找到你
如何让猎头找到你

libev源码解析——总览
libev是个非常优秀的基于事件的循环库,很多开源软件,比如nodejs就是使用其实现基础功能。本系列将对该库进行源码分析。(转载请指明出于breaksoftware的csdn博客) 不知道是被墙了还是网站不再维护,它的官网(…
GPT-2仅是“反刍”知识,真正理解语言还要改弦更张
作者 | Gary Marcus译者 | 泓技编辑 | 夕颜出品 | AI科技大本营(ID:rgznai100)【导读】OpenAI的GPT-2正被广泛地讨论,无论是《纽约客》还是《经济学人》,我们都能看到有关它的话题。关于自然和人工智能,它想…

sap business one 笑谈
Sap Business .e 出生在以色列,生下来的时候父母给起了个小名叫SBO,据说他的亲生父母是SAP家庭里的一个重要成员,后来SAP家族里的长老认为SBO长得不错,挺好看的。毕竟SAP家族里生下来的儿子都是胖胖的,想要个瘦点长相好…

来51学院的第一天
【来51学院的第一天】转载于:https://blog.51cto.com/10801189/1703279
libev源码解析——监视器(watcher)结构和组织形式
在《libev源码解析——总览》中,我们介绍了libev的一些重要变量在不同编译参数下的定义位置。由于这些变量在多线程下没有同步问题,所以我们将问题简化,所提到的变量都是线程内部独有的,不用考虑任何多线程问题。(转载…

《评人工智能如何走向新阶段》后记(再续16)
由AI科技大本营下载自视觉中国181.5种常见的机器学习方法。 (1)线性回归linear regression: 一种流行的回归算法,从样本特征的线性组合,linear combination中学习模型。 (2)负数几率回归,logis…

怎么样才能快速的把淘宝店铺推广出去
我来到淘宝近一个月了,目前顺利地得到了两颗心心.感触颇多.其中店铺的推广显得尤其重要,应很多淘友的提问,我把一些店铺推广技巧介绍如下,你如果觉得有益,就回一下贴,以示支持.在这里先谢谢了!先看第一板斧:一、修练内功ÿ…

linux的ftp服务器
2019独角兽企业重金招聘Python工程师标准>>> ftp服务器在网上较为常见,Linux ftp命令的功能是用命令的方式来控制在本地机和远程机之间传送文件,这里详细介绍Linux ftp命令的一些经常使用的命令,相信掌握了这些使用Linux 进行ftp操…

使用Forms Authentication实现用户注册、登录 (二)用户注册与登录
从这一部分开始,我们将通过一个实际的完整示例来看一下如何实现用户注册与登录。在介绍注册与登录之前,我们首先介绍一下如何判断用户是否已登录,并未后面的示例编写一些基础代码。 判断用户是否已经登录首先,在Web站点项目中添加…
libev源码解析——调度策略
在《libev源码解析——监视器(watcher)结构和组织形式》中介绍过,监视器分为[2,-2]区间5个等级的优先级。等级为2的监视器最高优,然后依次递减。不区分监视器类型和关联的文件描述符的值,权限高的要优先于权限低的执行…
特斯拉AI团队招兵买马:“英雄不问出处”
2月3日,特斯拉创始人兼CEO埃隆•马斯克发布推特,贴出了Autopilot AI团队招聘人才的信息。马斯克在推特中表示,特斯拉AI团队将直接向马斯克回报,他几乎每天都会与团队保持沟通和交流,并透露团队base在德州奥斯汀。据特斯…

java中重载与重写的区别
最近了解一下重载和重写 一、重载(Overloading) (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。 重载Overloading是一个类中多态性的一种表现。 (2) Ja…
libev源码解析——I/O模型
在《libev源码解析——总览》一文中,我们介绍过,libev是一个基于事件的循环库。本文将介绍其和事件及循环之间的关系。(转载请指明出于breaksoftware的csdn博客) 目前ibev支持如下IO事件模型: select模型。对应文件是…
“数学不好,干啥都不行!”骨灰级程序员:其实你们都是瞎努力
之前有很多程序员读者向我们抱怨:1)做算法优化时,只能现搬书里的算法,遇到不一样的问题,就不会了。2)面试一旦涉及到算法和数据结构,如果数学不行,面试基本就凉凉了。3)一…

VISTA中注册表项LEGACY_****的删除
在VISTA中如果你错误安装了某个驱动软件,而如果这个驱动安装软件考虑不周,无法卸载,那么你就麻烦了!比如我的U盘以前一直使用优易U盘加密软件1.2来做一个隐蔽的U盘。某天我在VISTA上运行了这个U盘加密软件,这个软件运行…
nodejs这个过程POST求
下面是一个web登陆模拟过程。当我们问一个链接,你得到一个表格,然后填写相应的表格值,然后提交登陆。 var http require(http); var querystring require(querystring); http.createServer(function (request, response) {var responseStri…

FTP、HTTP断点续传和多线程的协议基础
使用FTP或HTTP协议的下载软件支持断点续传和多线程的协议基础是:FTP用的是REST和SIZE;HTTP用的是Range。1、FTP实现断点续传的协议基础REST(有的服务器可能不支持此命令)Syntax: REST positionSets the point at which a file tra…
libev源码解析——定时器原理
本文将回答《libev源码解析——I/O模型》中抛出的两个问题。(转载请指明出于breaksoftware的csdn博客) 对于问题1:为什么backend_poll函数需要指定超时?我们让其一直等待到有事件发生不是更好么? 答案是“必须要指定超…
AI颠覆经济世界作用被夸大?影响远比媒体头条报道更加复杂
来源 | The Gradient译者 | 刘畅编辑 | 夕颜出品 | AI科技大本营(ID:rgznai100) 【导读】每天我们都听到有人声称人工智能将改变经济体系,造成大量的失业和垄断。但是,经济学家是如何看待的呢?在第三届AI经…

ArcGIS制图之Sub Points点抽稀
简介 Sub Points工具是 Esri 中国自主开发的一个插件,该工具优先考虑点在空间分布上的均匀合理性,并结合点数据中包含的 "优先级" 属性进行筛选。通过获取每个点在一定范围内拥有的相邻点的数目信息,得到地图中点密度的分布状况。抽…
libev源码解析——定时器监视器和组织形式
我们先看下定时器监视器的数据结构。(转载请指明出于breaksoftware的csdn博客) /* invoked after a specific time, repeatable (based on monotonic clock) */ /* revent EV_TIMEOUT */ typedef struct ev_timer {EV_WATCHER_TIME (ev_timer)ev_tstamp…
谁说AI无用?疫情下,AI已经代替人类做了很多...
整理 | 夕颜出品 | AI科技大本营(ID:rgznai100)经历过无比漫长的十多天,疫情至今还没有任何退散的迹象,形势越来越严峻。百度实时大数据报告显示,截至2020年2月4日9时,新型冠状病毒累计报告确诊病例20471例…

关于CSS样式浏览器兼容问题的一些注意事项
CSS技巧1.div的垂直居中问题 vertical-align:middle; 将行距增加到和整个DIV一样高 line-height:200px; 然后插入文字,就垂直居中了。缺点是要控制内容不要换行 2. margin加倍的问题 设置为float的div在ie下设置的margin会加倍。这是一个ie6都存在的bug。解决…