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

一个小故事web

故事:小A烧开水。编程

出场人物:小A网络

出场道具:普通水壶(放在煤气灶上的那种,为了方便简称:水壶);会响的水壶(水烧开了会响的那种,简称:响壶)。并发

故事目的:小A要拿开水泡咖啡异步

小A为了实现目的,指定了4个计划:ide

一、用水壶烧水,而且站在煤气灶旁边,啥事不干,两眼直勾勾的盯着水壶,等水烧开。烧开后就去泡咖啡。-同步阻塞spa

假设烧水和泡咖啡是在同一个线程中执行。操作系统

二、仍然用水壶煮水,不过此时再也不傻傻得站在那里看水开没开,而是去玩局LOL,每当本身死了,就过来看看水开了没有。若是水开了就去泡咖啡。-同步非阻塞线程

假设这里玩LOL,是另外一个线程运行的。对象

三、动用响壶烧水,仍然站在煤气灶旁边,不过此时不两眼直勾勾的盯着壶了,而是听响,由于响壶水开时会用响声通知小A。-异步阻塞

四、在计划3的基础上,小A不站在煤气灶旁边了,而是去玩局LOL,等听到响壶的声音提醒后,再去跑咖啡。-异步非阻塞

有了上边的故事铺垫,咱们再来看一看概念

同步:

同步这个词在不少场合下都会被使用,若是单从字面意思来看:相同的步骤。可是在编程的领域里讲,字面意思就不那么准确了。

对于编程领域来讲,同步就是发起一个请求,直到请求返回结果以后,才进行下一步操做。简单来讲,同步就是必须一件事一件事的作,等前一件作完了,才能作下一件事。

例子:此种模式很常见,好比我发起一个网络请求查询一我的的身份证,而后根据身份证查看这我的的详细信息。那么我查询详细信息的操做须要等待查询身份证的操做,那么此时查询身份证的操做就是一个同步操做。

异步:

异步很明显是与同步相对,两者的区别在因而否须要等待某操做的返回结果。简单来讲,咱们仍是一个网络请求,若是咱们此时不须要依赖这个请求的结果就能进行后续操做,那么此时这个网络请求就是一个异步操做。

当一个异步操做发出后,调用者在没有获得结果以前,能够继续执行后续操做。这就是异步。

同步和异步的区别:

两者的区别仍是很明显的:请求发出后,是否须要等待请求结果,才能继续执行其余操做。

阻塞

阻塞的概念每每伴随这线程。阻塞通常是指:在调用结果返回以前,当前线程会被挂起。调用线程只有在获得结果以后才会被唤醒执行后续的操做。

非阻塞

那么非阻塞,毫无疑问是阻塞的反向操做。非阻塞式的调用指:在结果没有返回以前,该调用不会阻塞住当前线程。

是否是感受阻塞/非阻塞和同步/异步有殊途同归的地方?

其实,这二者存在本质的区别,面向的对象是不一样的。

- 阻塞/非阻塞:进程/线程须要操做的数据若是还没有就绪,是否妨碍了当前进程/线程的后续操做。

  • 同步/异步:数据若是还没有就绪,是否须要等待数据结果。

并发和并行

两者的区分度很是的高,就在于四个字:是否同时。

并发:当有多个线程在操做时,若是系统只有一个CPU,操做系统只能把CPU运行时间划分红若干个时间段,再将时间段分配给各个线程执行,在一个时间段的快速的切换不一样的线程代码运行。

并行:当系统有多个CPU时,能够存在当一个CPU执行一个线程时,另外一个CPU能够执行另外一个线程,两个线程互不抢占CPU资源,能够同时进行。

举个小例子

小A吃饭吃到一半,电话来了,小A一直到吃完了之后才去接。即不支持并发也不支持并行

小A吃饭吃到一半,电话来了,小A停了下来接了电话,接完后继续吃饭。支持并发

小A吃饭吃到一半,电话来了,小A一边打电话一边吃饭。支持并行

