印象系列-磁盘和内存的基本认识

2,573 阅读8分钟

如果问起内存和磁盘的区别,我相信大部分开发者都会列举一二。事实确实这样,最近在团队的一次内部分享上,四五位同学说出了不同的答案:内存存储速度快、磁盘容量大、磁盘可保存长久数据、磁盘体积比较大~

当然了,这都是对的,但任何问题应该抛开表象探究背后原因,当我问到为何大部分计算机的磁盘容量都很大、为何磁盘的存储速度就是慢、为何磁盘可保存长久数据,甚至,为何磁盘的体积就是非得那么大呢?不是每个人都能清楚地说出原因,甚至对这两种存储器并不敏感,不知从哪个角度解答!尽管大部分人平时在开发过程折腾着机器都会涉及到这两样东西,下面来分享下我的一些理解,希望在整体上能体会到一些细节和特性。

内存(DRAM )作为一种易失性存储器在断电情况下是不能保存数据的,这是因为内存本身是通过电容来实现二进制位的存储,每一个位的电容都非常小,只不过内存制造的非常密集所以可以保存很多位。一个位就是一个bit,每个位在内存里面都称作一个内存单元,整体的构造可简化成如下图所示:


注意看图中的网格区域,这是内存单元的编排方式,简单说就是一个二维矩阵,我们假设现在有一个内存非常小,它被分割成16个超单元,超单元这东西又包含了8个内存单元,那么可以知道这个内存最大可保存16*8=108bit的信息。

那么如何实现数据的读写呢?

图中存储控制器和内存单元块中间标明了addr的地址线,上面的数字2表示有两条,两条地址线在实际过程中会通过发送0、1信号来标识地址信息。

如果想指定内存矩阵某一行某一列的超单元时,存储控制器就会分两次对addr线发送电信号。这两次分别指定了目标超单元的行地址和列地址,比如第一次发送中第一二两条地址线分别发送了0、1的电信号,那么就是01的值,指定内存矩阵中的第二行(注意第一行数值是0),随即第二次发送中第一二条地址线分别发送了一个1、1的电信号,就是11的值,指定第四列的数据,最终就是指定了第一行第四列的超单元。存储控制器再对这个超单元的数据进行读写操作。

内存的数据又该如何传送呢?

大家可能已经注意到了图中标示data的双箭头,上面的数字8表示有8根数据线,说明该内存每一次读写最多能传递8bit,也就是一个字节的信息。具体的细节可以不用做进一步探究,反正我们只需知道内存的构造中正是通过地址线和数据线连接到二维的矩阵单元中实现读写操作的。

上面就是我想分享的关于内存的一些基本印象,这个印象首先对我来说就是,内存在读写和存储过程中都离不开电。在内存持续的运行当中,我脑海里就是无数电流在内存芯片快速流动着,大家要知道电的速度可是和光一样的。

磁盘(硬盘)作为一种非易失性存储器适合资料的长久存储,要理解长久保存的原因同样需要从磁盘构造开始了解。

为了简化说明,我用光驱来做个示例,我们知道光驱读取数据时会有一个激光头对准光盘,播放光盘的过程中伴随着光盘的不断旋转。其实磁盘的数据读取过程就类似这种操作,光盘的盘面通过凹下去的坑的变化记录二进制信息,激光会对准光盘的某个扇区,旋转中的光盘带来了位置的变化,从而激光头可以对准光盘盘面的不同区域,实现所有数据的读取。

在这里,必须理解扇区、磁道的概念,下图是磁盘的一个盘面,可辅助各位建立磁盘的第一印象:


大家可以对光盘外形的理解转移到磁盘上去,如上图,磁盘的盘面可理解为很多不同半径的磁道一环环组成的,每个磁道就是空心圆,这个圆又由多个扇区组成,扇区就是磁盘保存数据的最小单位(一般为512字节),所以一个盘面就包含了很多这样的扇区。

光盘是通过上面悬浮的激光头对准着扫描读取的,磁盘也有这么个类似的东西,同样对准着磁盘,如下图:


磁盘上方有一个传动臂,传动臂末端就是读写头(类似于光盘的激光头),传动臂可在水平上调整不同角度摆动,而磁盘可以在一定速率下进行旋转,这两个特性非常重要,下面会联系读写过程进行说明。

那么磁盘的数据读写过程是怎样的呢?

联系上文我们知道内存通过电信号和电流对内存单元进行定位和数据传送,整个物理过程是电的变化。而磁盘就不一样了,如果想读取磁盘的某个数据,一定要先确定目标地址(扇区位置),然后让读写头定位到这个扇区的起始位置处。

注意了,读写头如何定位到目标扇区的位置呢?

通过磁盘盘面的构造我们知道,首先要通过控制传动臂的角度确定目标扇区在哪个磁道上,然后让磁盘旋转一定角度,使得最终的目标扇区刚好停在读写头的正下方,这样的一系列过程我们称为机械运动(所以知道为什么很多人把普通硬盘称为机械硬盘了吧?),当磁盘要进行很多读写操作时,如果目标数据分布在盘面不同位置的扇区上,那么这个过程需要传动臂不断调整角度,不断旋转磁盘,由于都是机械过程,所以磁盘的读写瓶颈就出现在这里了。

在实际的磁盘中往往不止一个盘片,而是多个盘片在垂直角度上叠加的,如下图:


每个盘片都有两个盘面,对应都配有读写头,但这不妨碍我们只针对一个盘面来理解磁盘的读写过程。

好了,上面就是本次分享的对内存和磁盘的构造的基本理解,有了这么个印象我相信回到文中开头的几个问题,或许能给出更根本的解释。比如,内存存储速度快是因为这个过程是电传输的过程,电的速度很快,而磁盘的读取是机械过程,本身具有很大的限制;磁盘容量大是因为磁盘通过磁性材料保存数据,适合长久保存数据,同时也决定了制造成本更低,在当前环境下相对经济,而内存成本较高,适合作为数据高速缓存的角色。磁盘体积较大是由磁盘的构造方式决定的,有多个盘面还有传动臂,需要做机械运动,再精细的磁盘也有一定的空间要求。

其实分享这个主题,只是想给开发者一个体会,就是对数据存储成本具备敏感性。现在的计算机CPU已经很强大了,计算速度超越了我们的一般理解,但在I/O这块的速度并没有大幅提高,现在很多项目的处理瓶颈其实就是出现在这块。通过文中理解,我们能认识到频繁从磁盘操作数据是怎样的一个物理过程,这个过程能自动在脑海给我们一种警示:机械运动实在是太慢了。所以后续的很多优化其实都是在减少磁盘I/O,无论技术多么牛逼,这个主题在很长一段时间都会被拿来讨论。