同步与异步、阻塞与非阻塞的理解

 

 

http://www.zhihu.com/question/19732473

 

本质都是为了提高效率为目的

我做一件事情,请求外部协助。外部还没响应结果,我要怎么办,一种办法是,我一直等着对方给我答复结果。另外一种是,对方主动通知我。这是同步和异步的区别。

比如水壶,有没有主动报警(当水开了时)的机制。

 

而我那个时候在干嘛,我可以去干别的工作,这种就是阻塞还是非阻塞。

 

阻塞指的是调用者。异步一般是非阻塞模式。

 

同步,关注的是调用者,调用者自己要不要定期去看返回结果(烧开水的人要不要定去看水壶里的水是否开)。

 

如果不需要看,那么就是被调用者主动通知调用者(水壶自动报警通知人),这种情况,永远是异步。

 

同步,异步关注的是通信状态:调用者和被调用者相互如何通信。是同步通知,还是异步通知?

 

 

 

 

阻塞,关注的是,等待时能不能干别的事情:调用者此时没有得到调用结果前,能不能去干别的事情。能去干别的事情,就是非阻塞。

 

同步一般都是阻塞模式。因为要卡着等待结果嘛,不能干其他事情。

 

 --------------------------------------地铁上思考

 

现实生活中很多类似的例子。异步、非阻塞,都是对原来方式的提高效率。所以,应该是从现实生活中借鉴过来的

 

那有没有,同步非阻塞模式呢?

有!

现实生活中,人等待水壶烧开水。

人可以等着水烧开,什么都不做,也可以去干其他事情。

去干其他事情,就是非阻塞。

 

人自己定期去看开水开没开,这个过程,需要自己去看,是同步。

 

发现这样效率不高,看一次,水没有开,再看一次,也没开。于是人们想到,能不能这样的思路:水壶的水开了后,水壶自己通知人(调用者)呢?安一个报警器,鸣叫的方式通知人。这种方式是异步。

 

异步与同步解决的问题:是定期去看调用结果,还是有结果了自动通知去接受。

 

 

 

 

邮局的信件:我有没有来信,邮政局的人打电话通知我。这是异步。我需要隔一天跑到邮政局看有没有自己的信件。这是同步。

 

同步调用,异步调用,这样的叫法可能误导了我们。是从调用的角度来说的。

 

我理解异步,往往是与非阻塞一起使用的,否则异步没多少实际意义,并不能达到提高效率的目的。

 

比如,我对比现实中,我等待邮局给我通知信件。我不用去邮局跑了,但是这个时间,我们会去干其他事情(可以干其他事情就是非阻塞)。而不是等在这里,别的事情什么都不干,这样提高不了效率(的确避免了人跑去看,人会疲劳,机器没这个概念,所以忽略掉)

 

因为异步与非阻塞往往混在一起了使用,于是很难去区别两个的区别。实际要解决的问题不同。

 

 

归纳

 

通俗地记忆:等待结果的过程中,能不能干别的事情。能,就是非阻塞,不能,就是阻塞。

 

是调用者自己定期去看调用结果,还是被通知有结果。需要自己去看有没有返回结果,是同步模式。是被通知,则是异步。

 

 

------------------------------------------

 


上摘录:对
unix来讲,阻塞式I/O(默认),非阻塞式I/O(nonblock),I/O复用(select/poll/epoll)都属于同步I/O,因为它

们在数据由内核空间复制回进程缓冲区时,都是阻塞的(不能干别的事)。只有异步I/O模型(AIO)是符合异步I/O操作的含义的,即在1数据准备完成、
2由内核空间拷贝回缓冲区后通知进程,在等待通知的这段时间里可以干别的事。

 

下阶段,研究select,poll,epoll机制

 

时间: 2024-09-27 16:01:17

同步与异步、阻塞与非阻塞的理解的相关文章

再谈IO的异步,同步,阻塞和非阻塞

原本转过一个<六种Socket I/O模型幽默讲解>,里面用比喻的方法讲解各种IO,但说到底那个时候我对同步异步这些还是只知其表.还未能完全理解异步和同步,现在觉得清晰一些了.总结一下. 前提概要: IO的过程: 整个IO的过程其实是应用发起IO的请求,到应用获取到IO请求数据的中间过程. 这个中间,其实主要的时间就是系统准备数据的过程.这也是异步技术的优化所在. 对系统调用的理解: 首先,我们要明确一点.IO的操作属于一种系统调用.也就是应用在运行中,进入到内核代码来执行某些重要的操作. 其

同步与异步、阻塞与非阻塞

