最近在招聘中,发现不少人对BIO、NIO、AIO等理解非常模糊,觉得有必要写文章来纠正下很多人的误解。
在谈这些之前,非常有必要先介绍下Unix 5种IO模型:
阻塞:
阻塞是最常用的IO模型,默认情况下所有的文件操作都是阻塞的。以套接字编程为例。在进程空间中调用recvfrom,其系统调用直到数据报文到达且被拷贝到应用程序进程的缓存区(或者发生错误)后才返回,期间一直在等待。进程在从调用recvfrom开始到它返回的整段时间内是被阻塞的。有一张很经典的图:

非阻塞:
调用recvfrom从应用层到内核的过程中,如果该缓冲区没有数据的话,则直接返回一个EWOULDBLOCK的错误,一般会轮询的进行检查状态,看内核空间有没有数据来。直到有数据,最后完成拷贝。如下图:

IO多路复用:
Linux系统提供的select/poll/epoll,进程将一个或者多个FD(文件描述符)传递给一个或者多个poll/select系统调用,阻塞在select。select和poll可以帮助侦听很多的FD是否准备就绪。但是,select和poll是顺序扫描去检查FD的就绪状态,效率比较低,而且支持的FD数量有限(没记错的话,默认好像是1024还是2048,具体记不清)。而epoll是通过事件驱动的方式,当有FD准备就绪的时候,立即回调函数rollback。如图:

谈到epoll,不得不提一个经典的问题,apache和nginx的对比,为什么nginx比apache效率高很多,这就是根本的原因。
信号驱动:
这种模型在实际应用的非常少,这里不做过多介绍,可以看图:

异步:
告知内核启动某个操作,并让内核在整个操作完成后(包括将数据从内核空间拷贝到自己的缓冲区)通知。异步IO的主要特点是完成操作后主动通知。如图:

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

也谈阻塞、非阻塞、同步、异步相关推荐

  1. 浅谈阻塞/非阻塞、同步/异步——从linux read()系统调用出发

    浅谈阻塞/非阻塞.同步/异步 –从linux IO系统调用出发 阻塞与非阻塞主要从进程/线程的角度出发: 阻塞(blocking):教科书年年考的概念--调用方(主线程)发起调用之后挂起直到被调用方法 ...

  2. NIO详解(二): BIO 浅谈 同步 异步与阻塞 非阻塞

    在我们了解Java NIO/BIO的网络通信之前,我们先了解一下常用的阻塞/非阻塞模型以及同步/异步的概念 一.阻塞和非阻塞 从简单的开始,我们以经典的读取文件的模型举例.(对操作系统而言,所有的输入 ...

  3. 同步/异步阻塞/非阻塞

    平时开发中经常会听大家说到什么同步阻塞.异步非阻塞等等名词,这里我谈下自己对这两个名词的理解,仅仅是个人观点,并不一定正确. 1.阻塞/非阻塞 我认为判定阻塞还是非阻塞,取决于线程所做的操作是否需要将 ...

  4. 什么是同步异步?阻塞非阻塞?

    什么是同步异步?什么是阻塞非阻塞? https://mp.weixin.qq.com/s/3c-NfdRZYu60VmMpR4vvTg 自从发布<你管这破玩意叫 IO 多路复用>之后,我发 ...

  5. python进阶04IO的同步异步,阻塞非阻塞

    原创博客地址:python进阶04IO的同步异步,阻塞非阻塞 同步和异步 同步和异步关注的是消息通信机制. 所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回.但是一旦调用返回,就得到 ...

  6. 异步通知是什么意思_一次相亲经历,我彻底搞懂了阻塞非阻塞、同步异步

    看到标题,可能你会想,相亲跟阻塞/非阻塞,同步/异步有啥关系,这个逗b不知道在想什么东西.不要急,且听我慢慢道来 年纪大了,一回家七大姑八大姨就各种催婚,都说要给我介绍女朋友.这不,刚刚门口,我的大姨 ...

  7. 15分钟读懂进程线程、同步异步、阻塞非阻塞、并发并行,太实用了!

    作者:Martin cnblogs.com/mhq-martin/p/9035640.html 基本概念 1 进程和线程 进程(Process): 是Windows系统中的一个基本概念,它包含着一个运 ...

  8. 迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)...

    常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTTP接口拿到详情数据,然后使用适合的视图展示详情数据. 如果网速很慢,代码发起一个HTTP请求后,就卡住不动了,直到十几秒后才拿到HTT ...

  9. 同步 异步 阻塞 非阻塞概念区分

    老张爱喝茶,废话不说,煮开水. 提前剧透一下:同步和非同步主要用来形容被调用线程,阻塞非阻塞用来形容主线程的. 出场人物:老张(主线程),水壶(被调用线程)两把(普通水壶,简称水壶:会响的水壶,简称响 ...

  10. 【面试】迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)...

    网上有很多讲同步/异步/阻塞/非阻塞/BIO/NIO/AIO的文章,但是都没有达到我的心里预期,于是自己写一篇出来. 常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTTP接口拿到详情数 ...

最新文章

  1. centos7 python3.7 ssl_centos6.8安装python3.7无法import _ssl的解决方法
  2. [Overleaf] -带你初识Latex神器.快速上手.更新中...
  3. Hibernate三大组成部分
  4. HTTP basic auth
  5. 机房管理系列之杀毒服务器维护
  6. MySQL utf8mb4字符集配置,支持emoji表情存储
  7. kickstart-F
  8. 两台计算机怎样互相访问文件,两台电脑之间怎么互相传文件
  9. 使用video speed controller给视频加速
  10. html怎么用excel打开乱码,excel打开是乱码,教您excel打开是乱码怎么办
  11. 12c 新特性-统一审计(Unified Auditing)
  12. 2022年全球市场燃气烧烤架总体规模、主要生产商、主要地区、产品和应用细分研究报告
  13. 公募“一哥”王亚伟已在深圳前海低调复出
  14. 微信|QQ扫码登录网页版二维码失效问题解决方案 网站无法访问PC网页版如何解决 安卓软件历史版本下载 FV fooview悬浮球帮助教程
  15. linux中zip文件解压命令,Linux中zip压缩和unzip解压缩命令使用方法
  16. excel 表中几个关联汇总函数
  17. 实验二——网络嗅探与欺骗.
  18. 七麦研究院首发AR产品数据报告,数读App Store上的AR世界
  19. 短信验证码平台哪家性价比最好?最稳定?
  20. Tiger VC DAO打造去中心化VC,为NFT、DAO带来新叙事

热门文章

  1. 大聊Python----Select解析
  2. Jenkins里的Crumb
  3. 飞腾笔记本/银河麒麟桌面操作系统键盘无法使用
  4. 行政区划代码2020(SQL)--(下)
  5. 猫小胖服务器位置,最终幻想14新增猫小胖大区拆分陆行鸟大区-最终幻想14国服大区调整计划公布!-Appfound...
  6. 【附代码实现】光流法大全(DeepFlow、DenseFlow、DisFlow、FbFlow、PCAFlow、SimpleFlow、TV_L1)
  7. 用Java开发50个棋类游戏
  8. Balsamiq Mockups注册码
  9. 我,在日本开密室逃脱,钱还没赚,人进“橘子”了……
  10. Mysql必知必会概要总结