1.同步与异步

所谓同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才有可能完成(当然我们可以根据事务回滚、数据恢复等使之成为一种可靠的任务序列:要成功都成功,要失败都失败,两个任务的状态保持一致);异步不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务不需要等待其完成,即可立即执行,只要自己完成了整个任务就算完成了。至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠的任务序列。我们可以用打电话和发短信来比喻同步与异步操作。

2.阻塞与非阻塞

阻塞与非阻塞主要是从CPU的消耗上来说的,阻塞就是CPU停下来等待一个慢的操作完成以后,CPU才接着完成其它的事。非阻塞就是在这个慢的操作执行时CPU去干其他别的事,等这个慢的操作完成时,CPU再接着完成后续的操作。虽然表面上看非阻塞的方式可明显提高CPU的利用率,但是也带来了另外一种后果,就是系统的线程切换增加。增加的CPU使用时间能不能补偿系统切换成本需要好好评估。

3.两种方式的组合

组合的方式有四种:分别是同步阻塞、同步非阻塞、异步阻塞、异步非阻塞。

-------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

组合方式        |                                                               性能分析

-------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

同步阻塞        |    最常用的一种用法,使用也是最简单的,但是I/O性能一般很差,CPU大部分处于空闲状态

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

|     提升I/O性能的常用手段,就是讲I/O的阻塞改成非阻塞方式,尤其在网络I/O是长连接同时传输数据也不是很多的情况下,提升性能非常有效

同步非阻塞  |     这种方式通常能提升I/O性能,但是会增加CPU消耗,要考虑增加的I/O性能能不能补偿CPU的消耗,也就是系统的瓶颈实在I/O还是在CPU上。---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

异步阻塞      |     这种方式在分布式数据库中经常用到,例如,在一个分布式数据库中写一条记录,通常会有一份同步阻塞的记录,而还有两至三份备份记录

|     写到其它机器上,这些备份记录通常都采用异步阻塞的方式写I/O。

|     异步阻塞对网络I/O能够提升效率,尤其像上面这种同时写多份相同数据的情况。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

异步非阻塞  |     这种组合方式用起来比较复杂,只有在一些非常复杂的分布式,集群之间的消息同步机制一般采用这种I/O组合方式。

|     它适合同时要传多份相同的数据到集群中不同的机器,同时数据的传输量虽然不大但是却非常频繁,这种网络I/O用这个方式性能达到最高。

---------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

举例:

同步阻塞IO

你去一个银行柜台存钱。首先,你会将存钱的单子填好,然后交给柜员。这里,你就好比是application,单子就是调用的 system call,柜员就是kernel。提交好单子后,你就坐在柜台前等,相当于开始进行等待。柜员办好以后会给你一个回执,表示办好了,这就是 response。然后你就可以拿着回执干其它的事了。注意,这个时候,如果你办完之后马上去查账,存的钱已经打到你的账户上了。后面你会发现, 这点很重要。
同步非阻塞IO

这次不是去银行存钱,而是去银行汇款。同样的,你也需要填写汇款单然后交给柜员,柜员进行一 些简单的手续处理就能够给你回执。但是,你拿到回执并不意味着钱已经打到了对方的账上。事实上,一般汇款的周期大概是24个小时,如果你要以存钱的模式来 汇款的话,意味着你需要在银行等24个小时,这显然是不现实的。所以,同步非阻塞IO在实际生活中也是有它的意义的。
异步阻塞IO

比如说一个银行柜台,现在有10个人想存钱。按照现在银行的做法,一个个排队。第一个人先填存款单,然后提交, 然后柜员处理,然后给回执,成功后再轮到下一个人。大家应该都在银行排过对,这样的流程是很痛苦的。如果按照异步阻塞的机制,10个人都填好存款单,然后 都提交给柜台,提交完之后所有的10个人就在银行大厅等待。这时候会专门有个人,他会了解存款单处理的情况,一旦有存款单处理完毕,他会将回执交给相应的 正在大厅等待的人,这个拿到回执的人就可以去干其他的事情了。而前面提到的这个专人,就对应于select函数。
异步非阻塞IO

比如银行存钱。现在某银行新开通了一项存钱业务。用户之需要将存款单交给柜台,然后无需等待就可以离开了。柜台办好以后会给用户发送一条短信,告知交易成功。这样用户不需要在柜台前进行长时间的等待,同时,也能够得到确切的消息知道交易完成。

