对阻塞,非阻塞,同步,异步的深入理解

以前写过一篇对于这几个概念的粗略解释,现在再深入一些。

同步和异步的区别:

同步是调用协议中结果在调用完成时返回,调用过程中参与双方处于一种状态同步的过程。

异步是指调用方发出请求就立即返回

请求甚至可能还没有到达接收方。比如放到了某个缓冲区,等待对方取走或者第三方转交。

结果由接收方主动推送,或者调用方轮询而得到。

阻塞与非阻塞的区别:

影响调用接口的结果(在特定条件下是否提前返回结果),而不是调用方式

举个例子:

对于系统调用函数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

posted @ 2018-03-03 19:32  geeklove  阅读(203)  评论(0编辑  收藏  举报