也谈阻塞、非阻塞、同步、异步

简介: 最近在招聘中,发现不少人对BIO、NIO、AIO等理解非常模糊,觉得有必要写文章来纠正下很多人的误解。

最近在招聘中,发现不少人对BIO、NIO、AIO等理解非常模糊,觉得有必要写文章来纠正下很多人的误解。
在谈这些之前,非常有必要先介绍下Unix 5种IO模型:
阻塞:
阻塞是最常用的IO模型,默认情况下所有的文件操作都是阻塞的。以套接字编程为例。在进程空间中调用recvfrom,其系统调用直到数据报文到达且被拷贝到应用程序进程的缓存区(或者发生错误)后才返回,期间一直在等待。进程在从调用recvfrom开始到它返回的整段时间内是被阻塞的。有一张很经典的图:
阻塞IO模型
非阻塞:
调用recvfrom从应用层到内核的过程中,如果该缓冲区没有数据的话,则直接返回一个EWOULDBLOCK的错误,一般会轮询的进行检查状态,看内核空间有没有数据来。直到有数据,最后完成拷贝。如下图:
非阻塞IO模型
IO多路复用:
Linux系统提供的select/poll/epoll,进程将一个或者多个FD(文件描述符)传递给一个或者多个poll/select系统调用,阻塞在select。select和poll可以帮助侦听很多的FD是否准备就绪。但是,select和poll是顺序扫描去检查FD的就绪状态,效率比较低,而且支持的FD数量有限(没记错的话,默认好像是1024还是2048,具体记不清)。而epoll是通过事件驱动的方式,当有FD准备就绪的时候,立即回调函数rollback。如图:
IO多路复用模型
谈到epoll,不得不提一个经典的问题,apache和nginx的对比,为什么nginx比apache效率高很多,这就是根本的原因。
信号驱动:
这种模型在实际应用的非常少,这里不做过多介绍,可以看图:
信号驱动的IO模型
异步:
告知内核启动某个操作,并让内核在整个操作完成后(包括将数据从内核空间拷贝到自己的缓冲区)通知。异步IO的主要特点是完成操作后主动通知。如图:
异步IO模型

好,上面的可能有点抽象。下面用通俗点的语言来总结一下阻塞,非阻塞,同步,异步
阻塞,非阻塞:进程/线程要访问的数据是否就绪,进程/线程是否需要等待;
同步,异步:访问数据的方式,同步需要主动读写数据,在读写数据的过程中还是会阻塞;
异步只需要I/O操作完成的通知,并不主动读写数据,由操作系统内核完成数据的读写。
再举个网上流传的,非常容易理解的例子:
老张爱喝茶,废话不说,煮开水。
出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。
1 老张把水壶放到火上,立等水开。(同步阻塞)老张觉得自己有点傻
2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)
老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。
3 老张把响水壶放到火上,立等水开。(异步阻塞)老张觉得这样傻等意义不大
4 老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞)老张觉得自己聪明了。
所谓同步异步,只是对于水壶而言。普通水壶,同步;响水壶,异步。虽然都能干活,但响水壶可以在自己完工之后,提示老张水开了。这是普通水壶所不能及的。
同步只能让调用者去轮询自己(情况2中),造成老张效率的低下。所谓阻塞非阻塞,仅仅对于老张而言。立等的老张,
阻塞;看电视的老张,非阻塞。情况1和情况3中老张就是阻塞的,媳妇喊他都不知道。
虽然3中响水壶是异步的,可对于立等的老张没有太大的意义。所以一般异步是配合非阻塞使用的,这样才能发挥异步的效用。

目录
相关文章
|
15天前
|
人工智能 安全 API
马斯克xAI解散,22万张GPU租给Claude,算力增加会对中国解封吗?
JeecgBoot AI专题研究 xAI 并入 SpaceX、Anthropic 拿下 Colossus 1 全部算力背后,对 Claude 用户和中国市场意味着什么?昨天,AI行业发生了一件几乎没有人预见到的事情:Anthropic与SpaceX签约,拿下了马斯克孟菲斯超算Colossus
203 1
马斯克xAI解散,22万张GPU租给Claude,算力增加会对中国解封吗?
|
1月前
|
人工智能 安全 Serverless
人人都在造 Skill,谁来保障安全运行?
函数计算AgentRun全新升级:支持Skills安全私域托管、沙箱隔离与秒级加载,内置AI辅助Markdown极速创建技能;提供千种预置技能一键接入,兼顾企业级安全合规与极致性能,打造AI Agent时代可靠基础设施。
|
2月前
|
存储 人工智能 缓存
阿里云服务器4核8G可选实例规格、收费标准、适用场景及活动价格
2026年阿里云服务器4核8G价格,目前经济型e实例4核8G活动价格为1595.11元/1年起;通用算力型u2i实例4核8G活动价格为1252.63元/1年起;通用算力型u2a实例4核8G活动价格为898.20元/1年起;计算型c9i实例4核8G活动价格为3147.56元/1年起;本文为大家介绍4核8G配置的可选实例类型、技术特性、官方收费标准、典型适用场景及2026年最新活动价格,为不同需求的用户提供精准选购指南。
1390 2
|
3月前
|
安全 小程序 Java
互联网医院开发系统如何对接医保支付与电子处方平台
本文详解互联网医院落地核心难点:医保结算、电子处方流转与药品合规配送。通过实战架构设计、接口示例(含预结算/处方上传)、安全规范(CA签名、AES加密)及避坑指南,助你打通监管全链路,告别“线上咨询工具”,构建真正合规的互联网医院系统。(239字)
|
Java Apache
Apache PDFbox快速开发指南
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/9026439 Apache PDFbox快速开发指南 作者:chszs,转载需注明。
3313 0
|
算法 C语言
[C语言]Pow函数的实现
[C语言]Pow函数的实现
598 0
|
存储 分布式计算 大数据
大数据的工具都有哪些?
【10月更文挑战第9天】大数据的工具都有哪些?
1361 1
|
搜索推荐 算法 Shell
【算法】八种常见排序算法-总结
插入排序通过构建有序序列,对未排序的元素逐个进行插入的方式排序。 它从第二个元素开始,将其与已排序序列进行比较并插入到正确的位置,直到所有元素都被插入为止。
855 0
|
存储 缓存 前端开发
Servlet与JSP在Java Web应用中的性能调优策略
Servlet与JSP在Java Web应用中的性能调优策略
287 1
|
存储 关系型数据库 MySQL
关系型数据库mysql数据文件存储
【6月更文挑战第15天】
762 4