全面理解SSD和NAND Flash
Flash Memory又叫做闪存,是一种非易失性存储器。非易失性是指断电之后数据不会丢失,这里就涉及到断电保护(后面详细讲解)。
总体思路
1、NAND Flash的用途。
2、NAND Flash规则介绍。
3、SSD固件(Firmware,FW)包括:映射表(Mapping Table)、垃圾回收(Garbage Collection)、磨损平衡(Wear Leveling,WL)等。
4、补充概念:写入放大(Write Application)、预留空间(Over Provisioning)、Flash寿命(Program/Erase Count,P/E)等。
5、断电保护机制。
6、对SSD的评价标准:稳定性、性能、寿命。
1、NAND Flash的用途
HDD是指机械硬盘,是传统普通的硬盘,包括:盘片、磁头、磁盘旋转轴及控制电机、磁头控制器、数据转接器、接口、缓存。
SDD(Solid State Drives)是固态硬盘,包括:控制单元、存储单元(DRAM芯片/FLASH芯片)。
区别:HDD是机械式寻找数据,所以防震远低于SSD,数据寻找时间也远低于SSD。SSD(左图)和HDD(右图)的模样区别如下:
(图片来自百度)

Flash又分NAND Flash和NOR Flash:NOR型存储内容以编码为主,其功能多与运算相关;NAND型主要功能是存储资料,如数码相机中所用的记忆卡。
现在大部分的SSD都是用来存储不易丢失的资料,所以SSD存储单元会选择NAND Flash芯片。这里我们讲的就是SSD中的NAND Flash芯片。
2、NAND Flash的规则
(1)Flash都不支持覆盖,即写入操作只能在空或已擦除的单元内进行。
更改数据时,将整页拷贝到缓存(Cache)中修改对应页,再把更改后的数据挪到新的页中保存,将原来位置的页标记为无效页;

指定在已有无效数据的位置写入时,需要先擦除无效页才能在该位置写入新数据。

(2)以page为单位写入,以Block为单位擦除;擦除Block前需要先对里面的有效页进行搬迁。
(3)每个Block都有擦除次数限制(有寿命),擦除次数过多会成为坏块(bad block)。
3、SSD固件内容
(1)映射表 Mapping Table
逻辑地址:用户程序中使用的相对地址;
物理地址:实际存储单元的绝对地址;
所以,映射表里面存储的内容是逻辑地址到物理地址的映射信息,利用逻辑地址查询映射表,找到对应的物理地址,再对实际存储单元做读写访问。
SSD内部就维护了一张映射表;一般SSD内部会板载DRAM,用于存储程序运行的临时数据,断电会丢失;映射表存放在SDRAM中(方便快速访问),同时NAND Flash中会存储几份映射表(防止断电后映射关系丢失),而且会定期对NAND Flash中的映射便进行更新。
(2)垃圾回收 Garbage Collection
垃圾回收就是把几个Block中的有效数据集中搬移到新的Block上去, 然后再把这几个Block擦除掉。
垃圾回收机制有很多,都是根据不同的侧重点提出的,所以没有最优的算法,就像伴侣一样只有适不适合之说。如:Greedy算法,每次选择包含最少有效页的Block来回收,也就是对垃圾的贪心,每次尽可能回收最多的垃圾。还有Cost-Benefit算法(考虑Block的擦除次数)、Cat回收算法、CICL算法等。
另外有两种回收策略:
- 被动回收策略:当有写入请求的时候,首先判断当前可用空间大小与临界值大小的比较;如果空间足够,直接写入空闲空间;如果空间不够了,首先启用垃圾回收,再往空闲区域完成写入请求。
- 不足之处:当空间不够的时候写请求会被延迟。
- 主动回收策略:通过固件设定周期性任务,定时检查可用空间大小,如果需要就执行垃圾回收。
- 巧妙之处:利用空闲时间提前进行垃圾回收,避免对请求造成不必要的延时。
- 不足之处:倘若系统一直没有空闲时间,垃圾回收依旧无法有效执行。
(3)磨损平衡 Wear Leveling
每个Block都是有寿命(Program/Erase Count,P/E值)的,他们的擦除次数是有限的。NAND Flash的寿命类似“木桶原理”,取决于所有Block中的最小寿命。如果拼命对某一块进行擦除,NAND Flash的寿命将会被缩减到最小。所以引入了磨损平衡,平衡所有Block的擦除次数。
有很多不同的磨损平衡机制,大体可以分为两大类:动态WL、静态WL。
- 动态WL:使用Block进行擦写时,优先挑选P/E值低的Block。
- 动态WL:把P/E值低的Block中的数据挪到P/E值高的Block中存放。
4、补充概念
(1)写入放大 Write Application
写入放大倍数 = 闪存写入数据量 / 主控写入数据量 = 实际写入数据量 / 要求写入数据量
例如,现在有一个写入一页的请求;即主控写入数据量为1;

