前言
前面自己花了一点时间研究了 InnoDB 方面的知识,对于数据库来说,最重要的两个特性,一个是性能,一个是可靠性。MySQL 解决可靠性问题上主要是采用 Write Ahead Log (WAL) 技术,而性能上主要是通过 Buffer Pool 缓冲池使用异步写库。
对于存储方面比较感兴趣,所以计划进一步深入了解一下。内容主要来自《深入理解计算系统 第六章 存储器层次结构》
概念
存储器系统
CPU 是计算机的中央处理器,而 CPU 的计算数据则需要来自某个系统,那个系统就是存储器系统。存储器系统是一个具有不同容量、成本和访问时间的存储设备的层次结构。
这里有一个原则,假如希望程序执行得更快,最好就将数据项存储在较高的层次中。
RAM
最接近 CPU 的存储器是:随机访问存储器(Random-Access Memory),这个存储器又分两种:
- 静态RAM (SRAM) ,这种存储很快,同时也很贵,一般只会用于 CPU 的高速缓存存储器
- 动态RAM (DRAM) ,相比于 SRAM,这种存储会慢一点(相差10倍),一般用于主存
DRAM
DRAM 就是一般情况下,我们说的主存,样子大概是下面。

从图片中,可以看出每个主存都会有8块,每一块我们称之为一个芯片,每个芯片会被划分为d个超单元,而每个超单元会保存w位数据。我们可以先假设每个w值为8,即:每个超单元存储的数据为8位。
DRAM芯片的超单元寻址过程
在一块肉眼可见的芯片上,超单元是如何被排列的呢?答案是按照一个r行c列的长方形矩阵排列的。
从图片看到,存储器的物理性质就是一个长方形,事实上,内部的设计也是。每个超单元都会定义为一个r行c列的长方形矩阵。也就是我们要对一个超单元获取信息(8bit),至少需要输入两个值:r和c值。具体的过程是这样的:先输入r值,芯片读出一行的数据保存在内部行缓冲区,然后再读入c值,从内部行缓冲区读取指定超单元的值。
分两步读数据的好处,是减少物理地址引脚的数量,坏处就是两次发送地址,降低访问速度。
上述一个芯片可以寻找8bit的数据,8个芯片对一个地址进行寻址,就可以获得64bit的数据,这就是计算机系统所说的64位寻址数据。这时候,一个芯片组组成的硬件,我们可以称之为:内存模块(memory module)
磁盘
磁盘是大部分 PC 机用于存储数据且不易失的介质,速度上一般比 DRAM 慢10万倍(旋转机械磁盘),但容量也可以达到数TB。目前常用的磁盘也可以分两种:
- 旋转磁盘(ratating disk),具有盘片的传统磁盘
- 固态磁盘,没有移动部分,是基于闪存的磁盘
机械磁盘为什么这么慢?
机械磁盘访问写入慢,这个结论大家都清楚,但为什么慢呢?这个也值得深究一下。
磁盘以扇区大小的块(一般是512字节)来读写数据。对扇区的访问时间 access time主要由三个部分组成
- 寻道时间
- 旋转时间
- 传送时间
寻道时间是指:传动臂将磁头移动到目标磁道所需要的时间,成为寻道时间 seek time。现代的磁盘(2015年),平均的寻道时间是3-9ms,其中最大的寻道时间可以高达20ms。
旋转时间是指:当磁头移动到目标磁道后,要等待一次旋转到目标扇区,这里最短的就是磁头刚好落在目标扇区上,最坏刚好错过目标扇区。这里的平均耗时是旋转半圈的耗时。
传送时间是指:当磁头落在目标扇区后,开始读取数据的过程。
PS:
- 访问磁盘数据中,寻道时间和旋转时间是占大部分时间的,读的数据是存储在连续扇区时,完成寻道和旋转后,读取数据的时间几乎可以忽略不计。这是为什么各个程序都声称顺序写比随机写快很多。因为寻找第一个字节的时间和读取时间的时间比例可以达到:700比1(在一个RPM为7200转的硬盘上)
查看书本会有更详细的演算过程。《深入理解计算机系统》P410页 第三版
逻辑磁盘块
磁盘的构造是比较复杂的,为了更好地向操作系统提供服务,磁盘本身会屏蔽磁道、扇区等逻辑,转而向操作系统提供逻辑块的操作概念。提供这个概念的是磁盘控制器,它负责维护逻辑块号和磁盘扇区之间的映射关系。
操作系统只会向磁盘读取逻辑编号为B的扇区数据,然后磁盘控制器会根据逻辑块号B映射到x盘面y磁道z扇区(x,y,z),进而读取到控制器上的缓冲区,再通过总线复制到主存中。
磁盘的数据如何被加载?
当一个程序需要读取磁盘某个文件时,应该如何加载?要解释这个步骤,先要知道 CPU 总是用一种内存映射I/O的技术向IO设备发命令,内存上这个地址成为IO端口,具体步骤可以如下:
- CPU 把(命令、逻辑块号、目的内存地址)写到磁盘的
IO端口中 - 磁盘控制器通过总线监听到
IO端口的数据,便会响应这个指令,读取数据,并写到目的内存地址上 - 磁盘控制器完成读取后,会发一个
中断(Interrupt)给CPU,CPU内核响应后,通知程序继续运行。(这里就可以延伸出IO的类型了,问题:思考一下为什么磁盘有没有IO多路复用的概念,没有是为了什么?至此埋下一些伏笔先)
固态硬盘
固态硬盘是基于闪存读写的一种非易失的存储介质。其顺序读写性能和随机读写性能已经相差不大了,固态硬盘是以页为单位进行读写的,磁盘的读写单位为扇区,而固态硬盘的读写单位则是页(512byte~4KB),多个页组成一个块(16KB~512KB)。固态硬盘在读写过程中会伴随着块的擦除,当进行过10W次重复写,该块就会损坏了。
后记
下一次多增加一些图片说明。