博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对阻塞,非阻塞,同步,异步的深入理解
阅读量:4558 次
发布时间:2019-06-08

本文共 1127 字,大约阅读时间需要 3 分钟。

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

同步和异步的区别:

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

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

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

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

阻塞与非阻塞的区别:

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

举个例子:

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

转载于:https://www.cnblogs.com/geeklove01/p/8467726.html

你可能感兴趣的文章
反汇编简介
查看>>
Android 获取系统短信内容
查看>>
不看好运维竖井产品模式,优云打造融合化运维PaaS平台
查看>>
java基础--extension package guava(2) cache
查看>>
SQL Server中的Merge关键字
查看>>
安装nginx
查看>>
Google Hack的一些整理
查看>>
[贪心] JZOJ P3757 随机生成器
查看>>
Codeforces Round #370 (Div. 2)(简单逻辑,比较水)
查看>>
poj3191(进制转换)
查看>>
人物记忆
查看>>
小白安装openvas总结-原创20181213
查看>>
dbscan
查看>>
Android和ios蓝牙连接的区别
查看>>
idea工程编码指定UTF-8
查看>>
进程通信之二 管道技术第二篇 匿名管道
查看>>
ppt转换为html格式 抄的别人的 但是改成了web版 比较简陋
查看>>
CPU高的排查
查看>>
3Sum
查看>>
第二阶段冲刺 第三天
查看>>