一、 同步与异步:
同步与异步代表着:用户线程和内核的交互方式
同步:用户线程发起IO操作需要等待或者轮询内核是否完成IO操作
异步:用户线程发起IO操作后无需等待,可以执行其它操作
同步请求,A调用B,B的处理是同步的,在处理完之前他不会通知A,只有处理完之后才会明确的通知A。
异步请求,A调用B,B的处理是异步的,B在接到请求后先告诉A我已经接到请求了,然后异步去处理,处理完之后通过回调等方式再通知A。
所以说,同步和异步最大的区别就是被调用方的执行方式和返回时机。同步指的是被调用方做完事情之后再返回,异步指的是被调用方先返回,然后再做事情,做完之后再想办法通知调用方。
二、 阻塞与非阻塞:
阻塞与非阻塞代表着:用户线程调用内核IO操作时的状态
阻塞:用户线程调用内核IO后被挂起
非阻塞:用户线程调用IO后直接返回状态,回调函数通知
阻塞请求,A调用B,A一直等着B的返回,别的事情什么也不干。
非阻塞请求,A调用B,A不用一直等着B的返回,先去忙别的事情了。
所以说,阻塞和非阻塞最大的区别就是在被调用方返回结果之前的这段时间内,调用方是否一直等待。阻塞指的是调用方一直等待别的事情什么都不做。非阻塞指的是调用方先去忙别的事情。
一个例子:
1.张三去奶茶店买奶茶,排队等待。(同步阻塞)
2.张三去奶茶店买奶茶,坐在椅子上玩手机,时不时的去问一下店员好了没(同步非阻塞)
3.张三去奶茶店买奶茶,排队等待机器叫号(异步阻塞)
4.张三去奶茶店买奶茶,坐在椅子上玩手机,等待机器叫号(异步非阻塞)
所谓同步异步,只是对于奶茶店而言。
同步: 没有利用机器叫号的奶茶店
虽然都能拿到奶茶,但利用机器叫号的奶茶店可以在奶茶好了之后,提示张三
异步: 利用机器叫号的奶茶店
只能让调用者去轮询自己,造成张三效率的低下,cpu密集型
所谓阻塞非阻塞,仅仅对于张三而言。
立等的张三张,阻塞;玩手机的老张,非阻塞。
简单的说:在处理IO的时候,阻塞和非阻塞都是同步IO。
只有使用了特殊的API才是异步IO。
阻塞、非阻塞和同步、异步的区别
首先,前面已经提到过,阻塞、非阻塞和同步、异步其实针对的对象是不一样的。阻塞、非阻塞说的是调用者,同步、异步说的是被调用者。
有人认为阻塞和同步是一回事儿,非阻塞和异步是一回事。但是这是不对的。
先来看同步场景中是如何包含阻塞和非阻塞情况的。
我们是用传统的水壶烧水。在水烧开之前我们一直做在水壶前面,等着水开。这就是阻塞的。
我们是用传统的水壶烧水。在水烧开之前我们先去客厅看电视了,但是水壶不会主动通知我们,需要我们时不时的去厨房看一下水有没有烧开。这就是非阻塞的。
再来看异步场景中是如何包含阻塞和非阻塞情况的。
我们是用带有提醒功能的水壶烧水。在水烧发出提醒之前我们一直做在水壶前面,等着水开。这就是阻塞的。
我们是用带有提醒功能的水壶烧水。在水烧发出提醒之前我们先去客厅看电视了,等水壶发出声音提醒我们。这就是非阻塞的。