参考:http://blog.csdn.net/historyasamirror/article/details/4270633  及 JavaWeb技术内幕一书

转载于:https://www.cnblogs.com/bbsno1/p/3265334.html

IO-同步、异步、阻塞、非阻塞相关推荐

  1. 聊聊对不同I/O模型的理解 (阻塞/非阻塞IO,同步/异步IO)

    一.关于I/O模型的问题 最近通过对ucore操作系统的学习,让我打开了操作系统内核这一黑盒子,与之前所学知识结合起来,解答了长久以来困扰我的关于I/O的一些问题. 1. 为什么redis能以单工作线 ...

  2. 异步就是异步,根本就没有 异步非阻塞IO这个说法。阻塞 非阻塞,同步I/O 异步I/O 的区别

    先给大家安利一下这个 https://www.ibm.com/developerworks/cn/linux/l-async/ 里面关于 异步非阻塞IO 是错的. 异步就是异步,别扯 异步阻塞 异步非 ...

  3. Java网络编程------IO模型的同步/异步/阻塞/非阻塞(1)

    IO模型的同步/异步/阻塞/非阻塞 一.同步/异步/阻塞/非阻塞 1.同步和异步 2.阻塞和非阻塞 3.同步.异步和阻塞.非阻塞组合 二.IO 1.I/O 2.阻塞IO和非阻塞IO 3.同步IO和同步 ...

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

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

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

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

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

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

  7. 异步同步、阻塞非阻塞、异步回调、线程队列和协程

    今天学习了异步同步.阻塞非阻塞.异步回调.线程队列和协程 一.异步同步和阻塞非阻塞 线程的三种状态: 1.就绪 2.运行 3.阻塞 阻塞:遇到了IO操作  代码卡住  无法执行下一行  CPU会切换到 ...

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

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

  9. 迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章

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

  10. python阻塞和非阻塞_Python基础必备知识:同步异步阻塞非阻塞

    一.状态介绍 在了解其他概念之前,我们首先要了解进程的几个状态.在程序运行的过程中,由于被操作系统的调度算法控制,程序会进入几个状态:就绪,运行和阻塞. 就绪(Ready)状态:当进程已分配到除CPU ...

最新文章

  1. MongoDB 正则表达式
  2. Gartner 企业级网络设备市场份额报告:阿里云负载均衡增速全球第一
  3. 第58课 百钱买百鸡(完整) 3.完善程序 (《小学生C++趣味编程》)
  4. javascript闭包原理
  5. java tld 方法重载_自定义标签
  6. call和apply;this;闭包
  7. 【NLP】XLNet详解
  8. Android 四大组件学习之Server一
  9. 天闻角川超人气IP「画猫·雅宋」数字藏品限量开售!
  10. 如何显示隐藏文件和文件扩展名
  11. 我和宁夏日报 【白述礼】
  12. 使用OpenSER构建电话通信系统——第一章(2)
  13. 一、Azure Kinect 传感器 SDK 下载——Azure Kinect DK入门
  14. Linux用户管理安全宝典:密码防破解与帐号文件保护
  15. 【学习笔记】kaggle案例之泰坦尼克号(基于R)
  16. 靶机、软件搭建:05---Burp Suite工具的安装与使用(Windows环境)
  17. 离线地图for SQLite
  18. 了解流式加密(CK)(二)
  19. web端 刷卡器_web端专用读卡器/网页版专用读卡器
  20. 怎么显示文件扩展名即后缀

热门文章

  1. Apache Solr 全文检索概述 与 Win10 下安装 Solr
  2. 小D课堂 - 零基础入门SpringBoot2.X到实战_第2节 SpringBoot接口Http协议开发实战_10、常用json框架介绍和Jackson返回结果处理...
  3. 音视频重新封装的流程
  4. JavaScript继承方式详解[转]
  5. UIScrollerView ,UIPageControl混搭使用,添加定时器,无限循环滚动
  6. 软件自动化测试学习步骤
  7. C++/C学习笔记(二)
  8. 设计模式(1)-- 七大软件设计原则-开闭原则
  9. Spring转换编码utf-8方式
  10. ssh登录失败处理步骤