在讨论这个问题之前,我们先来了解一个概念I/O。简单来说I/O就是输入/输出(Input/Output),小至我们的手机,电脑,大至整个互联网,所有的设计都离不开I/O。I/O在电子信息的世界里负责信息的传递,就如同我们的吸气、呼气一般平常而又不可或缺。广义上来讲,它并不仅限于在计算机世界使用,形象点说,如果大脑是CPU,I/O设备在人与人之间的交流中扮演着类似嘴巴和耳朵的作用:嘴巴是输出设备,负责输出经过大脑思考后的各种信息,耳朵则是输入设备,用于接收各种各样的信息,传递给大脑。
作为一个APP来讲,如果抛开里面的逻辑部分,APP所做的事情就是将用户的输入内容写入内存,从内存写入硬盘,或是将硬盘的内容读入内存,再通过输出设备展现给用户。一个APP能否将这整个过程流畅的完成是衡量这个APP质量好坏的重要标准。
就目前的技术发展而言,CPU的处理能力已经非常强大,我们日常使用的APP所需要处理的逻辑部分对CPU来说完全算不上负担,但是我们的硬盘,网络的读取速度却远远跟不上CPU(网络也是一个巨大的I/O系统,你可以想象成你的个人设备通过有线或者无线的信号连接到了因特网的巨大硬盘上,只是你不知道硬盘放在哪里)。
I/O速度上,内存>硬盘>网络。为了减小这种速度上的差异,在APP设计乃至硬件设计时都会设置缓存。我们在说到缓存时,并不是指设备上的某个具体硬件,它是硬件和软件设计的一种策略。
缓存对我们来讲比较熟悉的就是在线视频了,爱看的电视剧缓存个几集,便于随时拿出来看。这里的缓存实际就是指下载下来存到本地。
那是否我没有存下来的需求就不需要缓存呢?不是的。因为网络环境差异大,且不是足够稳定,所以一般的视频APP在设计时,会在用户播放的同时也预先下载一部分到本地作为缓存的文件,这样在网络发生波动时(如短暂的网络连接异常),可以通过读取缓存文件保持播放的连续性,用户则不会感觉到视频的卡顿。这是一个解决网络I/O和本地I/O速度差距例子。不仅网络和本地设备存在I/O速度差,设备内部组件之间也是如此,虽然内存已经足够快了,但是内存跟CPU之间还是需要高速缓存来弥补二者速度上的差距。
一个程序在运行时,会进行各种I/O操作,可能要从网络中获取一些数据,可能要对数据库进行读写,可能需要加载用户硬盘上的图片,虽然I/O操作看起来比较简单,但程序在实际处理时还是会遇到很多问题。I/O设备存在独占和共享的问题,例如正在播放音乐的时候来电话了怎么办?I/O操作也存在各种各样的顺序问题,例如在一个文件既要被读取,也要被写入怎么办?如果不对各种I/O操作做优化处理,即使CPU很空闲,内存也很充足,也会引起各种卡顿问题(当然不仅仅只是卡顿)。
登录 | 立即注册