同步与异步、阻塞与非阻塞的理解
2015-10-11 21:29
309 查看
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机制
本质都是为了提高效率为目的
我做一件事情,请求外部协助。外部还没响应结果,我要怎么办,一种办法是,我一直等着对方给我答复结果。另外一种是,对方主动通知我。这是同步和异步的区别。
比如水壶,有没有主动报警(当水开了时)的机制。
而我那个时候在干嘛,我可以去干别的工作,这种就是阻塞还是非阻塞。
阻塞指的是调用者。异步一般是非阻塞模式。
同步,关注的是调用者,调用者自己要不要定期去看返回结果(烧开水的人要不要定去看水壶里的水是否开)。
如果不需要看,那么就是被调用者主动通知调用者(水壶自动报警通知人),这种情况,永远是异步。
同步,异步关注的是通信状态:调用者和被调用者相互如何通信。是同步通知,还是异步通知?
阻塞,关注的是,等待时能不能干别的事情:调用者此时没有得到调用结果前,能不能去干别的事情。能去干别的事情,就是非阻塞。
同步一般都是阻塞模式。因为要卡着等待结果嘛,不能干其他事情。
--------------------------------------地铁上思考
现实生活中很多类似的例子。异步、非阻塞,都是对原来方式的提高效率。所以,应该是从现实生活中借鉴过来的
那有没有,同步非阻塞模式呢?
有!
现实生活中,人等待水壶烧开水。
人可以等着水烧开,什么都不做,也可以去干其他事情。
去干其他事情,就是非阻塞。
人自己定期去看开水开没开,这个过程,需要自己去看,是同步。
发现这样效率不高,看一次,水没有开,再看一次,也没开。于是人们想到,能不能这样的思路:水壶的水开了后,水壶自己通知人(调用者)呢?安一个报警器,鸣叫的方式通知人。这种方式是异步。
异步与同步解决的问题:是定期去看调用结果,还是有结果了自动通知去接受。
邮局的信件:我有没有来信,邮政局的人打电话通知我。这是异步。我需要隔一天跑到邮政局看有没有自己的信件。这是同步。
同步调用,异步调用,这样的叫法可能误导了我们。是从调用的角度来说的。
我理解异步,往往是与非阻塞一起使用的,否则异步没多少实际意义,并不能达到提高效率的目的。
比如,我对比现实中,我等待邮局给我通知信件。我不用去邮局跑了,但是这个时间,我们会去干其他事情(可以干其他事情就是非阻塞)。而不是等在这里,别的事情什么都不干,这样提高不了效率(的确避免了人跑去看,人会疲劳,机器没这个概念,所以忽略掉)
因为异步与非阻塞往往混在一起了使用,于是很难去区别两个的区别。实际要解决的问题不同。
归纳
通俗地记忆:等待结果的过程中,能不能干别的事情。能,就是非阻塞,不能,就是阻塞。
是调用者自己定期去看调用结果,还是被通知有结果。需要自己去看有没有返回结果,是同步模式。是被通知,则是异步。
------------------------------------------
网
上摘录:对
unix来讲,阻塞式I/O(默认),非阻塞式I/O(nonblock),I/O复用(select/poll/epoll)都属于同步I/O,因为它
们在数据由内核空间复制回进程缓冲区时,都是阻塞的(不能干别的事)。只有异步I/O模型(AIO)是符合异步I/O操作的含义的,即在1数据准备完成、
2由内核空间拷贝回缓冲区后通知进程,在等待通知的这段时间里可以干别的事。
下阶段,研究select,poll,epoll机制
相关文章推荐
- 本地通知和远程通知
- 第六周-建立链栈算法库
- 笔记:学习 Android -Handler,Thread,Looper
- 经纬度搜索(1)-Geohash算法原理
- 151010
- 【高斯消元】poj 1830 开关问题
- HadoopMapReduce源码解析
- 连载《一个程序猿的生命周期》- 37、《从0到1》中提到的4点创业信条! 【含】李彦宏的《开讲啦》
- VS2008/BCGControlBar常见问题解决
- 团队展示
- 在窗口中绘画
- JDK中的设计模式
- hdu 5429 Geometric Progression(高精度)
- Rhel7聚合链路
- HadoopHDFS源码解析
- 10.11笔试时遇到的知识点总结
- MVC数据的注册及验证简单总结
- Python运维编程
- leetcode word-pattern
- 黑马程序员——JavaSE之多线程中关于锁的理解 二