同步异步与阻塞非阻塞

同步和异步,阻塞和非阻塞,是你们常常接触到可是容易搞混搞不清楚的概念。
最近在知乎上看到严肃对于同步异步,阻塞非阻塞的解释和举例,我以为说的很清楚。
尤为是回答中的例子,特别的生动:
 

“阻塞”与"非阻塞"与"同步"与“异步"不能简单的从字面理解,提供一个从分布式系统角度的回答。
1.同步与异步
同步和异步关注的是消息通讯机制 (synchronous communication/ asynchronous communication)
所谓同步,就是在发出一个*调用*时,在没有获得结果以前,该*调用*就不返回。可是一旦调用返回,就获得返回值了。
换句话说,就是由*调用者*主动等待这个*调用*的结果html

异步则是相反*调用*在发出以后,这个调用就直接返回了,因此没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会马上获得结果。而是在*调用*发出后,*被调用者*经过状态、通知来通知调用者,或经过回调函数处理这个调用编程

典型的异步编程模型好比Node.js多线程

举个通俗的例子
你打电话问书店老板有没有《分布式系统》这本书,若是是同步通讯机制,书店老板会说,你稍等,”我查一下",而后开始查啊查,等查好了(多是5秒,也多是一天)告诉你结果(返回结果)。
而异步通讯机制,书店老板直接告诉你我查一下啊,查好了打电话给你,而后直接挂电话了(不返回结果)。而后查好了,他会主动打电话给你。在这里老板经过“回电”这种方式来回调。异步

2. 阻塞与非阻塞
阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.async

阻塞调用是指调用结果返回以前,当前线程会被挂起。调用线程只有在获得结果以后才会返回。
非阻塞调用指在不能马上获得结果以前,该调用不会阻塞当前线程。分布式

仍是上面的例子
你打电话问书店老板有没有《分布式系统》这本书,你若是是阻塞式调用,你会一直把本身“挂起”,直到获得这本书有没有的结果,若是是非阻塞式调用,你无论老板有没有告诉你,你本身先一边去玩了, 固然你也要偶尔过几分钟check一下老板有没有返回结果。
在这里阻塞与非阻塞与是否同步异步无关。跟老板经过什么方式回答你结果无关。异步编程

 

还有一个例子也很生动,单独列出来:函数

老张爱喝茶,废话不说,煮开水。
出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。
1 老张把水壶放到火上,立等水开。(同步阻塞)
老张以为本身有点傻
2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)
老张仍是以为本身有点傻,因而变高端了,买了把会响笛的那种水壶。水开以后,能大声发出嘀~~~~的噪音。
3 老张把响水壶放到火上,立等水开。(异步阻塞)
老张以为这样傻等意义不大
4 老张把响水壶放到火上,去客厅看电视,水壶响以前再也不去看它了,响了再去拿壶。(异步非阻塞)
老张以为本身聪明了。post

所谓同步异步,只是对于水壶而言。
普通水壶,同步;响水壶,异步。
虽然都能干活,但响水壶能够在本身完工以后,提示老张水开了。这是普通水壶所不能及的。
同步只能让调用者去轮询本身(状况2中),形成老张效率的低下。url

所谓阻塞非阻塞,仅仅对于老张而言。
立等的老张,阻塞;看电视的老张,非阻塞。
状况1和状况3中老张就是阻塞的,媳妇喊他都不知道。虽然3中响水壶是异步的,可对于立等的老张没有太大的意义。因此通常异步是配合非阻塞使用的,这样才能发挥异步的效用。

 

对比阻塞与非阻塞

    阻塞模式下,一个线程只能处理一项任务,要想提升吞吐量必须经过多线程。

    非阻塞模式下,一个线程永远在执行计算操做,这个线程所使用的 CPU 核心利用率永远是 100%,I/O 以事件的方式通知。

    在阻塞模式下,多线程每每能提升系统吞吐量,由于一个线程阻塞时还有其余线程在工做,多线程可让 CPU 资源不被阻塞中的线程浪费。

    而在非阻塞模式下,线程不会被 I/O 阻塞,永远在利用 CPU。多线程带来的好处是在多核 CPU 的状况下利用更多的核。

 

参考连接:

1. 知乎 严肃的回答 https://www.zhihu.com/question/19732473/answer/20851256
2. 同步与阻塞,异步与非阻塞的区别

相关文章
相关标签/搜索