同步与异步,阻塞与非阻塞

所谓同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能完成,这是一种可靠的任务序列。要成功都成功,要失败都失败,两个任务的状态可以保持一致。而异步不需要等待被依赖的任务完成,只是通知被依赖的任务要完成使命工作,依赖的任务也立即执行, 只要自己完成了整个任务就算完成了。至于被依赖的任务最重是否真正完成,依赖它的任务无法确定,所以它是不可靠的任务序列。我们可以用打电话和发短信来很好地比喻同步与异步操作。同步就好比是打电话,只能一对一,一次只能和一个对象通话,结束之后才能进行第二个;异步就好比发短信,可以一次给多个人发,且不会立马得到结果。
          在涉及I/O处理时通常都会遇到是同步还是异步的处理方式的选择问题,因为同步异步的I/O处理方式对调用者的影响很大,在数据库产品中都会遇到这个问题,因为I/O操作通常是一个非常耗时的操作,在一个任务序列中I/0通常都是性能瓶颈。但是同步与异步的处理方式对程序的可靠性影响非常大,同步能够保证程序的可靠性,而异步可以提升程序的性能,必须在可靠性和性能之间保持平衡, 却没有完美的解决办法。

阻塞与非阻塞主要是从CPU的消耗上来说的,阻塞就是CPU停下来等待一个慢的操作完成以后,CPU才接着完成其他的工作。非阻塞就是在这个慢的操作执行时,CPU去做其他工作,等这个慢操作完成时,CPU再回过头来完成后续的操作。从表面上来看非阻塞的方式可以明显地提高CPU的利用率,但是也会增加线程数量,以及线程之间切换的增加,这些都会增加CPU的消耗。

下来来看一看,同步和异步以及阻塞与非阻塞之间的组合:

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

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

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

异步阻塞这种方式在分布式数据库中经常用到,例如,在一个分布式数据库中写一条记录,通常会有一份是同步阻塞的记录,还有2-3份会写到其他机器上,这些备份的记录就是采用异步阻塞的方式写I/O。异步阻塞对网络I/O能够提升效率,尤其像上面这种同时写多份相同数据的情况
异步非阻塞

这种组合用起来比较复杂,只有在一些非常复杂的分布式情况下使用,集群之间的消息同步机制一般用这个I/O组合方式。

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值