然而这个一页请求触发了垃圾回收,当前的写请求会被延迟,直到垃圾回收完毕后再执行写入操作;

如果垃圾回收只挪了5页有效数据,那么实际的写入量应该为6页(1页写请求,5页挪动);即闪存写入数据量为5;

所以写放大为5/1 = 5。
理想的写放大为1,但是Sandforce的数据写入时会进行压缩写入,最优情况下,写放大可以为0.5,打破了Intel的“写放大不可能小于1”之说。
(2)预留空间 Over Provisioning
通过垃圾回收的过程,不难知道,垃圾回收的前提是要提供空闲区域来拷贝,如果连空闲区域都没有,垃圾回收将无法执行,这时将不再支持任何数据的写入。为了避免这种情况的发生,提出了预留空间。
预留空间不仅仅只是用来保证垃圾回收的正常完成,还存储着SSD内部的系统数据(包括:出厂坏块信息、SSD固件、Mapping Table等)。
所以如果说明存储大小为256GB,实际上的存储空间可能只有238GB(一般预留空间为7%)。
另外,OP越大,垃圾回收就会越快,相应写放大会变小,所以读写性能就会越好;但用户能使用的空间会被缩小。
(3)Flash寿命 Program/Erase Count
前面也已经提及到了,每个Block都是有擦除次数限制的,所以引入了寿命这个说法。
5、断电保护机制
中控里板载的SDRAM是非易失性存储器,断电之后数据会丢失,这个时候SDRAM中的数据主要包括:用户数据、映射表;
如果没有断电保护机制,再次上电时,先去NAND Flash中找上次更新时的映射表,这时拿到的信息并不是最新的,是上次更新NAND Flash中映射表时的数据信息,所以发生了大部分数据丢失。
因此SSD板上会加上钽电容或者超级电容,当检测到非法断电时,首先停止数据操作,钽电容或超级电容开始放电,以保证SDRAM中的数据能够写入到NAND Flash中。
至于是用钽电容还是超级电容,得看具体要保护的数据量;不是电容的容量越大越好,因为只要电容开始放电,就要等待它的电放完之后才可以进行其他操作。假如电容容量过大,用户只是点了个电脑重启,这时候SSD的电容会开始放电,放电还没完成的时候,电脑已经重新上电,这时无法认盘。所以电容电量应该选最时候的。
基于SDRAM中的内容,断电保护机制主要分为3种:
(1)保存SDRAM中所有数据
再次上电后,相当于断电前的操作被中断,重新上电后就可立马进入待命状态。
(2)只保存SDRAM中的用户数据
再次上电后,需要先把上次NAND Flash中保存的映射表提取到SDRAM中,再将保存的用户数据提取出来,两者结合更新映射信息,更新完之后才进入待命状态。
(3)只保存SDRAM中的映射表
再次上电后,需要先把上次NAND Flash中保存的映射表提取到SDRAM中,只是丢掉了用户断电前正在操作的数据,无法更新。
6、SSD的评价标准
(1)稳定性:SSD是否稳定,最大的影响因素是垃圾回收机制的选择,恰当的垃圾回收可以提供稳定的读写速率;例如主动垃圾回收机制,在空闲的时候做垃圾回收,读写速度不会因为延时而波动不定。
(2)性能:预留空间的大小主要决定了SSD的性能,OP大,垃圾回收快,相应写放大小,读写性能就越好。
(3)寿命:所有Block的P/E值越趋近于均衡,SSD的寿命就越趋近于最佳。
全面理解SSD和NAND Flash的更多相关文章
- 关于NAND flash的MTD分区与uboot中分区的理解
关于NAND flash的MTD分区与uboot中分区的理解 转自:http://blog.csdn.net/yjp19871013/article/details/6933455?=40085044 ...
- 新手学习ARM,对片内ram、SDRAM、NOR FLASH和NAND FLASH启动这几个概念的理解
片内的ram用来存储启动代码,在2440初始化sdram之前,代码就在片内ram中运行.片内ram装载的是norflash中的内容,即u-boot. uboot放在norflash里,nandflas ...
- NAND FLASH均衡算法笔记(转)
转来一篇关于NAND FLASH均衡算法的文章,加上一点思考和笔记,认为这种思考有助于更深刻的理解,更好的记忆,所以也算半原创了吧,最起码笔记是原创的.有意思的是,帖子提起这个算法并不是因为嵌入式开发 ...
- A New 3-bit Programming Algorithm using SLC-to-TLC Migration for 8MBs High Performance TLC NAND Flash Memory
背景 1.2012年左右的数据SLC.MLC.TLC闪存芯片的区别:SLC = Single-Level Cell ,即1bit/cell,速度快寿命长,价格超贵(约MLC 3倍以上的价格),约10万 ...
- Nand Flash,Nor Flash,CFI Flash,SPI Flash 之间的关系
前言: 在嵌入式开发中,如uboot的移植,kernel的移植都需要对Flash 有基本的了解.下面细说一下标题中的中Flash中的关系 一,Flash的内存存储结构 flash按照内部存 ...
- 硬件初始化,nand flash固化操作,系统启动简单流程
2015.3.27星期五 晴 链接脚本定义代码的排放顺序 硬件系统初始化:一:arm核初始化:(里面有指令)初始化ARM核的时候需要看arm核的手册指令:1.异常向量(最起码有个复位异常,初始化模式- ...
- NAND Flash【转】
转自:http://www.cnblogs.com/lifan3a/articles/4958224.html 以Micron公司的MT29F2G08为例介绍NAND Flash原理和使用. 1. 概 ...
- ECC校验原理以及在Nand Flash中的应用
本篇文章主要介绍ECC基本原理以及在Nand Flash中的应用,本文记录自己对ECC校验原理的理解和学习. ECC介绍 ECC,全称为Error Correcting Code, ...
- NAND FLASH的容量、特性、市场和应用
NAND Flash的容量 一直到2006年,MLC芯片的容量每年都成倍数增长:由于NAND Flash的制程升级的挑战越来越大,所以NAND Flash之后的容量成倍增长所需要的时间也在不断增加 ...
随机推荐
- CEF3 获取Cookie例子 CefCookieManager C++
首先从cef_cookie.h 源码种看到CefCookieManager 这个类: // Visit all cookies on the IO thread. The returned cooki ...
- HTTP权威指南-HTTP报文
在开始学习本章之前,先来提一些问题,什么是报文?如何创建报文?怎么去理解报文?以及报文的用处有哪些? 什么是报文? 可以这么去理解,如果说HTTP是因特网的信使,那么HTTP报文就是它用来搬东西的包裹 ...
- ocr智能图文识别 tess4j 图文,验证码识别 分享及所遇到的问题
自己对tess4j的使用总结 1,tess4j 封装了 tesseract-ocr 的操作 可以用很简洁的几行代码就实现原本tesseract-ocr 复杂的实现逻辑 如果你也想了解tesseract ...
- JQuery树形目录插件Dynatree
最近做网页需要做一个树形目录功能.找了一下发现有很多JQuery插件都可以实现这个功能.选了一个自己觉得最满意的插件Dynatree做个学习笔记. 可以把静态的html转成树形目录,还可以动态创建添加 ...
- 利用php做出简单的发布信息和回复功能
题目要求 1.建一个pinglun的数据库,自己建表2.完成一个简单的发布信息回复功能3.布局可以随便,主要是功能要实现4.注意回复是可以回复每一条的评论5.评论回复功能类似于qq空间的发布信息和回复 ...
- v9手机版文章内容不显示
方法一: 打开PHPCMS v9的/phpcms/templates/default/wap/show.html页面, 将网页中的{$content}替换为:{$rs['content']} 这样wa ...
- jquery滚动条事件
<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...
- PHP容器--Pimple运行流程浅析
需要具备的知识点 闭包 闭包和匿名函数在PHP5.3.0中引入的. 闭包是指:创建时封装周围状态的函数.即使闭包所处的环境不存在了,闭包中封装的状态依然存在. 理论上,闭包和匿名函数是不同的概念.但是 ...
- C#调用TSC条码打印机打印条码
#region 调用TSC打印机打印条码 /// <summary> /// 调用TSC打印机打印条码 /// </summary> /// <param name=&q ...
- 最新的极光推送服务器端代码(java服务器后台向手机端自定义推送消息)
一共两个类 一个Jdpush 一个JpushClientUtil 代码如下 注解都写的很清楚 package com.sm.common.ajpush; import org.slf4j.Log ...