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:部分资料参考 廖雪峰的官方网站
站在此岸链接彼岸,用高配版的自己,来带动低配版的自己。