#硬盘 #计算机组成
1. 简介
固态硬盘(Solid State Drive 即SSD)是指用固态电子存储芯片阵列而制成的硬盘,由控制单元和存储单元(FLASH芯片、DRAM芯片)组成。相比起传统硬盘,它没有磁头,马达,磁盘等一系列的零件,搭载NAND Flash芯片作为存储介质,在运行速度,功耗,轻便等方面是传统硬盘所无法比拟的。
- 优点:读写速度快;防震抗摔性;低功耗;无噪音;工作温度范围大;轻便。
- 缺点:容量小;寿命有限;售价高
2. 固态硬盘结构
- 主控:一种嵌入式微芯片,SSD的大脑,负责发出SSD工作所需的所有指令。
- NAND闪存:SSD中存储数据的地方。
- DRAM:内存,存储SSD中的地址映射等信息。
2.1 NAND闪存
一个固态硬盘上有多个NAND闪存,主控通过若干个通道并行控制多个NAND闪存,大大提高底层的带宽。NAND闪存(即Flash)由多个Block组成,一个Block内部又有多个Page(物理页),Page里才是我们保存的数据。
- Flash的特性一:Page是SSD存取数据的最小单位,每次存取数据至少是一个Page,每个page的大小为4k或者8k。
- Flash的特性二:Page可以被读写,但是不能被覆盖,数据只能被写入到空Page中,如果要使用有数据的Page则必须先清空Page中的数据。但Page是不能被单独清空的,Flash清空操作的最小单位是Block,即每次清空至少一个Block。
3. 固态硬盘工作原理
3.1 基础知识
3.1.1 mapping table
在SSD中,一般会维护一个mapping table,维护逻辑地址到物理地址的映射。每次读写时,可以通过逻辑地址直接查表计算出物理地址,与传统的机械磁盘相比,省去了寻道时间和旋转时间。机械硬盘定位数据的时间大约在几毫秒到十几毫秒左右,而固态硬盘定位数据只需要约0.1ms左右,所以在随机读写上固态硬盘的速度远远高于机械硬盘。
3.1.2 Over-Provisioning
Over-Provisioning 是指SSD实际的存储空间比可写入的空间要大。比如一块SSD实际空间128G,可用容量却只有120G。之所以要这样设计是因为SSD数据擦除的最小颗粒度是Block,当出现只需要擦除单个Page的情况时,为了保护Block内其他Page上的数据,需要把他们迁移到一个空的Block中。如果没有多余的Block,则无法完成这个操作。为了保证SSD在任何情况下都能提供数据擦除的能力,必须要多预留一些空间。
3.2 读写原理
3.2.1 写入流程
SSD的写入流程根据Page中是否有数据而分为新写入和覆盖写。
新写入流程
新写入流程很简单,可以分为三步。
- 找到一个空闲的Page
- 把数据写入空闲的Page
- 在mapping table中新增逻辑地址与物理地址的映射关系
覆盖写流程
在Flash的特性中提到Page中的数据是无法被变更的,需要先清空Block后才能重新写入。而Block中不止一个Page,所以不能简单的随机找一个有无效数据的Page进行覆盖写,而是应该重新占用一个空闲的Page,然后修改数据的映射关系。
- 准备内容,如果是更新数据的话,要把原Page中的内容都读出来,不能只有更新的部分
- 找到一个空闲的Page
- 把数据写入空闲的Page
- 更新mapping table,把逻辑地址的映射改成新的Page(这样原来的Page就在mapping table中废弃了)
3.2.2 读取流程
SSD的读取流程比较简单,分为两步。
- 在mapping table中搜索数据所在的Page
- 读取Page中的数据
这里的第一步对应机械硬盘中的物理定位(寻道和旋转),第二部对应的机械硬盘中的数据读取。
在这两个步骤中,SSD的性能都要远高于机械硬盘。特别是在第一步中,相比机械硬盘的机械运动,SSD的数据定位方式要快上几十倍甚至百倍。
3.3 垃圾回收(GC)
上面提到的覆盖写操作会产生大量包含无效数据的Page,这些Page无法被正常使用。极端情况下,当空Page被写满后就无法进行写入操作了,这时就需要进行垃圾回收。当然垃圾回收的时机肯定不止在空闲Page被用完之后,系统或者软件在运行过程中会为了顺序读而做数据整理,这时也会进行垃圾回收。SSD的垃圾回收流程和JVM的垃圾回收有些相似。
- 确定Block中存在有效数据的Page
- 把存在有效数据的Page迁移到一个空闲的Block中
- 擦除当前Block中的数据
- 把迁移出去的数据迁回来
- 擦除刚才临时存放数据的Block
SSD的GC机制会带来两个问题:
- SSD的寿命减少。NAND-Flash中每个原件都有擦写次数限制,超过一定擦写次数后,就只能读取不能写入了。
- 写放大(Write Amplification)。Block中的空间不足以完成写入数据,则会触发上述的GC流程,导致内部真正写入操作大于用户请求写入的数据量。写放大最直观的表现是写入速度变慢。
如果频繁的在某些Block上做GC,会使得这些元件比其他部分更快到达擦写次数限制。因此,需要损耗均衡控制(Wear-Leveling)算法,使得原件的擦写次数比较平均,进而延长SSD的寿命。
3.4 损耗均衡控制算法
均衡算法分为动态均衡和静态均衡。分别针对动态数据和静态数据,动态数据指的是经常发生变更数据, 静态数据则是写入后极少变更的数据。两种均衡方法都需要记录当前SSD中每个Block的擦写次数。
3.4.1 动态均衡
动态均衡是在写数据时优先用擦写次数最少的Block。粗看动态均衡已经非常均衡了,但事实上擦写次数最小的Block大概率存放着静态数据,静态数据极少变更则Block就不会被释放,也就不能被再写入,所以还需要静态均衡。
3.4.2 静态均衡
静态均衡针对静态数据,由于静态数据很少变更 ,长期占用擦写次数小的Block,所以需要找机会把静态数据迁移到擦写次数多的Block中。静态均衡的做法是找到擦写次数小于阈值的Block,将这些Block中的数据与擦写次数高的Block中的数据进行交换。
4. 参考资料
程序员需要知道的SSD基本原理
SSD固态硬盘的结构和基本工作原理概述
硬盘三大种类(SSD;HHD;HDD)
《数据库系统实现 第二版》
浅谈分布式存储之SSD基本原理
SSD的随机读写与顺序读写?
#硬盘 #计算机组成
1. 简介
固态硬盘(Solid State Drive 即SSD)是指用固态电子存储芯片阵列而制成的硬盘,由控制单元和存储单元(FLASH芯片、DRAM芯片)组成。相比起传统硬盘,它没有磁头,马达,磁盘等一系列的零件,搭载NAND Flash芯片作为存储介质,在运行速度,功耗,轻便等方面是传统硬盘所无法比拟的。
- 优点:读写速度快;防震抗摔性;低功耗;无噪音;工作温度范围大;轻便。
- 缺点:容量小;寿命有限;售价高
2. 固态硬盘结构
- 主控:一种嵌入式微芯片,SSD的大脑,负责发出SSD工作所需的所有指令。
- NAND闪存:SSD中存储数据的地方。
- DRAM:内存,存储SSD中的地址映射等信息。
2.1 NAND闪存
一个固态硬盘上有多个NAND闪存,主控通过若干个通道并行控制多个NAND闪存,大大提高底层的带宽。NAND闪存(即Flash)由多个Block组成,一个Block内部又有多个Page(物理页),Page里才是我们保存的数据。
- Flash的特性一:Page是SSD存取数据的最小单位,每次存取数据至少是一个Page,每个page的大小为4k或者8k。
- Flash的特性二:Page可以被读写,但是不能被覆盖,数据只能被写入到空Page中,如果要使用有数据的Page则必须先清空Page中的数据。但Page是不能被单独清空的,Flash清空操作的最小单位是Block,即每次清空至少一个Block。
3. 固态硬盘工作原理
3.1 基础知识
3.1.1 mapping table
在SSD中,一般会维护一个mapping table,维护逻辑地址到物理地址的映射。每次读写时,可以通过逻辑地址直接查表计算出物理地址,与传统的机械磁盘相比,省去了寻道时间和旋转时间。机械硬盘定位数据的时间大约在几毫秒到十几毫秒左右,而固态硬盘定位数据只需要约0.1ms左右,所以在随机读写上固态硬盘的速度远远高于机械硬盘。
3.1.2 Over-Provisioning
Over-Provisioning 是指SSD实际的存储空间比可写入的空间要大。比如一块SSD实际空间128G,可用容量却只有120G。之所以要这样设计是因为SSD数据擦除的最小颗粒度是Block,当出现只需要擦除单个Page的情况时,为了保护Block内其他Page上的数据,需要把他们迁移到一个空的Block中。如果没有多余的Block,则无法完成这个操作。为了保证SSD在任何情况下都能提供数据擦除的能力,必须要多预留一些空间。
3.2 读写原理
3.2.1 写入流程
SSD的写入流程根据Page中是否有数据而分为新写入和覆盖写。
新写入流程
新写入流程很简单,可以分为三步。
- 找到一个空闲的Page
- 把数据写入空闲的Page
- 在mapping table中新增逻辑地址与物理地址的映射关系
覆盖写流程
在Flash的特性中提到Page中的数据是无法被变更的,需要先清空Block后才能重新写入。而Block中不止一个Page,所以不能简单的随机找一个有无效数据的Page进行覆盖写,而是应该重新占用一个空闲的Page,然后修改数据的映射关系。
- 准备内容,如果是更新数据的话,要把原Page中的内容都读出来,不能只有更新的部分
- 找到一个空闲的Page
- 把数据写入空闲的Page
- 更新mapping table,把逻辑地址的映射改成新的Page(这样原来的Page就在mapping table中废弃了)
3.2.2 读取流程
SSD的读取流程比较简单,分为两步。
- 在mapping table中搜索数据所在的Page
- 读取Page中的数据
这里的第一步对应机械硬盘中的物理定位(寻道和旋转),第二部对应的机械硬盘中的数据读取。
在这两个步骤中,SSD的性能都要远高于机械硬盘。特别是在第一步中,相比机械硬盘的机械运动,SSD的数据定位方式要快上几十倍甚至百倍。
3.3 垃圾回收(GC)
上面提到的覆盖写操作会产生大量包含无效数据的Page,这些Page无法被正常使用。极端情况下,当空Page被写满后就无法进行写入操作了,这时就需要进行垃圾回收。当然垃圾回收的时机肯定不止在空闲Page被用完之后,系统或者软件在运行过程中会为了顺序读而做数据整理,这时也会进行垃圾回收。SSD的垃圾回收流程和JVM的垃圾回收有些相似。
- 确定Block中存在有效数据的Page
- 把存在有效数据的Page迁移到一个空闲的Block中
- 擦除当前Block中的数据
- 把迁移出去的数据迁回来
- 擦除刚才临时存放数据的Block
SSD的GC机制会带来两个问题:
- SSD的寿命减少。NAND-Flash中每个原件都有擦写次数限制,超过一定擦写次数后,就只能读取不能写入了。
- 写放大(Write Amplification)。Block中的空间不足以完成写入数据,则会触发上述的GC流程,导致内部真正写入操作大于用户请求写入的数据量。写放大最直观的表现是写入速度变慢。
如果频繁的在某些Block上做GC,会使得这些元件比其他部分更快到达擦写次数限制。因此,需要损耗均衡控制(Wear-Leveling)算法,使得原件的擦写次数比较平均,进而延长SSD的寿命。
3.4 损耗均衡控制算法
均衡算法分为动态均衡和静态均衡。分别针对动态数据和静态数据,动态数据指的是经常发生变更数据, 静态数据则是写入后极少变更的数据。两种均衡方法都需要记录当前SSD中每个Block的擦写次数。
3.4.1 动态均衡
动态均衡是在写数据时优先用擦写次数最少的Block。粗看动态均衡已经非常均衡了,但事实上擦写次数最小的Block大概率存放着静态数据,静态数据极少变更则Block就不会被释放,也就不能被再写入,所以还需要静态均衡。
3.4.2 静态均衡
静态均衡针对静态数据,由于静态数据很少变更 ,长期占用擦写次数小的Block,所以需要找机会把静态数据迁移到擦写次数多的Block中。静态均衡的做法是找到擦写次数小于阈值的Block,将这些Block中的数据与擦写次数高的Block中的数据进行交换。
4. 参考资料
程序员需要知道的SSD基本原理
SSD固态硬盘的结构和基本工作原理概述
硬盘三大种类(SSD;HHD;HDD)
《数据库系统实现 第二版》
浅谈分布式存储之SSD基本原理
SSD的随机读写与顺序读写?