这是两对概念,用在不同的语境会有一些不同的含义,不能一概而论. 整体来说,同步就是两种东西通过一种机制实现步调一致,异步是两种东西不必步调一致.   一.同步调用与异步调用: 在用在调用场景中,无非是对调用结果的不同处理. 我理解同步调用就是调用一但返回,就能知道结果,而异步是返回时不一定知道结果,还得通过其他机制来获知结果,如: a.   状态b.   通知c.   回调函数 这里的同步调用不一定会阻塞,例如立即返回失败的结果. 而异步调用立即返回时,你还拿不到结果的.   二.同步线程与异步

并发、并行、同步、异步、阻塞、非阻塞

最近在写爬虫 ,对于这几个概念比较模糊,所以特意学习了一下. 进程(process):进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进 行资源分配和调度的一个独立单位. 线程(thread):线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的 基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存 器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 一个线程可以创建和撤销另一个线

js同步、异步、阻塞与非阻塞的知识点

  当你们在说同步,异步,阻塞,非阻塞的时候到底在说什么? 一个术语的描述应该有一个目标对象吧 那些说同步,异步的家伙,从来不说这个目标对象是谁,在程序的运行过程中,有很多参与者,到底这个同步,异步用来描述谁的呢? 个人理解,同步与异步描述的是一种行为方式,阻塞与非阻塞描述的是一种状态. 在js中,我们说同步,是说同步调用,举个栗子:  代码如下   function A(){           B();           C();   } 那么A对B,C发起了同步调用,这里的主体是A.在执

同步和异步, 阻塞和非阻塞, Reactor和Proactor

http://www.artima.com/articles/io_design_patterns.html http://note.sdo.com/u/1434409594/n/lvRFW~kjR2N0LX0nE004_r http://www.cnblogs.com/xuxm2007/archive/2011/08/15/2139808.html, 图示   我看了些blog, 很少有人能说清楚的, 而且很多人的理解根本就不对 通俗的说 阻塞和非阻塞, 等不等的问题, 傻等就是阻塞, 不等就

网络IO之阻塞、非阻塞、同步、异步总结

1.前言 在网络编程中,阻塞.非阻塞.同步.异步经常被提到.unix网络编程第一卷第六章专门讨论五种不同的IO模型,Stevens讲的非常详细,我记得去年看第一遍时候,似懂非懂,没有深入理解.网上有详细的分析:http://blog.csdn.net/historyasamirror/article/details/5778378.我结合网上博客和书总结一下,加以区别,加深理解. 2.数据流向 网络IO操作实际过程涉及到内核和调用这个IO操作的进程.以read为例,read的具体操作分为以下两个

同步、异步、阻塞和非阻塞的概念

在进行网络编程时,我们常常见到同步.异步.阻塞和非阻塞四种调用方式.这些方式彼此概念并不好理解.下面是我对这些术语的理解.    同步         所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回.按照这个定义,其实绝大多数函数都是同步调用(例如sin, isdigit等).但是一般而言,我们在说同步.异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务.最常见的例子就是 SendMessage.该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返

也谈阻塞、非阻塞、同步、异步

最近在招聘中,发现不少人对BIO.NIO.AIO等理解非常模糊,觉得有必要写文章来纠正下很多人的误解. 在谈这些之前,非常有必要先介绍下Unix 5种IO模型: 阻塞: 阻塞是最常用的IO模型,默认情况下所有的文件操作都是阻塞的.以套接字编程为例.在进程空间中调用recvfrom,其系统调用直到数据报文到达且被拷贝到应用程序进程的缓存区(或者发生错误)后才返回,期间一直在等待.进程在从调用recvfrom开始到它返回的整段时间内是被阻塞的.有一张很经典的图: 非阻塞: 调用recvfrom从应用

同步~异步~阻塞~非阻塞

原文地址:同 步 和 异 步作者:zenos   一.同步-异步-阻塞-非阻塞     同步(Synchronous)和异步(Asynchronous)的概念本来来自通信领域:首先是通信的同步,主要是指客户端在发送请求后,必须得在服务端有回应后才发送下一个请求,所以这个时候的所有请求将会在服务端得到同步:其次是通信的异步,指客户端在发送请求后,不必等待服务端的回应就可以发送下一个请求,这样对于所有的请求动作来说将会在服务端得到异步,这条请求的链路就像是一个请求队列,所有的动作在这里不会得到同步的

浅谈socket同步和异步、阻塞和非阻塞、I/O模型_php技巧

在进行网络编程时,常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式 同步/异步主要针对C端: 同步:c端发出一个功能调用时,在没有得到结果之前,c端死等结果 例如:普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步:c端一个异步过程调用发出后,调用者不会立刻得到结果.实际处理这个调用的部件在完成后,通过状态.通知和回调来通知调用者. 例如:ajax请求(异步): 事件触发->服务