非易失性存储器(英语:non-volatile memory,缩写为NVM)是指当
电流关掉后,所存储的
数据不会消失的
电脑存储器。非易失性存储器中,依存储器内的数据是否能在使用电脑时随时改写为标准,可分为二大类产品,即
ROM和
Flash memory。
类型
非易失性存储器主要有以下类型:
只读存储器
只读存储器(Read-OnlyMemory,ROM)是一种
半导体存储器,其特性是一旦存储
数据就无法再将之改变或删除,且内容不会因为
电源关闭而消失。在
电子或
电脑系统中,通常用以存储不需经常变更的程序或数据,例如早期的
家用电脑如
Apple II的监督程序、BASIC语言
解释器、与硬件点阵字体,
个人电脑IBMPC/XT/
AT的
BIOS(基本输入输出系统)与IBM PC/XT的BASIC解释器,与其他各种微电脑系统中的
固件(Firmware),均存储在ROM内。
PROM
可编程只读存储器(Programmable ROM,PROM)其内部有行列式的镕丝,可依用户(厂商)的需要,利用电流将其烧断,以写入所需的数据及程序,镕丝一经烧断便无法再恢复,亦即数据无法再更改。
EPROM
可抹除可编程只读存储器(Erasable Programmable Read Only Memory,EPROM)可利用高电压将数据编程写入,但抹除时需将线路曝光于
紫外线下一段时间,数据始可被清空,再供重复使用。因此,在封装外壳上会预留一个
石英玻璃所制的透明窗以便进行紫外线曝光。写入程序后通常会用贴纸遮盖透明窗,以防日久不慎曝光过量影响数据。
OTPROM
一次编程只读存储器(One Time Programmable Read Only Memory,OTPROM)内部所用的芯片与写入原理同EPROM,但是为了节省成本,封装上不设置透明窗,因此编程写入之后就不能再抹除改写。
EEPROM
电子抹除式可复写
只读存储器(Electrically Erasable Programmable Read Only Memory,EEPROM)之运作原理类似EPROM,但是抹除的方式是使用高
电场来完成,因此不需要透明窗。
闪存
快闪存储器(英语:flash memory),是一种电子式可清除程序化只读存储器的形式,允许在操作中被多次擦或写的存储器。这种科技主要用于一般性数据存储,以及在电脑与其他数字产品间交换传输数据,如
储存卡与
U盘。闪存是一种特殊的、以宏块抹写的EEPROM。早期的闪存进行一次抹除,就会清除掉整颗芯片上的数据。
闪存的成本远较可以字节为单位写入的
EEPROM来的低,也因此成为非易失性固态存储最重要也最广为采纳的技术。像是PDA、笔记本电脑、数字随身听、数码相机与手机上均可见到闪存。此外,闪存在游戏主机上的采用也日渐增加,借以取代存储游戏数据用的EEPROM或带有电池的
SRAM。
闪存是非易失性的内存。这表示单就保存数据而言,它是不需要消耗电力的。与硬盘相比,闪存也有更佳的动态抗震性。这些特性正是闪存被移动设备广泛采用的原因。闪存还有一项特性:当它被制成储存卡时非常可靠──即使浸在水中也足以抵抗高压与极端的温度。闪存的写入速度往往明显慢于读取速度。
虽然闪存在技术上属于
EEPROM,但是“EEPROM”这个字眼通常特指非快闪式、以小区块为清除单位的
EEPROM。它们典型的清除单位是字节。因为老式的
EEPROM抹除循环相当缓慢,相形之下快闪记体较大的抹除区块在写入大量数据时带给其显著的速度优势。闪存最常见的封装方式是TSOP48和BGA,在逻辑接口上的标准则由于厂商阵营而区分为两种:ONFI和Toggle。手机上的闪存常常以eMMC的方式存在。
闪存的限制
区块抹除
闪存的一种限制在于即使它可以单一字节的方式读或写入,但是抹除一定是一整个区块。一般来说都是设置某一区中的所有比特为“1”,刚开始区块内的所有部分都可以写入,然而当有任何一个比特被设为“0”时,就只能借由清除整个区块来恢复“1”的状态。换句话说闪存(特别是NOR Flash)能提供随机读取与写入操作,却无法提供任意的随机改写。不过其上的区块可以写入与既存的“0”值一样长的消息(新值的0比特是旧值的0比特的
超集)。例如:有一小区块的值已抹除为1111,然后写入1110的消息。接下来这个区块还可以依序写入1010、0010,最后则是0000。可是实际上少有
算法可以从这种连续写入兼容性得到好处,一般来说还是整块抹除再重写。尽管闪存的
数据结构不能完全以一般的方式做更新,但这允许它以“标记为不可用”的方式删除消息。这种技巧在每单元存储大于1比特数据的MLC设备中必须稍微做点修改。
记忆耗损
另一项闪存的限制是它有抹写循环的次数限制(大多商业性SLC闪存保证“0”区有十万次的抹写能力,但其他区块不保证)。这个结果部分地被某些
固件或文件系统为了在相异区块间分散写入操作而进行的计算写入次数与动态重对映所抵销;这种技巧称为耗损平衡(wear leveling)。另一种处理方法称为
坏区管理(Bad Block Management, BBM)。这种方法是在写入时做验证并进行动态重测,如果有验证失败的区块就加以剔除。对多数移动设备而言,这些磨损管理技术可以延长其内部闪存的寿命(甚至超出这些设备的使用年限)。此外,丢失部分数据在这些设备上或许是可接受的。至于会进行大量数据读写循环的高可靠性数据存储应用则不建议使用闪存。不过这种限制不适用于
路由器与
瘦客户端(Thin clients)等只读式应用,这些设备往往在使用年限内也只会写入一次或少数几次而已。
读取干扰
所使用的闪存读取方式随着时间的推移会导致在同一区块中相近的记忆单元内容改变(变成写入动作)。这即是所谓的读取干扰。会导致读取干扰现象的读取次数门槛介于区块被抹除间,通常为100,000次。假如连续从一个记忆单元读取,此记忆单元将不会受损,而受损却是接下来被读取的周围记忆单元。为避免读取干扰问题,闪存控制器通常会计算从上次抹除动作后的区块读取动作总次数。当计数值超过所设置的目标值门槛时,受影响的区块会被复制到一个新的区块,然后将原区块抹除后释放到区块回收区中。原区块在抹除动作后就会像新的一样。若是闪存控制器没有即时介入时,读取干扰错误就会发生,如果错误太多而无法被ECC机制修复时就会伴随着可能的数据丢失。
写入(编程)干扰
写入干扰(编程干扰)是指当对页(page)进行写入时,由于阈值电压接近的关系,相邻的位(bit)也被升高,从而造成相邻的位出错。闪存电荷非常不稳定,相邻存储电荷的悬浮门间会相互干扰,造成相邻悬浮门间的bit错误,MLC由于存在4组接近的电压,与SLC相比更容易受到干扰。