IO编程,相关概念

生产者-消费者工作模式:比如我们是生产者,麦当劳的服务员是消费者。

我们去买个汉堡,下了单之后,我就自己跑去干自己的事了;

服务员是消费者,他接到这个单,消化掉我们带来的这个需求,并告诉我们汉堡做好了,可以拿走了(同步,异步,回调,轮询)

这种工作模式的好处是,我们不用一直等着汉堡制作,可以去干其他的事。

所以生产者消费者模型,是适合用来做异步化或者业务解耦的

 

在IO编程中,就存在速度严重不匹配的问题。举个例子来说,比如要把100M的数据写入磁盘,CPU输出100M的数据只需要0.01秒,可是磁盘要接收这100M数据可能需要10秒,怎么办呢?

有两种办法:

  • 同步IO
    • CPU等着,也就是程序暂停执行后续代码,等100M的数据在10秒后写入磁盘,再接着往下执行,这种模式称为同步IO
    • 你去麦当劳点餐,你说“来个汉堡”,服务员告诉你,对不起,汉堡要现做,需要等5分钟,于是你站在收银台前面等了5分钟,拿到汉堡再去逛商场
  • 异步IO
    • CPU不等待,只是告诉磁盘,“您老慢慢写,不着急,我接着干别的事去了”,于是,后续代码可以立刻接着执行,这种模式称为异步IO
    • 你说“来个汉堡”,服务员告诉你,汉堡需要等5分钟,你可以先去逛商场,等做好了,我们再通知你,这样你可以立刻去干别的事情(逛商场)

 

想想看,你得知道什么时候通知你“汉堡做好了”,而通知你的方法也各不相同:

  • 回调模式:
    • 你什么都不用管,等着服务员跑过来找到你,告诉你“汉堡做好了。”
  • 轮询模式:
    • 你下单了一个汉堡包,服务员告诉你成功下单了,但是不告诉你什么时候去拿。这时候你自己每隔一分钟就去问一次,直到你去问的时候他说汉堡做好了,在此之前你每次去问他都告诉你汉堡还没好
    • 或者频繁一些的话,就是服务员告诉你汉堡还没好,话音刚落,你又问一次
    • 又或者这样,前台有N个服务员,你从0号服务员开始问,他告诉你还没好,你就问1号服务员,这样一直到N号,如果N号也告诉你还没好,你又从0号服务员开始问,这样一直循环,直到有个服务员告诉你汉堡好了

 

看起来,好像异步IO比同步IO性能好,但是也不是绝对的:

假设这样一个情况:几乎在你下单的同时,汉堡包就已经OK了。这时候你不是直接去拿,而是等对方的一个回调,这时候这个等待就带来了时间成本。

典型的情况就是AHCI和NVME的对比。

传统上,普通硬盘性能很低,CPU性能很高,这里面产生了巨大的性能落差,如果让CPU等硬盘,那CPU就浪费性能了。

但是,现在的NVME硬盘,有着跟内存几乎等同的性能,那异步相对于NVME硬盘的性能来说,反而带来了额外的回调等待过程开销。

 

ps:部分资料参考 廖雪峰的官方网站

posted @ 2017-11-29 12:07  _七杀  阅读(194)  评论(0编辑  收藏  举报