一切的开始,让咱们从一个小故事出发:(故事灵感来自互联网)

一个小故事

故事:小A烧开水。

出场人物:小A

出场道具:普通水壶(放在煤气灶上的那种,为了方便简称:水壶);会响的水壶(水烧开了会响的那种,简称:响壶)。

故事目的:小A要拿开水泡咖啡

小A为了实现目的,指定了4个计划:

一、用水壶烧水,而且站在煤气灶旁边,啥事不干,两眼直勾勾的盯着水壶,等水烧开。烧开后就去泡咖啡。-同步阻塞

假设烧水和泡咖啡是在同一个线程中执行。

二、仍然用水壶煮水,不过此时再也不傻傻得站在那里看水开没开,而是去玩局LOL,每当本身死了,就过来看看水开了没有。若是水开了就去泡咖啡。-同步非阻塞

假设这里玩LOL,是另外一个线程运行的。

三、动用响壶烧水,仍然站在煤气灶旁边,不过此时不两眼直勾勾的盯着壶了,而是听响,由于响壶水开时会用响声通知小A。-异步阻塞

四、在计划3的基础上,小A不站在煤气灶旁边了,而是去玩局LOL,等听到响壶的声音提醒后,再去跑咖啡。-异步非阻塞

有了上边的故事铺垫,咱们再来看一看概念

同步:

同步这个词在不少场合下都会被使用,若是单从字面意思来看:相同的步骤。可是在编程的领域里讲,字面意思就不那么准确了。

对于编程领域来讲,同步就是发起一个请求,直到请求返回结果以后,才进行下一步操做。简单来讲,同步就是必须一件事一件事的作,等前一件作完了,才能作下一件事。

例子:此种模式很常见,好比我发起一个网络请求查询一我的的身份证,而后根据身份证查看这我的的详细信息。那么我查询详细信息的操做须要等待查询身份证的操做,那么此时查询身份证的操做就是一个同步操做。

异步:

异步很明显是与同步相对,两者的区别在因而否须要等待某操做的返回结果。简单来讲,咱们仍是一个网络请求,若是咱们此时不须要依赖这个请求的结果就能进行后续操做,那么此时这个网络请求就是一个异步操做。

当一个异步操做发出后,调用者在没有获得结果以前,能够继续执行后续操做。这就是异步。

同步和异步的区别:

两者的区别仍是很明显的:请求发出后,是否须要等待请求结果,才能继续执行其余操做。

阻塞

阻塞的概念每每伴随这线程。阻塞通常是指:在调用结果返回以前,当前线程会被挂起。调用线程只有在获得结果以后才会被唤醒执行后续的操做。

非阻塞

那么非阻塞,毫无疑问是阻塞的反向操做。非阻塞式的调用指:在结果没有返回以前,该调用不会阻塞住当前线程。

是否是感受阻塞/非阻塞和同步/异步有殊途同归的地方?

其实,这二者存在本质的区别,面向的对象是不一样的。

- 阻塞/非阻塞:进程/线程须要操做的数据若是还没有就绪,是否妨碍了当前进程/线程的后续操做。

  • 同步/异步:数据若是还没有就绪,是否须要等待数据结果。

并发和并行

两者的区分度很是的高,就在于四个字:是否同时。

并发:当有多个线程在操做时,若是系统只有一个CPU,操做系统只能把CPU运行时间划分红若干个时间段,再将时间段分配给各个线程执行,在一个时间段的快速的切换不一样的线程代码运行。

并行:当系统有多个CPU时,能够存在当一个CPU执行一个线程时,另外一个CPU能够执行另外一个线程,两个线程互不抢占CPU资源,能够同时进行。

举个小例子

小A吃饭吃到一半,电话来了,小A一直到吃完了之后才去接。即不支持并发也不支持并行

小A吃饭吃到一半,电话来了,小A停了下来接了电话,接完后继续吃饭。支持并发

小A吃饭吃到一半,电话来了,小A一边打电话一边吃饭。支持并行

相关文章
相关标签/搜索