`
mywebcode
  • 浏览: 988096 次
文章分类
社区版块
存档分类
最新评论

IO-同步、异步、阻塞、非阻塞

 
阅读更多

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技术内幕一书

分享到:
评论

相关推荐

    IO中同步、异步与阻塞、非阻塞的区别

    本文主要讲了IO中同步、异步与阻塞、非阻塞的区别。希望对你的学习有所帮助。

    网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

    网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

    网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO.pdf

    同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non...

    同步与异步--阻塞与非阻塞型IO

    这篇文章里,简单而且形象的介绍了同步于异步——阻塞与非阻塞的知识。希望可以帮助大家

    同步、异步、阻塞、非阻塞的区别

    讲述同步、异步、阻塞、非阻塞的区别,通俗易懂,是我见到的最口语话最清晰的材料,文中比喻恰当,深入浅出。

    JAVA IO同步,异步

    介绍了基于系统底层通信技术socket,JAVA IO同步,异步,阻塞,非阻塞;

    同步异步阻塞非阻塞I/O思维导图

    同步异步,阻塞非阻塞,I/O学习总结的思维导图,需要结合Richard Stevens的书来学习

    2-Socket阻塞与非阻塞,同步与异步、IO模型-120412发布1

    1. 同步,就是我客户端(c端调用者)调用一个功能,该功能没有结束前,我(c端调用者)死等结果 2. 异步,就是我(c端调用者)调用一个功能,不需要知道该功能结

    C++ boost::asio编程-同步TCP详解及实例代码

    boost.asio库是一个跨平台的网络及底层IO的C++编程库,它使用现代C++手法实现了统一的异步调用模型。 boost.asio库支持TCP、UDP、ICMP通信协议。 下面介绍同步TCP模式: 大家好!我是同步方式! 我的主要特点...

    同步与异步IO、阻塞与非阻塞IO

    很多时候我们常常看到同步与异步,阻塞与非阻塞的出现。有的地方直接将同步与阻塞画上了等号。异步与非阻塞画上了等号。事实上这是不对的。同步不等于阻塞,而异步也不等于非阻塞。下面就来仔细的看看同步与异步、...

    详解socket阻塞与非阻塞,同步与异步、I/O模型

    socket阻塞与非阻塞,同步与异步 1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步: 所谓同步,就是在c端发出一个...

    高性能IO模型浅析

    (2)同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。注意这里所说的NIO并非Java的NIO(New IO)库。 (3)IO多路复用(IO Multiplexing):即经典的Reactor...

    Icicle具有协同程序非阻塞IO和多线程的异步库

    Icicle - 具有协同程序,非阻塞I / O和多线程的异步库,一个PHP库,用于使用同步编码技术来编写异步代码

    socketjava源码-demo-sockets-io-nio-nio2:“Java套接字I/O:阻塞,非阻塞和异步”文章和源代码

    socket java原始码Java套接字I ...非阻塞-套接字的一种属性,当检测到所请求的动作没有未知的延迟就无法完成时,套接字的调用将立即返回。 同步I / O操作-导致请求线程被阻塞直到该I / O操作完成的I

    Python之进程+线程+协程(异步、selectors模块、阻塞、非阻塞IO)

    本篇文字是关于IO多路复用的更深入一步的总结,上一篇Python之进程+线程+协程(事件驱动模型、IO多路复用、select与epoll)对IO多路复用进行了概念性的分析,本篇则是对阻塞IO、非阻塞IO、与异步进行通俗性的比较和...

    使用协同路由的同步异步_Synchronous asynchrony using coroutines_C+

    小型但高效的库,用于以同步方式执行异步操作(“async”->“Synca”)。该方法大大简化了有效IO和CPU密集型应用程序或其他非平凡并发算法的编写。该库演示了如何使用协同例程来实现所描述的简化。...非阻塞异步通道。

    linux io 模型

    linux io模型,区分阻塞非阻塞同步异步的概念,从底层理解io。

    浅谈Node 异步IO和事件循环

    查阅资料的时候, 发现很多人都对 异步和非阻塞 的概念有点混淆, 其实两者是完全不同的, 同步异步指的是 行为即两者之间的关系 , 而阻塞非阻塞指的是 状态即某一方 。 以前端请求为一个例子,下面的代码很多人都...

    异步HttpClient

    该组件是单线程非阻塞式的,类似于JS中的ajax请求。都使用单线程异步回调的方式。目前该组件已经初步测试通过。如果大家也需要这样的组件,可以下载尝试一下。所有关键注释都已经写了,如有不明白可以发送邮件 ath....

    11.异步IO1

    第十一章 异步 IO这里要说的异步 IO 准确的说应该叫“信号驱动的异步 I/O”,也可以成为异步通知。前面两章说的阻塞和非阻塞 IO,他们都是同步 IO,需要

Global site tag (gtag.js) - Google Analytics