前言
大家做socket编程时,经常会遇到同步 异步 阻塞 非阻塞这种术语,很混乱,大家的解释也是千奇百怪,下面就说下我的理解。
应该把它们拆分开来,同步与异步是一个维度,阻塞与非阻塞是一个维度。
从数据通信角度考虑
判断是阻塞还是非阻塞,主要是看函数没有数据接收时是否立刻返回,比如recv函数,如果它执行的时候有数据就接收数据,然后返回接收到的数据总和。没有数据就一直等待直到有数据。那么就是阻塞的,如果他执行的时候是有数据就接收数据,然后返回接收到的数据总和,没有数据就立刻返回0,那么他就是非阻塞的。
判断是同步还是异步的方法是:
同步:需要用户进程主动将存放在内核缓冲区中的数据拷贝到用户进程中。
异步:内核会自动将数据从内核缓冲区拷贝到用户缓冲区,然后再通知用户。
其他
同步异步也好,阻塞非阻塞也罢,都能说得通,不过同步异步一般范围更大些,既可以指某一特定数据处理过程,也可以指的一个业务处理流程,是一次解决呢还是分批处理。而阻塞非阻塞通常指的是数据接收处理这种特定情况。
举个栗子:
如果你想吃一份宫保鸡丁盖饭:
同步阻塞:你到饭馆点餐,然后在那等着,还要一边喊:好了没啊!
同步非阻塞:在饭馆点完餐,就去遛狗了。不过溜一会儿,就回饭馆喊一声:好了没啊!
异步阻塞:遛狗的时候,接到饭馆电话,说饭做好了,让您亲自去拿。 (电话通知)
异步非阻塞:饭馆打电话说,我们知道您的位置,一会给你送过来,安心遛狗就可以了。