关于同步、异步与阻塞、非阻塞的理解
1、前言
前一段时间出去面试,被问到同步、异步与阻塞、非阻塞的区别。我一时半会没有想出来,作为一个工作三年的人来说,实在很惭愧。我当时理解同步、异步属于两个进程中间的协作关系,例如使用浏览器访问一个网站,需要多次请求服务端,才能加载完整个页面的内容。同步的操作如下:浏览器首先发送第一个请求,等待服务器回复后,再发送第二个请求,依次类推,直到所有请求完成。异步的操作如下:浏览器发送第一个请求,可以不用等待服务器返回,可以继续发送第二个请求。阻塞与非阻塞属于进程的API执行动作的方式,例如进行需要read数据,阻塞方式操作流程是:如果没有数据,则read会一直等着数据到来,才能进行后续的动作;而非阻塞则是read没有到数据后,则可以进行后续的动作,当有数据的时候再回来读取。通常linux网络API默认都是阻塞的,例如connect、send、recv等。回答后感觉自己心里没有底,底层的关系到底是什么样的,比较虚,没能深入理解。
2、深入理解分析
回来以后,赶紧上网好好查查,加深学习一下。这两个概念在工作中经常用到这些,例如在linux网络IO中涉及到如下模型:
(1)阻塞式IO
(2)非阻塞式IO
(3)IO多路复用
(4)信号驱动IO
(5)异步IO
在知乎上面看到一些解释如下:
截图如下:
3、总结
同步和异步针对应用程序来,关注的是程序中间的协作关系;阻塞与非阻塞更关注的是单个进程的执行状态。
同步:执行一个操作之后,等待结果,然后才继续执行后续的操作。
异步:执行一个操作后,可以去执行其他的操作,然后等待通知再回来执行刚才没执行完的操作。
阻塞:进程给CPU传达一个任务之后,一直等待CPU处理完成,然后才执行后面的操作。
非阻塞:进程给CPU传达任我后,继续处理后续的操作,隔断时间再来询问之前的操作是否完成。这样的过程其实也叫轮询。
阻塞、非阻塞、多路IO复用,都是同步IO,异步必定是非阻塞的,所以不存在异步阻塞和异步非阻塞的说法。真正的异步IO需要CPU的深度参与。换句话说,只有用户线程在操作IO的时候根本不去考虑IO的执行全部都交给CPU去完成,而自己只等待一个完成信号的时候,才是真正的异步IO。所以,拉一个子线程去轮询、去死循环,或者使用select、poll、epool,都不是异步。
参考网址:
https://www.zhihu.com/question/19732473
https://www.zhihu.com/question/27965282
http://www.smithfox.com/?e=191
相关文章
- Java中的5种同步辅助类
- python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)
- .NET 同步与异步之锁(Lock、Monitor)(七)
- .NET同步与异步之相关背景知识(六)
- 支持异步同步的分布式CommandBus MSMQ实现 - 支持Session传递、多实例处理
- 同步Internet时间
- Redis 学习笔记四 Mysql 与Redis的同步实践
- 对比MICROSOFT的SKYDRIVE测试免费同步方案和公司FTP方案
- EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器同步输出http-flv协议流是怎么实现的?
- [Java] 多线程下生产者消费者问题的五种同步方法实现
- 怎样理解阻塞非阻塞与同步异步的区别?
- 【STM32H7教程】第76章 STM32H7的FMC总线应用之驱动AD7606(8通道同步采样, 16bit, 正负10V)
- [INet] I/O模型:同步阻塞,同步非阻塞,异步非阻塞
- SAP CRM和C4C数据同步的两种方式概述:SAP PI和HCI
- promise 异步问题。导致页面没有实时刷新的解决办法:改成同步
- 同步和异步的区别
- 从小白到高手,你需要理解同步与异步(内含10张图)
- 异步输入信号的脉冲宽度小于时钟周期时的同步电路(高速时钟域—>低速时钟域)
- Ubuntu16.04和Centos7.5安装Rsync并测试同步文件
- 基础知识~ 锁相环 PLL、同步时钟 、同步电路/异步电路、FPGA、IC、关键路径
- android NDK编程:使用posix多线程与mutex相互排斥同步
- python里使用事件对象asyncio.Event来同步协程
- 同步计算输入的各个数的总和与平均值
- FPGA | 异步复位同步释放的理解
- 任务同步管理的方法
- 如何云同步vscode的配置到码云(gitee)上
- 进程和同步和消息机制
- Rsync 文件同步(三):实时同步 Rsync + Sersync
- Mariadb的半同步复制