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

 

1.同步与异步数据库

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

2.阻塞与非阻塞app

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

3.两种方式的组合分布式

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

-------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------性能

组合方式        |                                                               性能分析spa

-------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.net

   同步阻塞        |    最经常使用的一种用法,使用也是最简单的,可是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技术内幕一书

相关文章
相关标签/搜索