以前写过一篇对于这几个概念的粗略解释,现在再深入一些。
同步和异步的区别:
同步是调用协议中结果在调用完成时返回,调用过程中参与双方处于一种状态同步的过程。
异步是指调用方发出请求就立即返回。
请求甚至可能还没有到达接收方。比如放到了某个缓冲区,等待对方取走或者第三方转交。
结果由接收方主动推送,或者调用方轮询而得到。
阻塞与非阻塞的区别:
影响调用接口的结果(在特定条件下是否提前返回结果),而不是调用方式
举个例子:
对于系统调用函数read(socket, buf, len),这个API核心是读出socket缓冲区里的数据并返回,类似于从缓存区中memcpy到buf。
如果缓冲区是空的,那么有三种选择:
1.阻塞住,等缓冲区有数据的时候再memcpy。这是阻塞同步
2.立即返回,什么也不做,让调用者在稍后的某个时候再read,这是非阻塞同步(这种情况下buf属于调用者,可以释放,下次调用的时候可以再使用另一个buf)
3.buf的处理权转移到系统,调用者立即返回,等到缓冲区中有数据的时候再调用memcpy到buf,再把这个buf返回给调用者。
(或者内核直接把数据拷贝到调用者的内存,而不通过缓冲区),这是异步(没有异步阻塞这种说法)
从不同层次上,当一个网络包从应用程序a发到另一台电脑上的应用程序b,需要经历这些过程:
1 从a的业务代码到a的软件框架
2 从a的软件框架到计算机的操作系统内核
3 从a所在计算机的内核到网卡
4 从网卡经过网线发到交换机等设备,层层转发,到达b所在计算机的网卡
5 从b所在计算机的网卡到达b所在计算机的内核
6 从b所在计算机的内核到达b的程序用户空间
7 从b的软件框架到达b的业务代码
关于同步异步的问题,需要一层一层地看:
1,7 取决于软件框架的设计,比如协程模型,调用接口后马上切换到其他协程继续执行,完成之后由框架切换到协程中,这是一种异步接口设计
2,6,需要调用方自己把数据在内核和用户空间里搬来搬去,都是同步接口(IOCP不是)
3,5 内核一般通过缓冲区,使用DMA传输数据,这一步为异步
4 以太网是同步时序逻辑,必须两边都同时就绪了才能开始传输数据,这是同步的
整理自:
https://www.zhihu.com/question/65519203/answer/233433548
怎样理解阻塞非阻塞与同步异步的区别? - 灵剑的回答 - 知乎 https://www.zhihu.com/question/19732473/answer/117012135