同步和异步
描述的是线程与线程的关系。
- 如果两个线程是同步的,调用者(线程A,通常是应用程序)需要等待被调用者(线程B,通常是内核)返回结果,才进行下一步的操作。
例子:你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下",然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。
- 线程异步,调用者(线程A)不等待被调用者(线程B)返回,而是通过其他的方式,例如:
- 时间
- 回调
例子:步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。
阻塞和非阻塞
针对某一个线程来说的,线程要么阻塞要么非阻塞。
具体来说是对与内核进行数据交互。
-
阻塞:调用返回结果之前,线程挂起,得到结果后才返回
-
非阻塞:在不能立刻得到结果的调用,该调用不阻塞这个进程,进程可以去做其他的事。
相互结合
同步阻塞:
发送方发送请求一直等待响应
接收方收到请求后,需要进行IO操作取得结果。因为这里是阻塞,就一直等待结果返回,再响应发送发。
同步非阻塞:
发送方一直等待响应
接收方处理请求,进行IO操作,如果IO操作立刻得到结果,就返回,否则就做其他的事情。
如果IO操作完成,再通知给接收方,接收方响应发送方。
发送方得到响应,结束等待。
异步阻塞:
发送方发送请求,不等待响应。进行其他的工作
接收方进行IO操作,如果不能得到结果,就一直等待结果返回,啥也不做。直到结果返回之后再给发送方。
异步非阻塞:
发送方发送请求,不等待响应。进行其他的工作
接收方进行IO操作,如果不能得到结果,不等待做其他的事。
IO完成之后再通知接收方,然后接收方响应发送方。
综上:
-
同步异步描述的是指发送方与接收方
-
阻塞非阻塞是指发送方的处理方式者接收方的处理方式
对于IO操作的同步/异步
同步阻塞IO:
-
同步:应用程序调用IO时等待结果返回或者不断轮询是否完毕,只有拿到结果后才能继续进行。
- 阻塞IO:IO操作彻底完成后返还给用户空间。中间啥也别干等着。
- 非阻塞IO:IO执行后立刻返回一个状态值,不需要在那等着他完成。可以不断询问是否完成了。
-
异步:应用程序调用IO时,不等待结果返回,直接做别的事。等IO结束后通知这个应用程序线程,或者使用回调函数。
- 阻塞IO:同上
- 非阻塞IO:同上
这里同步、异步指的是应用程序线程和内核之间的关系
阻塞非阻塞是指内核准备数据的方式。
参考
1.https://www.cnblogs.com/loveer/p/11479249.html
2.https://www.zhihu.com/question/19732473/answer/20851256