具体实施方式
本说明书全文对特征、优点或类似语言的引用并不意味着通过本发明可实现的所有特征和优点应当是或包含于本发明的任何一个实施例。相反,应当理解涉及特征和优点的语言是指结合实施例所述的具体的特征、优点或特性包括在本发明的至少一个实施例中。因此,整个说明书中的关于特征、优点或类似语言的描述可能(但未必)是指相同的实施例。
此外,本发明所述的特征、优点和特性可以任何适合的方式结合在一个或多个实施例中。相关领域的技术人员将认识到可在没有具体实施例的一个或多个特定特征或优点的情况下实施本发明。在其他情况中,在可能在没有存在于本发明的所有实施例中的某些实施例中认识到另外的特征和优点。本发明的这些特征和优点将由于以下说明书和附属权利要求书而更显而易见,或可通过如下文所示的本发明的实施来了解。
在本说明书中所述的多个功能部件已标记为模块以更具体地强调其实施独立性。例如,可将模块用作硬件电路,其包括定制的VLSI电路或门阵列、半导体成品(诸如,逻辑芯片、晶体管或其他离散元件)。也可将模块用在可编程硬件装置中,例如,场可编程门阵列、可编程阵列逻辑、可编程逻辑装置等。
也可将模块应用在软件中以由各种类型的处理器执行。可执行代码的已识别模块(例如)可包括一个或多个计算机指令的物理或逻辑块,这些逻辑块可以(例如)设置成对象、程序或功能。然而,已识别模块的可执行代码不必实际在一起,但是可包含存储在不同位置的不同指令,当该不同指令逻辑上结合在一起时,构成所述模块并实现此模块的所宣称目的。
实际上,可执行代码的模块可以是单个指令或多个指令,并且甚至可以分布在多个不同代码段上、不同程序中并可跨多个存储装置而分布。相似地,可在模块中识别和举例说明可操作数据,并且该数据可以任何适合的形式体现并以任何适合类型的数据结构整理。该可操作数据可集合为单个数据集或可分布在不同位置上(包括在不同的存储装置上),并可仅作为电子信号而在系统或网络上至少部分地存在。在模块或模块各部分应用在软件中的情况下,软件各部分存储在一个或多个计算机可读介质上。
在本说明书全文中,对“一个实施例”、“实施例”或类似语言的引用意指结合实施例所述的具体特征、结构或特性包括在本发明的至少一个实施例中。因而,在整个说明书中,短语“一个实施例中”、“实施例中”和类似语言的出现可能(但未必)都是指相同的实施例。
对于计算机可读介质而言,其可采用任何能够将机器可读的指令存储在数字处理装置上的形式。计算机可读介质可具体呈现为光盘、数字视盘、磁带、贝努里驱动器、磁盘、穿孔卡、闪速存储器、集成电路或其他数字处理装置存储装置。
此外,本发明所述的特征、结构或特性可以任何适合的方式结合在一个或多个实施例中。在以下的说明中,提供了许多具体细节(例如,编程例子、软件模块、用户选择、网络事务、数据库查询、数据库结构、硬件模块、硬件电路、硬件电路、硬件芯片等)以利于对本发明的实施例的深入的理解。然而,相关领域的技术人员将认识到可在没有一个或多个所述具体细节的情况下或以其他方法、部件、材料等实施本发明。在其他情况中,未示出或未详细描述熟知的结构、材料或操作以避免混淆本发明的一些方面。
本文所包括的示意性流程图通常示为逻辑流程图。同样地,所示出的顺序和标记的步骤表示所提供方法的一个实施例。可将其他步骤和方法预想为在功能、逻辑或效果上与所示的方法的一个或多个步骤或部分等同。另外,所采用的格式和符号用于解释该方法的逻辑步骤并且不应理解为是对本方法范围的限制。虽然多种箭头类型和线型会应用在流程图中,但是不应将它们理解为是对相应方法的范围的限制。实际上,一些箭头或其他连接物可用于仅表明方法的逻辑流程。例如,箭头可表明在所示方法的例举步骤之间的非特定持续期间的等待或监测时间。另外,具体方法执行的顺序可能或不会严格遵循所示的相应步骤的顺序。
图1示出了用于减少数据丢失的系统100的一个实施例。在所示的实施例中,系统100包括主机计算系统114、吞吐量管理装置122以及存储装置102。主机计算系统114可以是计算机,例如,服务器、笔记本电脑、台式电脑、移动设备或本领域已知的其他计算装置。主机计算系统114通常包括诸如内存、处理器、总线的部件以及本领域技术人员已知的其他部件。
主机计算系统114将数据存储在存储装置102中并且通过通信连接与存储装置102进行数据传送。该存储装置102可设置于主机计算系统114的内部或主机计算系统114的外部。该通信连接可以是总线、网络或其他形式的连接以使得数据在主机计算系统114和存储装置102之间传送。在一个实施例中,存储装置102通过PCI连接(例如串行总线(“PCI-e”))连接到主机计算系统114。该存储装置102可以是插入到主机计算系统114上的PCI-e连接的卡。
在所示的实施例中,该存储装置102执行数据存储操作,例如,读取、写入、擦除等。在某些实施例中,用于存储装置102的电源连接和通信连接是在主机计算系统114和存储装置102之间的相同的物理连接的一部分。例如,存储装置102可通过PCI、PCI-e、串行高级技术附件(“串行ATA”或“SATA”)、并行ATA(“PATA”)、小型计算机系统接口(“SCSI”)、IEEE1394(“FireWire”)(“火线”)、光纤通道、通用串行总线(“USB”)、PCIe-AS或与主机计算系统114的另外的连接而接收电力。
该存储装置102提供了用于主机计算系统114的非易失性存储器。图1示出了用作非易失性存储装置102的存储装置102,其包括存储控制器104、写入数据管道106、读取数据管道108以及非易失性存储介质110。存储装置102可包含另外的部件,其未被示出以提供存储装置102的更简单的视图。
非易失性存储介质110存储数据以使得即使当该存储装置102断电时,数据仍可保留下来。在一些实施例中,非易失性存储介质110包括固态存储介质,例如,闪速存储器、纳米随机存储器(“NRAM”)、磁阻RAM(“MRAM”)、动态RAM(“DRAM”)、相变RAM(“PRAM”)、赛道存储器、记忆电阻存储器、基于纳米晶体线的存储器、基于氧化硅的亚10纳米进程存储器、石墨烯存储器、硅氧化氮氧化硅(“SONOS”)、电阻型随机存储器(“RRAM”)、可编程金属化单元(“PMC”)、导电桥接随机存储器(“CBRAM”)等。虽然在所示的实施例中,存储装置102包括非易失性存储介质110,但是在其他实施例中,存储装置102可包括磁性介质(例如,硬盘、磁带等)、光学介质或其他非易失性数据存储介质。存储装置102还包括协调在非易失性存储介质110中的数据的存储和检索的存储控制器104。存储控制器104可使用一个或多个索引以定位和检索数据以及对存储在存储装置102中的数据进行其他操作。例如,存储控制器104可包括进行数据梳理操作(例如,垃圾收集)的梳理器。
如同所示,在某些实施例中,存储装置102实施写入数据管道106和读取数据管道108,其中一个例子在下文中有更详细地描述。当数据从主机计算系统114转移到非易失性存储介质110中时,该写入数据管道106可对数据进行某些操作。这些操作可包括(例如)纠错码(ECC)生成、加密、压缩和以及其他。该读取数据管道108可对从非易失性存储介质110读取出并且发送到主机计算系统114的数据进行类似的和可能相反的操作。
在一个实施例中,该主机计算系统114包括除了存储装置102之外的一个或多个其他部件,例如,另外的存储装置、图形处理器、网卡等。根据本公开,本领域的技术人员将会知道在主机计算系统114中可有不同类型的部件。所述部件可设置在主机计算系统114的内部或外部。在一个实施例中,一些部件可以是连接到主机计算系统114并且通过主机计算系统114接收电力的PCI或PCI-e卡。
在一些实施例中,驱动器118或存储接口116为应用程序接口(“API”)并且用于将命令和其他数据转化成适合发送到存储控制器104的形式。在另一个实施例中,驱动器118具有存储控制器104的一种或多种功能。例如,驱动器118可包括下述的全部或部分模块,并可包括用于该存储装置106的一个或多个索引或映射。驱动器118、一个或多个存储控制器104以及包括该存储系统102的一个或多个存储装置106具有连接到文件系统/文件服务器的存储接口116,并且常规地在文件系统/文件服务器中完成的分配有利地向下推送(即,卸载)到该存储系统102。
如本申请中所用,逻辑标识符是与存储数据单元的数据的物理地址不同的数据单元的标识符。如本申请中所用,数据单元是逻辑上集合在一起的任何数据集。数据单元可以是文件、对象、低成本的/独立的磁盘/驱动器(“RAID”)数据条带的冗余阵列的数据段或用于数据存储中的其他数据集。数据单元可以是可执行代码、数据、元数据、目录、索引、可存储在存储装置中的任何其他类型的数据或它们的组合。可通过名称、逻辑地址、物理地址、地址范围或用于识别数据单元的其他约定而识别数据单元。逻辑标识符包括数据单元标识符,例如,文件名称、对象标识符、索引节点、通用唯一标识符(“UUID”)、全局唯一标识符(“GUID”)或其他数据单元标签,并且还可包括逻辑区块地址(“LBA”)、磁道柱面/磁头/扇区(“CHS”)或其他低级别逻辑标识符。逻辑标识符通常包括可映射到物理位置的任何逻辑标签。
在一些实施例中,存储装置106以顺序的基于日志的格式将数据存储到非易失性存储介质110上。例如,当数据单元被修改时,数据单元的数据从一个物理位置读取、修改、然后被写入不同的物理存储位置。将数据写入数据存储装置106的顺序和序列可包括在非易失性存储装置102上执行的存储操作的序列的事件日志。通过遍历事件日志(和/或重播存储操作的顺序),可构建或重构存储元数据(例如,前向索引)。
在通常的随机存取装置中,逻辑标识符具有几乎与随机存取装置的物理地址的一一对应。在通常的随机存取装置的此一一对应的映射(除了为不良区块映射而保留的少量随机存取装置上的物理地址之外)也与有关逻辑标识符的存储容量和有关物理地址的物理容量之间的准一一对应关系相关联。例如,如果逻辑标识符为逻辑区块地址(“LBA”),则有关LBA的每个逻辑区块具有固定的尺寸。在随机存取装置上的对应物理区块的大小通常与逻辑区块的大小一样。这使得典型的文件服务器114/文件系统通过管理逻辑标识符(例如,LBA)而管理在随机存取装置上的物理容量。文件系统通常根据和利用LBA至PBA的映射连续性来整理存储在数据存储装置上的数据。相似地,一些系统可使用该连续性来查找在特定物理磁道上的数据以提高性能,就像被称为磁盘驱动器“短行程”的技术一样。高预见性的LBA至PBA的映射在某些应用中是必要的,以通过直接管理逻辑地址空间而间接地管理数据在物理存储空间中的存储。
然而,存储系统102可以是日志结构化的文件系统,使得没有固定关系或算法用来确定LBA至PBA的映射,或在另一个实施例中,存储系统可以为随机访问,但是可由不止一个客户端110或文件服务器114/文件系统访问,使得分配到每个客户端110或文件服务器114/文件系统的逻辑标识符表示比典型系统的逻辑标识符与物理标识符的一一对应关系大得多的存储容量。也可精简配置存储系统102使得一个或多个客户端110均具有比在存储系统102中的存储装置106的存储容量大得多的所分配的逻辑地址范围。在系统100中,存储系统102管理和分配逻辑标识符,使得在逻辑标识符和物理标识符之间没有预先确定的一一对应的或接近一一对应的关系。
系统100是有利的,因为其使得对存储容量的管理比典型的存储系统更有效。例如,对于多个客户端110可访问的典型的随机存取装置,如果每个客户端分配有一定量的存储空间,则该存储空间通常将存在并且在分配中被占据,即使实际占据的存储空间的量更小。系统100在另一方面也是有利的,因为系统100减少了连接到存储装置106的标准精简配置的系统的复杂性。标准的精简配置的系统具有精简配置的层,其包括在逻辑地址空间中的逻辑标识符和物理存储位置之间的逻辑到逻辑的映射。系统100是更高效的,因为消除了多层映射并以最低水平完成了精简配置(逻辑到物理映射)。
图2为根据本发明示出了非易失性存储装置控制器202的一个实施例200的示意性框图,该非易失性存储装置控制器包括在非易失性存储装置102中的写入数据管道106和读取数据管道108。非易失性存储装置控制器202可包括多个存储控制器0-N104a-n,每个均控制非易失性存储介质110。在所述的实施例中,示出了两个非易失性控制器:非易失性控制器0104a和存储控制器N104n,每个均控制各自的非易失性存储介质110a-n。在所示的实施例中,存储控制器0104a控制数据通道使得附加的非易失性存储介质110a存储数据。存储控制器N104n控制与所存储数据相关的索引元数据通道,并且该相关的非易失性存储介质110n存储索引元数据。在替代实施例中,非易失性存储装置控制器202包括具有单个非易失性存储介质110a的单个非易失性控制器104a。在另一个实施例中,存在有多个存储控制器104a-n和相关的非易失性存储介质110a-n。在一个实施例中,与和自身相关的非易失性存储介质110a-110n-1连接的一个或多个非易失性控制器104a-104n-1控制数据,而与和自身相关的非易失性存储介质110n连接的至少一个存储控制器104n控制索引元数据。
在一个实施例中,至少一个非易失性控制器104为场可编程门阵列(“FPGA”)并且控制器功能被编程到FPGA中。在具体的实施例中,FPGA为
FPGA。在另一个实施例中,存储控制器104包括特定设计为存储控制器104的部件,例如,特定用途的集成电路(“ASIC”)或定制的逻辑解决方案。每个存储控制器104通常包括写入数据管道106和读取数据管道108,将结合图3进一步描述它们。在另一个实施例中,至少一个存储控制器104由FPGA、ASIC和定制的逻辑部件的组合构成。
非易失性存储介质110为非易失性存储元件216、218、220的阵列,其排列在内存库214并且可通过双向存储输入/输出(“I/O”)总线210并行访问它们。在一个实施例中,该存储I/O总线210能在任何时候单向通信。例如,当将数据写入非易失性存储介质110时,不能从非易失性存储介质110读取数据。在另一个实施例中,数据可同时流向两个方向。然而,相对于数据总线在此所用的双向是指可使数据一次仅流向一个方向的数据通道,但是当在双向数据总线上流向一个方向的数据停止时,数据可在双向数据总线上流向相反的方向。
非易失性存储元件(例如,SSS0.0216a)通常被构造为芯片(一个或多个晶粒的封装)或在电路板上的晶粒。如同所示,非易失性存储元件(例如,216a)独立于或半独立于其他非易失性存储元件(例如,218a)运行,即使这些若干元件一起封装在芯片封装、一叠芯片封装或一些其他封装元件中。如同所示,将一行非易失性存储元件216a、216b、216m指定为内存库214。如同所示,可能存在有“n”个内存库214a-n,并且在非易失性存储介质110中的n×m个非易失性存储元件216、218、220的阵列的每个内存库有“m”个非易失性存储元件216a-m、218a-m、220a-m。当然,不同的实施例可包括不同的n和m值。在一个实施例中,非易失性存储介质110a包括八个内存库214,每个内存库214包括二十个非易失性存储元件216a-216m。在一个实施例中,非易失性存储介质110a包括八个内存库214,并且每个内存库214包括二十四个非易失性存储元件216a-216m。除了n×m个非易失性存储元件216a-216m、218a-218m、220a-220m,也可同时对一行或多行的其他非易失性存储元件216a、216b、216m和一个或多个另外的列(P)进行寻址和操作。在一个实施例中,该额外的P列为部分ECC块(即,ECC代码字)存储奇偶校验数据,该部分ECC区块跨过m个存储元件以用于特定内存库。在一个实施例中,每个非易失性存储元件216、218、220由单层式存储单元(“SLC”)装置组成。在另一个实施例中,每个非易失性存储元件216、218、220由多层式存储单元(“MLC”)装置组成。
在一个实施例中,将在存储I/O总线210a(例如,216b、218b、220b)上共享公用线211的非易失性存储元件封装在一起。在一个实施例中,非易失性存储元件216、218、220每个封装中可具有一个或多个晶粒,其中一个或多个封装垂直堆叠,并且可单独访问每个晶粒。在另一个实施例中,非易失性存储元件(例如,SSS0.0216a)的每个晶粒可具有一个或多个虚拟晶粒,每个封装可具有一个或多个晶粒以及垂直堆叠的一个或多个封装,并且可独立地访问每个虚拟晶粒。在另一个实施例中,非易失性存储元件SSS0.0216a的每个晶粒可具有一个或多个虚拟晶粒,每个封装可具有一个或多个晶粒,其中一些或全部的晶粒垂直堆叠,并且可独立地访问每个虚拟晶粒。
在一个实施例中,两个晶粒垂直堆叠并且每组四个堆叠以形成八个存储元件(例如,SSS0.0-SSS8.0)216a、218a…220a,每个位于单独的内存库214a、214b…214n中。在另一个实施例中,24个存储元件(例如,SSS0.0-SSS0.24)216a、216b,…216m形成逻辑内存库214a使得八个逻辑内存库中的每一个具有24个存储元件(例如,SSS0.0-SSS8.24)216、218、220。在存储I/O总线210上将数据发送到非易失性存储介质110和特定存储元件群组(SSS0.0-SSS8.0)216a、218a、220a的所有存储元件。使用存储控制总线212a以选择特定的内存库(例如,内存库0214a),使得在连接到所有内存库214的存储I/O总线210上接收的数据被正好写入所选的内存库214a中。
在一个实施例中,存储I/O总线210由一个或多个独立的I/O总线(包括210a.a-m…210n.a-m的“IIOBa-m”)构成,其中在每列中的非易失性存储元件共享一根并行连接到每个非易失性存储元件216、218、220的独立的I/O总线。例如,存储I/O总线210a的一根独立的I/O总线210a.a可物理地连接到每个内存库214a-n的第一非易失性存储元件216a、218a、220a。存储I/O总线210b的第二独立的I/O总线210a.b可物理地连接到每个内存库214a-n的第二非易失性存储元件216b、218b、220b。可同时地和/或并行地访问在内存库214a中的每个非易失性存储元件216a、216b、216m(如图2所示的一行非易失性存储元件)。在一个实施例中,在非易失性存储元件216、218、220包括晶粒堆叠封装的情况下,在特定堆叠中的所有封装物理地连接到相同的独立的I/O总线。如本文所用,“同时”也包括几乎同时的访问,其中以稍微不同的间隔访问装置以避免切换噪声。将“同时”用于本文中以区别于顺序或串行访问,其中将命令和/或数据相继地单独发送。
通常,使用存储控制总线212独立地选择内存库214a-n。在一个实施例中,使用芯片启动或芯片选择来选择内存库214。在芯片选择和芯片启动均可用的情况下,存储控制总线212可在封装堆叠中选择一个封装。在其他实施例中,存储控制总线212使用其他命令以在封装堆叠中单独地选择一个封装。也可通过在存储I/O总线210和存储控制总线212上传输的控制信号和地址信息的组合来选择非易失性存储元件216、218、220。
在一个实施例中,将每个非易失性存储元件216、218、220分割成擦除区块并且将每个擦除区块分割成页。在非易失性存储元件216、218、220上的擦除区块可称为物理擦除区块或“PEB”。典型的页为2048字节(“2kB”)。在一个例子中,非易失性存储元件(例如,SSS0.0)包括两个寄存器并且能将两个页编程使得两个寄存器式的非易失性存储元件216、218、220具有4kB的容量。然后,20个非易失性存储元件216a、216b、216m的内存库214将具有80kB容量的页面,可用出自存储I/O总线210的独立的I/O总线的相同地址访问该页面。
在80kB的非易失性存储元件216a,216b,…216m的内存库214中的该组页面也称为逻辑页面或虚拟页面。相似地,可整理内存库214a的每个存储元件216a,216b,…216m的擦除区块以形成逻辑擦除区块(也可称为虚拟擦除区块)。在一个实施例中,当在非易失性存储元件中接收到擦除命令时,将在非易失性存储元件中的页面的擦除区块擦除。鉴于在非易失性存储元件216、218、220中的擦除区块、页面、平面或其他逻辑和物理分区的大小和数量由于技术的进步而随时间推移改变,因而期望多个实施例符合新的构造是可行的并且符合本文的总体说明。
通常,当将数据包写入非易失性存储元件216中的特定位置时,其中旨在将数据包写入针对特定内存库的特定存储元件的特定物理擦除区块的特定页面中的位置,在存储I/O总线210上发送物理地址,然后发送数据包。该物理地址包含非易失性存储元件216的足够信息以将数据包导向至页面中的指定位置。因为在一列存储元件(例如,SSS0.0-SSS N.0216a,218a,…220a)中的所有存储元件都连接到存储I/O总线210a的相同的独立的I/O总线(例如210.a.a)以连接正确的页面并且避免将数据包写入在该列存储元件(SSS0.0-SSS N.0216a,218a,…220a)中的有类似地址的页面中,所以由存储控制总线212a选择包括具有要写入数据包的正确页面的非易失性存储元件SSS0.0216a的内存库214a,并且取消选择非易失性存储器110a的其他内存库214b…214n。
相似地,满足在存储I/O总线210上的读取命令需要在存储控制总线212上的信号以选择单个内存库214a和在该内存库214a中的正确的页面。在一个实施例中,读取命令读取整个页面,并且因为在内存库214a中有多个并行的非易失性存储元件216a,216b,…216m,所以用读取命令读取整个逻辑页面。然而,可将读取命令分解为子命令,如将在下文中针对内存库交错所述。相似地,在写入操作中,可将整个逻辑页面写入内存库214a的非易失性存储元件216a,216b,…216m。
可发出擦除区块擦除命令以在存储I/O总线210上将擦除区块擦除,并且通过特定的擦除区块地址擦除特定的擦除区块。通常,存储控制器104a可在存储I/O总线210的并行路径(独立的I/O总线210a-n.a-m)上发送擦除区块擦除命令以擦除逻辑擦除区块,并且每个命令均以特定的擦除区块地址将特定的擦除区块擦除。同时,在存储控制总线212上选择特定的内存库(例如,内存库0214a)以防止将在非所选的内存库(例如,内存库1-N214b-n)中具有相似地址的擦除区块擦除。或者,在存储控制总线212上不选择特定的内存库(例如,0214a)(或选择所有的内存库)以同时擦除所有内存库(内存库1-N214b-n)中具有相似地址的擦除区块。也可使用存储I/O总线210和存储控制总线212的组合将其他命令发送到特定位置。本领域的技术人员将会知道使用双向存储I/O总线210和存储控制总线212以选择特定存储位置的其他方式。
在一个实施例中,按顺序将数据包写入非易失性存储介质110。例如,存储控制器104a将数据包流式传输到存储元件216的内存库214a的存储写入缓冲区,并且当缓冲区写满后,将数据包设定到指定的逻辑页面。然后,存储控制器104a用数据包重新充满存储写入缓冲区,并且当充满时,将数据包写入下一个逻辑页面。下一个逻辑页面可存在于相同的内存库214a中或另一个内存库(例如,214b)中。一个逻辑页面接一个逻辑页面地继续该方法,通常一直进行到将逻辑擦除区块充满。在另一个实施例中,一个逻辑擦除区块接一个逻辑擦除区块地继续该方法,跨逻辑擦除区块的边界继续进行该流式传输。
在读取、修改、写入操作中,在读取操作中查找和读取与请求数据相关的数据包。不将修改的请求数据的已修改的数据段写入读取它们的位置。而是将该修改的数据段再次转变为数据包,然后按顺序写入在当前正被写入的逻辑页面中的下一个可用的位置。修改各个数据包的索引条目以指向包含修改的数据段的数据包。用于与未被修改的相同的请求数据相关的数据包的索引条目将包括未修改的数据包的原始位置的指针。因而,如果保留原始请求数据(例如)以保留请求数据的先前版本,则在初始写入时,原始请求数据将在索引中具有所有数据包的指针。新的请求数据将在索引中具有一些原始数据包的指针和在当前正被写入的逻辑页面中的修改的数据包的指针。
在复制操作中,该索引包括用于映射到多个存储在非易失性存储介质110中的数据包的初始请求数据的条目。当完成复制时,生成请求数据的新的副本并且在将请求数据的新副本映射到初始数据包的索引中生成新的条目。请求数据的新的副本也被写入到非易失性存储介质110中并且其位置映射到索引中的新条目。假如在尚未传输到请求数据的副本的初始请求数据中已发生变化并且索引丢失或损坏,请求数据包的新的副本可用于识别所引用的初始请求数据中的数据包。
有利地,顺序写入数据包促使更均匀地使用非易失性存储介质110并且使固态存储装置控制器202监控在非易失性存储介质110中的多个逻辑页面的存储热点区域和使用水平。顺序写入数据包还有利于形成强大的、高效的垃圾收集系统,在下文中将详细地对此进行描述。本领域的技术人员将认识到数据包的顺序存储的其他益处。
在多个实施例中,非易失性存储装置控制器202还包括数据总线204、局部总线206、缓冲区控制器208、缓冲区0-N222a-n、主控制器224、直接存储器存取(“DMA”)控制器226、存储器控制器228、动态存储器阵列230、静态随机存储器阵列232、管理控制器234、管理总线236、系统总线240的桥238以及其他逻辑242,这些在下文中有所描述。在其他实施例中,系统总线240连接到一个或多个网络接口卡(“NICs”)244,其中一些可包括远程DMA(“RDMA”)控制器246、一个或多个中央处理单元(“CPU”)248、一个或多个外部存储器控制器250和相关的外部存储器阵列252、一个或多个存储控制器254、对等控制器256以及特殊用途的处理器258,这些在下文中有所描述。连接到系统总线240的部件244-258可位于主机计算系统114中或可以是其他装置。
通常,存储控制器104通过存储I/O总线210将数据传送到非易失性存储介质110。在典型的实施例中,其中非易失性存储器设置在内存库214中并且每个内存库214包括可并行访问的多个存储元件216a、216b、216m,存储I/O总线210是总线阵列,其一用于跨内存库214的每一列存储元件216、218、220。如本文所用,术语“存储I/O总线”可指一个存储I/O总线210或独立的数据总线阵列,其中该阵列的各个数据总线相对于彼此传送不同的数据。在一个实施例中,访问一列存储元件(例如,216a、218a、220a)的存储I/O总线210可包括用于在一列存储元件216a、218a、220a中访问的存储分区(例如,擦除区块)的逻辑至物理映射。如果第一存储分区故障、局部故障、不可访问或具有一些其他问题,则该映射(或不良区块重新映射)使映射到存储分区的物理地址的逻辑地址重新映射到不同的存储分区。
也可通过系统总线240、桥238、局部总线206、缓冲区222以及最后通过数据总线204将数据从请求装置155传送到存储控制器104。数据总线204通常连接到由缓冲区控制器208控制的一个或多个缓冲区222a-n。缓冲区控制器208通常控制数据从局部总线206到缓冲区222的传送以及通过数据总线204到管道输入缓冲区306和输出缓冲区330的传送。缓冲区控制器208通常控制来自请求装置的数据如何能暂时地存储在缓冲区222中,然后传送到数据总线204上,或反之亦然,以占据不同的时域、防止数据冲突等。缓冲区控制器208通常结合主控制器224工作以协调数据流。当数据到达时,数据将到达系统总线240并且通过桥238传送到局部总线206。
通常,如由主控制器224和缓冲区控制器208所引导,数据从局部总线206传送至一个或多个数据缓冲区222。然后,数据通过非易失性控制器104流出缓冲区222直到数据总线204并且流到非易失性存储介质110上,例如,NAND闪存或其他存储介质。在一个实施例中,使用具有一个或多个存储控制器104a-104n-1和相关非易失性存储介质110a-110n-1的一个或多个数据通道传送数据和随数据到达的相关带外元数据(“元数据”),而至少一个通道(存储控制器104n和相关非易失性存储介质110n)专用于带内元数据,例如,索引信息和生成于非易失性存储装置102的内部的其他元数据。
局部总线206通常是双向总线或总线集,其使得数据和命令在非易失性存储装置控制器202的内部装置之间和在非易失性存储装置102的内部装置和连接到系统总线240的装置244-258之间传送。桥238有利于在局部总线206和系统总线240之间的通信。在本领域的技术人员将认识到其他实施例,例如,环状结构或交换星形构造和总线240、206、204、210以及桥238的功能。
系统总线240通常为主机计算系统114或安装或连接有非易失性存储装置102的其他装置的总线。在一个实施例中,系统总线240可以是PCI-e总线、串行高级技术附件(“串行ATA”)总线、并行ATA等。在另一个实施例中,系统总线240是外部总线,例如,小型计算机系统接口(“SCSI”)、火线、光纤通道、USB、PCIe-AS等。非易失性存储装置102可被封装以安装在装置的内部或作为外部连接装置。
该非易失性存储装置控制器202包括在非易失性存储装置102中控制更高级功能的主控制器224。在多个实施例中,该主控制器224通过解释对象请求和其他请求而控制数据流和引导索引的生成以将与数据相关的对象标识符映射到相关数据的物理位置,协调DMA请求等。主控制器224全部或部分控制本文所述的多种功能。
在一个实施例中,该主控制器224使用嵌入式控制器。在另一个实施例中,该主控制器224使用局部存储器,例如,动态存储器阵列230(动态随机访问存储器“DRAM”)、静态存储器阵列232(静态随机访问存储器“SRAM”)等。在一个实施例中,使用主控制器224控制局部存储器。在另一个实施例中,主控制器224通过存储器控制器228访问局部存储器。在另一个实施例中,主控制器224运行Linux服务器并且可支持多种通用服务器接口,例如,万维网、超文本标记语言(“HTML”)等。在另一个实施例中,该主控制器224使用纳米处理器。可使用可编程的或标准的逻辑或以上所列的控制器类型的任何组合构造该主控制器224。本领域的技术人员将认识到多个用于主控制器224的实施例。
在一个实施例中,在存储装置/非易失性存储装置控制器202控制多个数据存储装置/非易失性存储介质110a-n的情况下,该主控制器224在内部控制器(例如,存储控制器104a-n)之间划分工作负载。例如,该主控制器224可划分要写入数据存储装置(例如,非易失性存储介质110a-n)的对象,使得一部分对象被存储在每个附加的数据存储装置上。该特征属于性能的增强以使得存储和访问对象的速度更快。在一个实施例中,使用FPGA执行主控制器224。在另一个实施例中,在主控制器224中的硬件可通过管理总线236、连接到NIC244的网络上的系统总线240或连接到系统总线240的其他设备来更新。
在一个实施例中,控制对象的所述主控制器224模拟区块存储器,使得主机计算系统114或连接到存储装置/非易失性存储装置102的其他装置将存储装置/非易失性存储装置102视为区块存储装置并且将数据发送至在该存储装置/非易失性存储装置102中的特定物理地址。然后,该主控制器224划分区块并且如存储对象一样存储数据区块。然后,该主控制器224将区块和随区块一起发送的物理地址映射到由主控制器224确定的实际位置。该映射存储在对象索引中。通常,对于区块模拟,将区块装置应用程序接口(“API”)设置在计算机(例如,该主机计算系统114)中的驱动器中,或希望将存储装置/非易失性存储装置102用作区块存储装置的其他装置中。
在另一个实施例中,该主控制器224配合NIC控制器244和嵌入式RDMA控制器246以进行及时的数据和命令集的RDMA传输。NIC控制器244可隐藏在不透明的端口之后以使用定制的驱动器。另外,在主机计算系统114上的驱动器可通过使用标准堆栈API和结合NICs244运行的I/O存储器驱动器而接入计算机网络116。
在一个实施例中,该主控制器224也是冗余独立驱动器(“RAID”)控制器阵列。在数据存储装置/非易失性存储装置102与一个或多个其他数据存储装置/非易失性存储装置102通过网络连接的情况下,该主控制器224可以是用于单层RAID、多层RAID、渐进式RAID等的RAID控制器。该主控制器224还使一些对象存储在RAID阵列中以及使其他对象在没有RAID的情况下被存储。在另一个实施例中,该主控制器224可以是分布式的RAID控制器元件。在另一个实施例中,该主控制器224可包括多个RAID、分布式RAID以及如本文其他地方所述的其他功能。在一个实施例中,该主控制器224控制在类RAID结构中的数据存储,在该结构中奇偶校验信息存储在逻辑页面的一个或多个存储元件216、218、220中,并且在该页面中,奇偶校验信息保护存储在相同的逻辑页面的其他存储元件216、218、220中的数据。
在一个实施例中,主控制器224配合单个或冗余网络管理器(例如,交换器)以建立路由和平衡带宽利用率、故障转移等。在另一个实施例中,主控制器224与集成专用逻辑(通过局部总线206)和相关的驱动器软件配合。在另一个实施例中,该主控制器224与附加的应用专用处理器258或逻辑(通过外部系统总线240)以及相关的驱动器软件配合。在另一个实施例中,该主控制器224与远程专用逻辑(通过计算机网络116)和相关的驱动器软件配合。在另一个实施例中,该主控制器224与局部总线206或外部总线附加的硬盘驱动器(“HDD”)存储控制器配合。
在一个实施例中,该主控制器224与一个或多个存储控制器254通信,其中存储装置/非易失性存储装置102可表现为通过SCSI总线、Internet CSI(“iSCSI”)、光纤通道等连接的存储装置。同时,该存储装置/非易失性存储装置102可自主管理对象并且可作为目标文件系统或分布式目标文件系统。也可通过对等控制器256和/或应用专用处理器258访问该主控制器224。
在另一个实施例中,主控制器224配合自动集成管理控制器以周期性地验证FPGA代码和/或控制器软件,运行时(复位)验证FPGA代码和/或在通电期间(复位)验证控制器软件,支持外部复位请求,由于监视器超时而支持复位请求,以及支持电压、电流、电源、温度和其他环境测量和阈值中断设置。在另一个实施例中,主控制器224控制垃圾收集以释放擦除区块以便再利用。在另一个实施例中,该主控制器224控制损耗均衡。在另一个实施例中,该主控制器224使数据存储装置/非易失性存储装置102被划分为多个逻辑装置并且允许基于分区的介质加密。在另一个实施例中,主控制器224通过高级的多位ECC更正支持存储控制器104。本领域的技术人员将会认识到在存储控制器202中的,或更具体地讲,在非易失性存储装置102中的主控制器224的其他特征和功能。
在一个实施例中,该非易失性存储装置控制器202包括存储器控制器228,其控制动态随机存储器阵列230和/或静态随机存储器阵列232。如上所述,存储器控制器228可以是独立的或与主控制器224集成。该存储器控制器228通常控制某些类型的易失性存储器,例如,DRAM(动态随机存储器阵列230)和SRAM(静态随机存储器阵列232)。在其他例子中,存储器控制器228也控制其他存储器类型,例如,电可擦可编程只读存储器(“EEPROM”)等。在其他实施例中,存储器控制器228控制两个或更多个存储器类型,并且该存储器控制器228可包括不止一个控制器。通常,存储器控制器228控制尽可能多的SRAM232并且通过DRAM230补充SRAM232。
在一个实施例中,对象索引存储在存储器230、232中,然后周期性地卸载到非易失性存储介质110n或其他非易失性存储器的通道中。本领域的技术人员将会认识到存储器控制器228、动态存储器阵列230和静态存储器阵列232的其他用途和构造。
在一个实施例中,非易失性存储装置控制器202包括DMA控制器226,其控制在存储装置/非易失性存储装置102和一个或多个外部存储器控制器250以及相关外部存储器阵列252和CPUs248之间的DMA操作。之所以外部存储器控制器250和外部存储器阵列252被称为外部的,是因为它们位于存储装置/非易失性存储装置102的外部。另外,DMA控制器226还可通过NIC244和相关的RDMA控制器246,用请求装置控制RDMA操作。
在一个实施例中,非易失性存储装置控制器202包括连接到管理总线236的管理控制器234。通常,管理控制器234管理存储装置/非易失性存储装置102的环境指标和状态。该管理控制器234可通过管理总线236监控装置温度、风扇转速、电源设置等。该管理控制器234可支持用于存储FPGA代码和控制器软件的电可擦除可编程只读存储器(“EEPROM”)的读取和编程。通常,管理总线236连接到在存储装置/非易失性存储装置102中的多种部件。管理控制器234可在局部总线206上传送警报、中断等,或可包括与系统总线240或其他总线的单独的连接。在一个实施例中,管理总线236是内置集成电路(“I2C”)总线。本领域的技术人员将认识到通过管理总线236连接到存储装置/非易失性存储装置102的管理控制器234的其他相关功能和使用。
在一个实施例中,非易失性存储装置控制器202包括可被定制以用于特殊应用的其他逻辑242。通常,在使用FPGA或其他可配置的控制器配置非易失性装置控制器202或主控制器224的情况下,可基于特殊应用、客户要求、存储要求等而包括定制逻辑。
图3为根据本发明示出了在非易失性存储装置102中具有写入数据管道106、读取数据管道108和吞吐量管理装置122的存储控制器104的一个实施例300的示意性框图。该实施例300包括数据总线204、局部总线206和缓冲区控制器208,其基本上与结合图2的非易失性存储装置控制器202所述的那些类似。该写入数据管道106包括打包器302和纠错码(“ECC”)生成器304。在其他实施例中,写入数据管道106包括输入缓冲区306、写入同步缓冲区308、写入程序模块310、压缩模块312、加密模块314、垃圾收集器旁路316(一部分位于读取数据管道108内)、介质加密模块318以及写入缓冲区320。读取数据管道108包括读取同步缓冲区328、ECC更正模块322、解包器324、对齐模块326以及输出缓冲区330。在其他实施例中,读取数据管道108可包括介质解密模块332、一部分垃圾收集器旁路316、解密模块334、解压缩模块336以及读取程序模块338。该存储控制器104可还包括控制和状态寄存器340、控制队列342、内存库交错控制器344、同步缓冲区346、存储总线控制器348以及复用器(“MUX”)350。非易失性控制器104的部件和相关的写入数据管道106以及读取数据管道108在下文中有所描述。在其他实施例中,可使用同步非易失性存储介质110并可排除同步缓冲区308、328。
写入数据管道106包括打包器302,其直接地或间接地通过另一个写入数据管道106阶段而接收要写入到非易失性存储器的数据或元数据段,并生成大小适于非易失性存储介质110的一个或多个数据包。数据或元数据段通常为部分数据结构(例如,对象),但是也可包括整个数据结构。在另一个实施例中,数据段是数据区块的一部分,但也可包括整个数据区块。通常,诸如数据结构的一组数据接收自计算机(例如,主机计算系统114、或其他计算机或装置)并且以流式传输到非易失性存储装置102的数据段的形式传送到非易失性存储装置102。数据段也可以另一个名称而得名,例如,数据包,但是如本文所引用,该数据段包括全部或一部分数据结构或数据区块。
每个数据结构存储为一个或多个数据包。每个数据结构可具有一个或多个容器包。每个数据包包含报头。该报头可包括报头类型字段。类型字段可包括数据、属性、元数据、数据段分隔符(多数据包)、数据结构、数据链接等等。报头也可包括关于数据包大小的信息,例如,包括在数据包中的数据的字节数。数据包的长度可由数据包的类型确定。该报头可包括确立数据包与数据结构关系的信息。例子可为使用在数据包报头的偏移量以确定在数据结构中的数据段的位置。本领域的技术人员将认识到可包括在由打包器302添加到数据的报头中的其他信息和可添加到数据包的其他信息。
每个数据包包含报头以及可能包含来自数据或元数据段的数据。每个数据包的报头包括将数据包与数据包所属的数据结构关联的相关信息。例如,报头可包括对象标识符或其他数据结构标识符以及表明数据段、对象、数据结构或形成数据包的数据块的偏移量。报头也可包括由存储总线控制器348用以存储数据包的逻辑地址。报头也可包括关于数据包大小的信息,例如,包含在数据包中的字节数。报头可还包括当重组数据段或数据结构时确定数据段相对于在数据结构中的其他数据包的所属位置的序列号。该报头可包括报头类型字段。类型字段可包括数据、数据结构属性、元数据、数据段分隔符(多数据包)、数据结构类型、数据结构链接等等。本领域的技术人员将认识到可包括在由打包器302添加到数据或元数据的报头中的其他信息和可添加到数据包的其他信息。
写入数据管道106包括ECC发生器304,其生成用于接收自打包器302的一个或多个数据包的一个或多个纠错码(“ECC”)。ECC发生器304通常使用纠错算法以生成随一个或多个数据包存储的ECC校验位。由ECC发生器304生成的ECC代码连同与ECC代码相关的一个或多个数据包包含ECC区块。随一个或多个数据包存储的ECC数据用于检测和更正通过传输和存储而引入到数据中的错误。在一个实施例中,数据包流动传输到ECC发生器304以用作长度为N的未编码的区块。计算、添加和输出长度为S的校验子以作为长度为N+S的编码的区块。N和S的值取决于被选择用以实现特殊性能、效率和稳健性指标的ECC算法的特性。在一个实施例中,在ECC区块和数据包之间没有固定的关系;数据包可包括不止一个ECC区块;ECC区块可包括不止一个数据包;并且第一数据包可在ECC区块中的任何位置结束并且第二数据包可在相同的ECC区块内在第一数据包结束之后开始。在一个实施例中,不动态地修改ECC算法。在一个实施例中,随数据包一起存储的ECC数据足够稳固以更正超过两位的错误。
有利地,使用允许超过一位更正或甚至双位更正的稳固的ECC算法使得非易失性存储介质110的寿命延长。例如,如果将闪速存储器用作在非易失性存储介质110中的存储介质,则闪速存储器可在每个擦除周期被写入大约100,000次而不出错。使用稳固的ECC算法可延长该使用期限。由于具有ECC发生器304和在非易失性存储装置102上的相应的ECC更正模块322,该非易失性存储装置102可内部更正错误并且具有比使用较小稳固性的ECC算法(例如,一位更正)更长的使用寿命。然而,在其他实施例中,ECC发生器304可使用较小稳固性的算法并且可更正一位或双位错误。在另一个实施例中,非易失性存储装置110可包括较小可靠性的存储器(例如,多层式存储单元(“MLC”)闪存)以增加容量,其中存储器在没有更稳固的ECC算法的情况下可能不是十分可靠。
在一个实施例中,写入管道106包括输入缓冲区306,其接收要写入到非易失性存储介质110的数据段和存储输入数据段,直到写入数据管道106的下一个阶段,例如,打包器302(或用于更复杂的写入数据管道106的其他阶段)准备处理下一个数据段。输入缓冲区306通常允许在数据段速率之间存在差异,并且使用适合大小的数据缓冲区通过写入数据管道106接收和处理该数据段。该输入缓冲区306也使得数据总线204以比由写入数据管道106保持的速率大的速率将数据传送至写入数据管道106以提高数据总线204的运行效率。通常,当写入数据管道106不包括输入缓冲区306时,缓冲功能在别处进行,例如,在非易失性存储装置102中,但是在写入数据管道106之外、在主机计算系统114中,(例如,在网络接口卡(“NIC”)内)、或在另一个装置处(例如,当使用远程直接存储器访问(“RDMA”)时)。
在另一个实施例中,写入数据管道106还包括写入同步缓冲区308,其在将数据包写入非易失性存储介质110之前缓冲接收自ECC发生器304的数据包。该写入同步缓冲区308位于局部时域和非易失性存储器时域之间的边界处并且提供缓冲以产生时域差异。在其他实施例中,可使用同步非易失性存储介质110和可排除同步缓冲区308、328。
在一个实施例中,写入数据管道106还包括介质加密模块318,其直接地或间接地接收来自打包器302的一个或多个数据包,并且在将数据包发送到ECC发生器304之前,使用非易失性存储装置102唯一的加密密钥加密一个或多个数据包。通常,加密整个数据包,包括报头。在另一个实施例中,不加密报头。在该文档中,应当理解加密密钥是指从存储控制器104的外部控制的保密加密密钥。
介质加密模块318和相应的介质解密模块332为存储在非易失性存储介质110中的数据提供了一定的安全保护。例如,在用介质加密模块318加密数据的情况下,如果非易失性存储介质110连接到不同的存储控制器104、非易失性存储装置102或服务器,则在不进行大量工作和不使用在将数据写入非易失性存储介质110期间所用的相同的加密密钥的情况下,不能读取非易失性存储介质110的内容。
在典型的实施例中,非易失性存储装置102不将加密密钥存储在非易失性存储器中并且不允许从外部访问加密密钥。在初始化期间,将加密密钥提供给存储器控制器104。非易失性存储装置102可使用和存储非保密的加密随机数,其结合加密密钥使用。可随每个数据包存储不同的随机数。可在具有唯一随机数的多个数据包之间拆分数据段以提高加密算法的保护。
可从主机计算系统114、服务器、密钥管理器或管理存储控制器104所用的加密密钥的其他装置接收加密密钥。在另一个实施例中,非易失性存储介质110可具有两个或更多分区并且该存储控制器104表现为如同有两个或更多个存储控制器104,并且每个在非易失性存储介质110中的单个分区上运行。在该实施例中,唯一的介质加密密钥可随每个分区一起使用。
在另一个实施例中,写入数据管道106还包括加密模块314,该加密模块在将数据段发送到打包器302之前,直接地或间接地加密接收自输入缓冲区306的数据或元数据段,该数据段使用连同该数据段而接收的加密密钥而加密。由加密模块314用于加密数据的加密密钥可能不通用于存储在非易失性存储装置102中的所有数据,但是可基于每个数据结构而变化,并且该加密密钥可连同接收数据段被接收,如下文所述。例如,用于由加密模块314加密的数据段的加密密钥可随数据段一起被接收,或被接收为部分命令以写入数据段所属的数据结构。固态存储装置102可使用和存储在结合加密密钥而使用的每个数据结构包中的非保密的加密随机数。可随每个数据包存储不同的随机数。可在具有唯一随机数的多个数据包之间拆分数据段以提高加密算法的保护。
该加密密钥可接收自主机计算系统114、另一台计算机、密钥管理器或保存用于加密数据段的加密密钥的其他装置。在一个实施例中,将加密密钥从非易失性存储装置102、主机计算系统114、或有能力执行行业标准方法以安全地传送和保护私人密钥和公开密钥的其他外部介质之一传送到存储控制器104。
在一个实施例中,加密模块314用连同数据包被接收的第一加密密钥加密第一数据包并且用连同第二数据包被接收的第二加密密钥加密第二数据包。在另一个实施例中,加密模块314用连同数据包被接收的第一加密密钥加密第一数据包并且在没有加密的情况下将第二数据包递送到下一阶段。有利地,包括在非易失性存储装置102的写入数据管道106中的加密模块314允许数据结构接数据结构或数据段接数据段的数据加密而没有单个文件系统或其他外部系统记录用于存储相应数据结构或数据段的不同的加密密钥。每个请求装置155或相关的密钥管理器独立地控制用于仅加密由请求装置155发送的数据结构或数据段的加密密钥。
在一个实施例中,加密模块314可使用非易失性存储装置102唯一的加密密钥加密一个或多个数据包。除了上述的加密之外,该加密模块314可独立地进行该介质加密。通常,加密整个数据包,包括报头。在另一个实施例中,不加密报头。经由加密模块314进行的介质加密为存储在非易失性存储介质110中的数据提供了一定安全保护。例如,在用特定的非易失性存储装置102唯一的介质加密进行数据加密的情况下,如果非易失性存储介质110连接到不同的存储控制器104、非易失性存储装置102或主机计算系统114,则在不进行大量工作和不使用在将数据写入非易失性存储介质110期间所用的相同的加密密钥的情况下,不能读取非易失性存储介质110的内容。
在另一个实施例中,写入数据管道106包括压缩模块312,其在将数据段发送到打包器302之前将用于元数据段的数据压缩。该压缩模块312通常使用本领域的技术人员已知的压缩程序压缩数据或元数据段以减少数据段的存储大小。例如,如果数据段包括512个零组成的字符串,则该压缩模块312可用代码或表示该512个零的标记代替这512个零,其中代码比由此512个零占据的空间紧密的多。
在一个实施例中,压缩模块312用第一压缩程序压缩第一区段并且传递未压缩的第二区段。在另一个实施例中,压缩模块312用第一压缩程序压缩第一区段并且用第二压缩程序压缩第二区段。在非易失性存储装置102中具有此种灵活性是有益的。使得计算机系统114或将数据写入非易失性存储装置102的其他装置均可指定压缩程序或使得一个可指定压缩程序而另一个可规定不压缩。也可基于每个数据结构类型或数据结构类别根据默认设置而选择压缩程序。例如,特定数据结构的第一数据结构可替换默认压缩程序设置,该相同数据结构类别数据结构类型的第二数据结构可使用该默认压缩程序而该相同数据结构类别数据结构类型的第三数据结构可不使用压缩。
在一个实施例中,写入数据管道106包括垃圾收集器旁路316,其作为在垃圾收集系统中的数据旁路的一部分从读取数据管道108接收数据段。垃圾收集系统(也称为“梳理器”或梳理操作)通常标记不再有效的数据包,通常因为数据包被标记以备删除或已更改并且被更改的数据存储在不同的位置。在某些点,垃圾收集系统确定存储器的特定部分(例如,擦除区块)可被恢复。作出此确定可能是因为缺乏可用的存储容量、标记为无效的数据的百分比到达阈值、有效数据的合并、用于该存储部分的错误检测率到达阈值或基于数据分布提高性能等。垃圾收集算法会考虑多种因素以确定何时恢复存储的部分。
一旦已标记存储部分以备恢复,则通常必须重新定位在该部分中的有效的数据包。垃圾收集器旁路316使得数据包被读取到读取数据管道108,然后在没有路由出该存储控制器104的情况下,直接传输到写入数据管道106。在一个实施例中,垃圾收集器旁路316是在非易失性存储装置102中运行的自动垃圾收集系统的一部分。这样就允许非易失性存储装置102控制数据以使得数据系统性地遍布非易失性存储介质110以提高性能、数据可靠性和避免对非易失性存储介质110的任意一个位置或区域的过度使用和未充分利用以及延长非易失性存储介质110的使用寿命。
垃圾收集器旁路316协调将区段插入写入数据管道106,并且其他区段由计算机系统114或其他装置写入。在所示的实施例中,该垃圾收集器旁路316位于写入数据管道106中的打包器302之前和读取数据管道108中的解包器324之后,但是也可位于读取数据管道106和写入数据管道108中的其他地方。在刷新写入数据管道108期间可使用垃圾收集器旁路316以充满剩余的逻辑页面以提高在非易失性存储介质110中的存储效率并且从而减少垃圾收集的频率。
梳理可包括更新存储在非易失性存储介质110上的数据。存储在非易失性存储介质110上的数据可能会随时间的推移而减少。存储控制器104可包括用于识别在非易失性存储装置102上的“过期”数据(在预定时间未被更改和/或移除的数据)和通过将数据重新写入不同存储位置而更新过期数据的梳理器。
在一些实施例中,垃圾收集系统、梳理器和/或垃圾收集旁路316可暂时禁用以允许数据连续地存储在非易失性存储装置102的物理存储位置上。禁用该垃圾收集系统和/或旁路316可确保写入数据管道106中的数据不与其他数据交错。例如,如下所述,当存储与原子存储请求相关的数据时,可禁用垃圾收集系统和/或垃圾收集旁路316。
在一些实施例中,垃圾收集系统和/或梳理器可局限于非易失性存储装置的物理存储空间的某个部分。例如,存储元数据(例如,下述的反向索引)可周期性地持久化到非易失性存储位置。垃圾收集和/或梳理可局限于在对应于持久化的存储元数据的非易失性存储介质的部分上运行。
在一个实施例中,写入数据管道106包括用于缓冲数据以便于高效地写入操作的写入缓冲区320。通常,写入缓冲区320包括用于数据包的足够容量以充满非易失性存储介质110中的至少一个逻辑页面。这允许写入操作将数据的整个逻辑页面发送到非易失性存储介质110而不中断。通过按大小将写入数据管道106的写入缓冲区320和读取数据管道108中的缓冲区制成相同容量或大于非易失性存储介质110中的存储写入缓冲区,写入和读取数据将更高效,因为可制作单个写入命令而非多个命令以将数据的全部逻辑页面发送到非易失性存储介质110。
虽然正填充写入缓冲区320,但是非易失性存储介质110仍可用于其他读取操作。这是有利的,因为当数据写入存储写入缓冲区和流入存储写入缓冲区停止时,具有较小写入缓冲区或不具有写入缓冲区的其他非易失性存储装置可占用非易失性存储器。读取操作将被阻塞,直到整个存储写入缓冲区被充满和程序化。用于不具有写入缓冲区或小的写入缓冲区的系统的另一个方法是刷新未满的存储写入缓冲区以允许读取。而这又是低效的,因为需要多个写入/程序周期以充满页面。
对于具有容量大于逻辑页面的写入缓冲区320的所示的实施例,包括许多子命令的单个写入命令可跟随有单个程序命令以将数据页面从每个非易失性存储元件216、218、220中的存储写入缓冲区传送到每个非易失性存储元件216、218、220中的指定的页面。该技术具有消除局部页面编程的优点,已知这种编程会降低数据可靠性和耐久性,并且当缓冲区充满时,会清空用于读取和其他命令的目标内存库。
在一个实施例中,写入缓冲区320是乒乓缓冲区,其中缓冲区的一个侧面被充满并且指定在适当的时间传送,而乒乓缓冲区的另一侧面正被填充。在另一个实施例中,写入缓冲区320包括先入先出(“FIFO”)寄存器,其容量大于数据段的逻辑页面。本领域的技术人员将认识到,在将数据写入非易失性存储介质110之前允许数据的逻辑页面被存储的其他写入缓冲区320的配置。
在另一个实施例中,写入缓冲区320的容量小于逻辑页面,使得小于一个页面的信息能写入非易失性存储介质110中的存储写入缓冲区。在该实施例中,为了防止在写入数据管道106中的停止阻止读取操作,作为垃圾收集过程的一部分,使用垃圾收集系统将需要从一个位置移动到另一个位置的数据列队。如果在写入数据管道106中发生数据停止,在编程该数据之前,该数据可通过垃圾收集器旁路316馈送到写入缓冲区320,然后传送到非易失性存储介质110中的存储写入缓冲区上以填充逻辑页面的页面。用这种方式,在写入数据管道106中的数据停止将不会停止从非易失性存储装置102的读取。
在另一个实施例中,写入数据管道106包括写入程序模块310,其在写入数据管道106中具有一种或多种用户可定义功能。写入程序模块310允许用户自定义写入数据管道106。用户可基于特定的数据要求或应用自定义写入数据管道106。在存储控制器104为FPGA的情况下,用户可使用定制命令和功能相对容易地进行写入数据管道106编程。用户也可使用写入程序模块310以包括具有ASIC的定制功能,然而,定制ASIC可能比FPGA更困难。写入程序模块310可包括缓冲区和旁路机构以允许第一数据段在写入程序模块310中进行,而第二数据段可继续通过写入数据管道106。在另一个实施例中,写入程序模块310可包括处理器内核,可通过软件对其编程。
要注意写入程序模块310显示在输入缓冲区306和压缩模块312之间,然而,写入程序模块310可位于在写入数据管道106中的任何地方并且可分布在多个阶段302-320中。另外,可有多个写入程序模块310分布在被编程的多个阶段302-320中并且独立地运行。另外,可改变阶段302-320的顺序。本领域的技术人员将认识到基于特定用户要求而对阶段302-320的顺序进行可行的改变。
读取数据管道108包括ECC更正模块322,其通过使用随请求的数据包的每个ECC块存储的ECC确定是否有错误存在于接收自非易失性存储介质110的请求数据包的ECC块中。如果存在任何错误,则ECC更正模块322更正在请求数据包中的任何错误,并且通过使用ECC,这些错误是可更正的。例如,如果ECC能检测六个位的错误,但是仅能更正三个位的错误,则ECC更正模块322更正具有最多三个错误位的请求数据包的ECC块。ECC更正模块322通过改变错误的位至正确的一或零状态而更正错误的位,使得请求的数据包与其写入非易失性存储介质110时相同并生成用于数据包的ECC。
如果ECC更正模块322确定请求数据包包含比ECC能更正的更多错误位,则ECC更正模块322不能更正请求数据包的损坏的ECC块中的错误,并且发送中断。在一个实施例中,ECC更正模块322发送具有表明请求数据包有错的信息的中断。该信息可包括ECC更正模块322不能更正错误或可暗示ECC更正模块322不能更正错误的信息。在另一个实施例中,ECC更正模块322随中断和/或信息发送请求数据包的损坏的ECC块。
在一个实施例中,损坏的ECC块或不能由ECC更正模块322更正的请求数据包的损坏的ECC块的部分由主控制器224读取、更正并且返回到ECC更正模块322以便通过读取数据管道108进一步处理。在一个实施例中,将损坏的ECC块或部分请求数据包的损坏的ECC块发送到请求数据的装置。请求装置155可更正ECC块或用另一个复制(例如,备份或镜像复制)替换该数据,然后可使用请求数据包的替换数据或将其返回到读取数据管道108。请求装置155可使用出错的请求数据包中的报头信息以确定替换已损坏的请求数据包或替换数据包所属的数据结构所需的数据。在另一个实施例中,存储控制器104使用某类型的RAID存储数据并且能恢复损坏的数据。在另一个实施例中,ECC更正模块322发送中断和/或信息并且该接收装置使与请求数据包相关的读取操作失效。本领域的技术人员将认识到,由于ECC更正模块322确定请求数据包的一个或多个ECC块是损坏的并且ECC更正模块322不能更正错误而将采取其他选择和措施。
读取数据管道108包括解包器324,其用于从ECC更正模块322直接地或间接地接收请求数据包的ECC块并且检测和移除一个或多个数据包的报头。解包器324通过检测在报头中的数据包标识符、数据长度、数据位置等而验证数据包报头。在一个实施例中,报头包括可用于验证递送到读取数据管道108的数据包是否为请求数据包的散列码。该解包器324还将报头从由打包器302添加的请求数据包移除。解包器324可定向至而非作用于特定数据包,但是会在不修改的情况下向前传送这些数据包。例子可以是在重建过程期间所需的容器标签,在重建过程中需要报头信息以用于索引重建。另外的例子包括传送多种类型的数据包以在非易失性存储装置102中使用。在另一个实施例中,解包器324的运行可能依赖于数据包的类型。
读取数据管道108包括对齐模块326,其用于从解包器324接收数据并且移除不需要的数据。在一个实施例中,发送到非易失性存储介质110的读取命令检索数据包。请求数据的装置可能不需要在被检索数据包中的全部数据,对齐模块326将不需要的数据移除。如果在被检索页面中的所有数据是请求的数据,则该对齐模块326不会将任何数据移除。
在将数据段转发到下一个阶段之前,对齐模块326以与请求数据段的装置相容的模式将数据重新格式化为数据结构的数据段。通常,由于数据由读取数据管道108处理,所以数据段或数据包的大小在不同阶段有所不同。对齐模块326使用接收到的数据将数据格式化为适合发送到请求装置155并且结合以形成响应的数据段。例如,来自一部分第一数据包的数据可结合来自一部分第二数据包的数据。如果数据段大于请求装置155所请求的数据,则对齐模块326可丢弃不需要的数据。
在一个实施例中,读取数据管道108包括读取同步缓冲区328,其在读取数据管道108进行处理之前,缓冲读取自非易失性存储介质110的一个或多个请求数据包。该读取同步缓冲区328位于非易失性存储器时域和局部总线时域之间的边界处并且提供缓冲以表明时域差异。
在另一个实施例中,读取数据管道108包括输出缓冲区330,其从对齐模块326接收请求数据包并且在传输到请求装置155之前存储数据包。输出缓冲区330解决了当数据段接收自读取数据管道108的各阶段时和当数据段传送到存储控制器104的其他部分或请求装置155时之间的差异。该输出缓冲区330也使得数据总线204以比由读取数据管道108保持的速率大的速率从读取数据管道108接收数据以提高数据总线204的运行效率。
在一个实施例中,读取数据管道108包括介质解密模块332,其用于从ECC更正模块322接收一个或多个加密的请求数据包并且在将一个或多个请求数据包发送到解包器324之前使用非易失性存储装置102唯一的加密密钥解密所述一个或多个请求数据包。通常,用于通过介质解密模块332解密数据的加密密钥与介质加密模块318所用的加密密钥相同。在另一个实施例中,非易失性存储介质110可具有两个或更多分区并且该存储控制器104表现为如同有两个或更多个存储控制器104,并且每个在非易失性存储介质110中的单个分区上运行。在该实施例中,唯一的介质加密密钥可随每个分区一起使用。
在另一个实施例中,读取数据管道108包括解密模块334,其在将数据段发送到输出缓冲区330之前解密由解包器324格式化的数据段。可使用连同读取请求被接收的加密密钥解密该数据段,该读取请求启动对由读取同步缓冲区328接收的请求数据包的检索。该解密模块334可使用连同对第一数据包的读取请求一起被接收的加密密钥解密第一数据包,然后可用不同的加密密钥解密第二数据包,或在没有解密的情况下,可将第二数据包传递到读取数据管道108的下一阶段。当数据包随非保密的加密随机数一起存储时,该随机数连同加密密钥一起使用以解密数据包。可从主机计算系统114、客户端、密钥管理器或管理存储控制器104所用的加密密钥的其他装置接收加密密钥。
在另一个实施例中,读取数据管道108包括将由解包器324格式化的数据段解压缩的解压缩模块336。在一个实施例中,解压缩模块336使用存储在数据包报头和容器标签之一或此两者中的压缩信息选择补充程序以用于通过压缩模块312压缩数据。在另一个实施例中,解压缩模块336所用的解压缩程序由请求解压缩数据段的装置确定。在另一个实施例中,该解压缩模块336基于每个数据结构类型或数据结构类别根据默认设置而选择解压缩程序。第一对象的第一数据包能够替换默认解压缩程序,并且相同数据结构类别和数据结构类型的第二数据结构的第二数据包可使用该默认解压缩程序,而相同数据结构类别和数据结构类型的第三数据结构的第三数据包可不用解压缩。
在另一个实施例中,写入数据管道108包括读取程序模块338,其在读取数据管道108中包括一种或多种用户可定义功能。读取程序模块338具有与写入程序模块310类似的特性并且允许用户将定制功能提供给读取数据管道108。读取程序模块338可位于图3中所示的位置,可位于读取数据管道108中的另一个位置,或可包括在读取数据管道108中的多个位置中的多个部分。另外,在独立地运行的读取数据管道108内的多个位置中可存在有多个读取程序模块338本领域的技术人员将了解在读取数据管道108中的其他形式的读取程序模块338。与写入数据管道106一样,可重新排列读取数据管道108的阶段并且本领域的技术人员将了解在读取数据管道108中的各阶段的其他顺序。
存储控制器104包括控制和状态寄存器340和相应的控制队列342。控制和状态寄存器340和控制队列342有利于控制排序命令和与在写入数据106管道和读取数据管道108中处理的数据相关的子命令。例如,在打包器302中的数据段在与ECC发生器304相关的控制队列342中可具有一个或多个对应的控制命令或指令。因为将数据段打包,所以一些指令或命令可在打包器302中执行。随着从数据段生成的新形成的数据包传送到下一个阶段,其他命令或指令也可通过控制和状态寄存器340传送到下一个控制队列342。
命令或指令可同时加载到控制队列342以用于被转发到写入数据管道106的数据包,当相应数据包由该阶段执行时,每个管道阶段使适当的命令或指令出栈。相似地,命令或指令可同时地加载到控制队列342以用于从读取数据管道108请求的数据包,当pulling数据包由该阶段执行时,每个管道阶段使适当的命令或指令出栈。本领域的技术人员将认识到控制和状态寄存器340以及控制队列342的其他特征和功能。
该存储控制器104和/或非易失性存储装置102可还包括内存库交错控制器344、同步缓冲区346、存储总线控制器348以及复用器(“MUX”)350。
在一些实施例中,虚拟存储层提供了存储客户端进行持久化操作的接口。该虚拟存储层可简化对于存储客户端的数据存储操作并且展示已提高的存储特性,例如,原子性、事务性支持、恢复等等。图4示出了包括虚拟存储层(VSL)430的系统的一个实施例,其为在计算机装置401上运行的存储客户端应用程序412提供了非易失性存储装置402的逻辑地址空间432。该计算机装置401可包括处理器、非易失性存储器、内存、人机接口(HMI)部件、通信接口(用于通过网络420通信)等等。
非易失性存储装置402可包括单个非易失性存储装置、可包括多个非易失性存储装置、一组存储装置或其他适合的配置。虚拟存储层430可包括驱动器、用户空间应用程序等等。在一些实施例中,该虚拟存储层430结合上述的驱动器118使用。虚拟存储层430和/或存储客户端412可具体呈现为存储在非易失性存储装置上的指令。
VSL430可通过由VSL430(VSL接口440)提供的一个或多个接口和/或API保持逻辑地址空间432并提供给存储客户端412。存储客户端412可包括,但不限于:操作系统、虚拟操作系统(如,来宾操作系统、管理程序等)文件系统、数据库应用程序、服务器应用程序、通用应用程序等等。在一些实施例中,在远程计算机装置1740上运行的一个或多个存储客户端412通过网络420访问VSL430。
VSL430被配置成在非易失性存储装置402上执行持久化存储操作,其可包括如上所述的非易失性存储装置。VSL430通过通信总线420与非易失性存储装置402连通,其可包括,但不限于:PCE-e总线、网络连接(如,无限带宽技术)、存储网络、光纤通道协议(FCP)网络、HyperSCSI等等。可根据非易失性存储装置402的容量和/或配置而配置存储操作。例如,如果非易失性存储装置402包括一次写入式区块可擦除装置,VSL430可被配置为相应地执行存储操作(如,在初始化的或被擦除的存储位置等存储数据)。
在一些实施例中,VSL430访问存储元数据434以保持在逻辑地址空间432中的逻辑标识符(如,区块)和非易失性存储装置402上的物理存储位置之间的关联。如本文所用,物理存储位置可能是指非易失性存储装置402的任何存储位置,其可包括(但不限于):存储分区、擦除区块、存储单元、页面、逻辑页面、逻辑擦除区块等。
VSL430保持在逻辑地址空间432中的逻辑标识符和非易失性存储装置402上的物理存储位置之间的“任意到任意”分配。VSL430可引起数据被写入或更新在非易失性存储装置402上的“不当位置”。在一些实施例中,按顺序或以基于日志的格式存储数据。将数据存储在不当位置提供了损耗平衡的益处和处理多个非易失性存储装置的“一次性擦除和编程”特性。此外,不当位置的写入(与单个页面相反,将数据写入逻辑存储位置)满足了非易失性存储装置402的非对称特性。非对称特性是指不同存储操作(读取、写入、擦除)花费非常不同的时间量的理念。例如,可花费比从固态存储元件介质410读取数据长十倍的时间以在非易失性存储介质410上编程数据。此外,在一些情况下,仅可将数据编程到首先被初始化的(如,已擦除的)物理存储位置。擦除操作可花费十倍于编程操作的时间(通过延长,可一百倍于读取操作的时间)。可将在逻辑地址空间432中的逻辑标识符和非易失性存储装置402上的物理存储位置之间的关联保持在存储元数据434中。
在一些实施例中,VSL430使得数据以按顺序的、基于日志的格式在非易失性存储器402上被持久化。按顺序的基于日志的存储可包括将在非易失性存储装置402上执行的存储操作的顺序持久化。在一些实施例中,数据随持久化的元数据一起存储,该元数据随数据自身在非易失性存储装置402上被持久化。例如,可使用存储在非易失性存储装置402上和/或非易失性存储装置402的当前存储位置(如,下文所述的附加点)的顺序指示符(如,时间戳、序号或其他指示符)保持所执行的存储操作的顺序。
在顺序的基于日志的格式下的持久化数据可包括在非易失性存储装置402上将描述数据的元数据持久化。该持久化元数据可随数据自身一起存储(如,在相同的编程和/或存储操作中和/或在有非易失性存储装置402支持的最小写入单元中);因此,可保证该持久化元数据可随其描述的数据一起存储。在一些实施例中,将数据以容器格式(如,数据包、ECC代码字等)存储。持久化元数据可作为数据的数据包格式的一部分(如,作为在数据包中的报头、数据脚标或其他字段)而包括在内。或者,部分持久化元数据也可与其描述的数据分开存储。
持久化元数据描述了该数据并且包括但不限于:数据的逻辑标识符(或其他标识符)、安全或访问控制参数、顺序信息(如,顺序标识符)、持久化元数据标记(如,指示出在原子存储操作中的包含内容)、事务标识符等等。持久化元数据可包括足够的信息以重建存储元数据和/或重放在非易失性存储装置402上执行的存储操作的顺序。
按顺序的基于日志的数据可包括在非易失性存储装置402上执行的存储操作的“事件日志”。因此,VSL430可通过以与事件日志顺序匹配的特定顺序访问存储在非易失性存储介质410上的数据而重放在非易失性存储装置402上执行的存储操作的顺序。按顺序的基于日志的数据格式使VSL430能在出现无效关闭(或其他失效条件)时重建存储元数据434和其他数据。不考虑无效关闭条件的用于损坏恢复和/或数据完整性的装置、系统和方法在2010年12月17日提交的题目为“APPARATUS,SYSTEM,AND METHOD FOR PERSISTENT MANAGEMENT OF DATA IN ACACHE DEVICE(高速缓存装置中数据持久化管理的装置、系统和方法)”的美国临时专利申请No.61/424,585、以及在2010年12月20日提交的题目为“APPARATUS,SYSTEM,AND METHOD FOR PERSISTENTMANAGEMENT OF DATA IN A CACHE DEVICE,(高速缓存装置中数据持久化管理的装置、系统和方法)”的美国临时专利申请No.61/425,167中有所描述,所述专利全文以引用方式并入本文。在一些实施例中,非易失性存储装置402包括辅助电源407(如,电池、电容器等)以在出现无效关闭时为存储控制器404和/或非易失性存储介质410供电。因此,非易失性存储装置402(或控制器404)可包括“保护域”或“断电安全域”(由辅助电源407限定)。数据传送到非易失性存储装置的保护域中之后,即可保证将数据在非易失性存储介质410上持久存在。作为另外一种选择或除此之外,存储控制器404可独立于主计算机装置401进行存储操作。
由VSL430执行的按顺序的基于日志的格式为存储在非易失性存储器402上的数据以及存储元数据434提供了损坏恢复和/或数据完整性。在无效关闭和重建操作之后,VSL430可将已重建的存储元数据434显示在存储客户端412上。因此,存储客户端412可将损坏恢复和/或数据完整性授权于VSL430,这可显著简化存储客户端412和/或允许存储客户端412更有效地工作。例如,文件系统存储客户端412可能需要损坏恢复和/或数据完整性服务以用于其元数据中的一些,例如,I-节点表、文件分配表等等。存储客户端412可以不必自己执行这些服务,以免使得存储客户端412开销过大和/或过于复杂。存储客户端412可通过将损坏恢复和/或数据完整性授权给VSL430而减小此开销。如上所述,VSL430以按顺序的基于日志的格式存储数据。这样,在出现关闭事件时,VSL430能够重建存储元数据434和/或使用非易失性存储装置402上按顺序的基于日志的格式化数据标识“当前”数据版本。VSL430通过VSL接口440来访问重建的存储元数据434。因此,在无效关闭后,文件系统存储客户端412可访问损坏恢复的文件系统元数据和/或可确保通过VSL430访问的文件数据的完整性。
逻辑地址空间432可能是“稀疏的”,意思是逻辑地址空间432足够大,使得所分配的逻辑标识符是非连续性的并且由一个或多个未分配的地址的区块间隔开,这样,逻辑地址空间可具有超过非易失性存储装置402的物理存储容量的逻辑容量。因此,可独立于非易失性存储装置402来限定逻辑地址空间432。逻辑地址空间432可提供比非易失性存储装置402的存储容量更大的地址空间,也可提供与非易失性存储装置402提供的存储位置分区和/或块大小不同的存储位置分区和/或块大小等。逻辑地址空间432和非易失性存储装置402之间的关联由VSL430(使用存储元数据434)进行管理。相对于更有限的块存储层和/或由具体非易失性存储装置402提供的其他存储接口,存储客户端412可充分利用VSL接口440的优势。
在一些实施例中,逻辑地址空间432可能非常大,其包括64位逻辑标识符(LID)所引用的64位地址空间。逻辑地址空间432(如,64位地址)中的每个64位逻辑标识符引用了各自的虚拟存储位置。如本文所用,虚拟存储位置是指逻辑存储容量的块(如,分配块)。VSL430可配置成能实施任意大小的虚拟存储位置;典型的大小范围为512至4086字节(或根据存储客户端412的需要,甚至为8kb到16kb);然而,就这一点而言,本公开是不受限制的。因为逻辑地址空间432(和其中的虚拟存储位置)与非易失性存储装置402的物理存储容量和/或存储分区无关,所以逻辑地址空间432可根据存储客户端412的需要进行调整。
VSL430可使用存储元数据434管理逻辑地址空间内的分配。在一些实施例中,VSL430使用前向索引保持跟踪逻辑地址空间432分配的存储元数据434。VSL430可分配逻辑地址空间432内的范围以供具体存储客户端412使用。可为具体存储客户端412分配逻辑标识符以使存储实体持久存在。如本文所用,存储实体是指在能够在非易失性存储装置402上持久存在的逻辑地址空间412中的任何数据或数据结构;因此,存储实体可包括但不限于:文件系统对象(如,文件、数据流、I节点等)、数据库基元(如,数据库表、范围等)、数据流、持久化存储器空间、存储器映射文件等等。存储实体也可称为虚拟存储器单元(VSU)。文件系统对象是指文件系统所用的任何数据结构,包括但不限于:文件、数据流、文件属性、文件索引、卷索引、节点表等。
如上所述,分配逻辑标识符是指为具体应用或存储客户端保留逻辑标识符。逻辑标识符可指逻辑地址空间432的集或范围(如,虚拟存储位置集或范围)。所分配逻辑标识符的逻辑容量可由逻辑地址空间432的虚拟存储位置的大小确定。如上所述,逻辑地址空间432可配置为提供任意预定大小的虚拟存储位置。虚拟存储位置的大小可通过一个或多个存储客户端412、VSL430等配置。
然而,除非需要,否则所分配的逻辑标识符可以不必关联到和/或分配到在非易失性存储装置402上的物理存储位置。在一些实施例中,VSL430分配在逻辑地址空间432中具有大的连续范围的逻辑标识符。由VSL430提供的大地址空间(如,64位地址空间)可以在逻辑地址空间中提供大的连续范围。例如,为文件分配的逻辑标识符可通过VSL430与在逻辑地址空间432中2^32连续虚拟存储位置的地址范围相关以用于文件数据。如果虚拟存储位置(如,分配块)为每个512个字节,所分配的逻辑标识符可表示二(2)兆兆字节的逻辑容量。非易失性存储装置402的物理存储容量可小于二(2)兆兆字节和/或可足够存储仅少量此类文件,使得如果逻辑标识符分配要在物理存储空间中形成等量分配,VSL430将迅耗尽非易失性存储装置402的容量。然而,有利的是,VSL430被配置为在逻辑地址空间432内分配大的连续范围,并且将非易失性存储装置402上物理存储位置至逻辑标识符的分配延迟,直到必须分配时才进行。相似地,VSL430支持使用“稀疏的”分配逻辑范围。例如,存储客户端412可要求第一数据段在分配逻辑标识符的“前部”持久化,而第二数据段在分配逻辑标识符的“尾部”持久化。VSL430可在需要将第一和第二数据段持久化的非易失性存储装置402上仅分配那些物理存储位置。对于不用于将数据持久化的分配逻辑标识符,VSL430可能不会在非易失性存储装置402上分配或保留物理存储位置。
VSL430会保持存储元数据434以跟踪逻辑地址空间中的分配以及跟踪逻辑地址空间432中逻辑标识符与非易失性存储介质410上物理存储位置之间的分配。在一些实施例中,VSL430使用单个元数据结构跟踪逻辑分配和物理存储位置分配。作为另外一种选择或除此之外,VSL430可被配置为使用单独的物理保留元数据跟踪逻辑分配元数据中的逻辑分配以及跟踪非易失性存储介质410上分配的物理存储位置。
存储客户端412可通过VSL接口440访问VLS430。在一些实施例中,客户端412可将某些功能授权给VSL。例如,如上所述,存储客户端412可利用VSL430的按顺序的基于日志的格式以将损坏恢复和/或数据完整性功能授权给VSL430。在一些实施例中,存储客户端也可将逻辑地址空间432中的分配和/或物理存储保留授权给VSL430。
通常,存储客户端412(例如,文件系统)会跟踪可用的逻辑地址和/或物理存储位置。可用于存储客户端412的逻辑存储位置可能受限于基础非易失性存储装置(或其分区)的物理存储容量。因此,存储客户端412可保持“反映”非易失性存储装置的物理存储位置的逻辑地址集。例如,如图4中所示,存储客户端412可识别用于新文件的一个或多个可用的逻辑块地址(LBA)。由于在常规的具体实施中LBA直接映射到物理存储位置,因此LBA不太可能是连续性的;连续LBA的可用性取决于基础块存储装置的容量和/或是否该装置是“成碎片的”。存储客户端412随后进行块级别的操作以通过特别是块存储层(如,块装置接口)存储文件。如果基础存储装置提供逻辑块地址和物理存储位置之间的一对一映射,与传统存储装置一样,块存储层会进行合适的LBA到物理地址转换以及执行所请求的存储操作。然而,如果基础非易失性存储装置不支持一对一映射(如,基础存储装置是根据本发明实施例的顺序或写入不恰当位置装置,例如,非易失性存储装置),则需要另一个转换冗余集(如,闪存转换层或其他映射)。转换冗余集和存储客户端412保持逻辑地址分配的要求可代表对由存储客户端412执行的存储操作的明显开销并且可使得在没有耗时的“碎片整理”操作的情况下很难或不可能分配连续LBA范围。
在一些实施例中,存储客户端412将分配功能授权给VSL430。存储客户端412可访问VSL接口440以请求逻辑地址空间432中的逻辑范围。VSL430使用存储元数据434跟踪逻辑地址空间432的分配状态。如果VSL430确定所请求的逻辑地址范围未分配,VSL430将为存储客户端412分配请求的逻辑地址范围。如果所请求的范围已分配(或仅一部分范围未分配),VSL430可返回逻辑地址空间430中的替代范围和/或返回错误。在一些实施例中,VSL430可返回包括逻辑地址连续范围的逻辑地址空间430中的替代范围。具有逻辑地址的连续范围通常简化了与该逻辑地址范围相关联的存储实体的管理。VSL430使用存储元数据434保持逻辑地址空间432与非易失性存储装置402上物理存储位置之间的关联,因此不需要地址转换的冗余集。此外,VSL430使用存储元数据434来识别未分配的逻辑标识符,从而减小了存储客户端412的开销。
在一些实施例中,VSL430在逻辑地址空间432内作出分配,如上所述。VSL430可访问包括所分配逻辑地址范围的索引(如,图5的前向索引)来识别未分配的逻辑标识符,该未分配的逻辑标识符根据请求被分配给存储客户端412。例如,VSL430可保持具有范围编码的树数据结构的存储元数据434,如上所述;树中的条目可代表逻辑地址空间432中的已分配逻辑标识符,树中的“孔”代表未分配的逻辑标识符。作为另外一种选择或除此之外,VSL430保持可分配到存储客户端的未分配逻辑标识符的索引(如,无需搜索前向索引)。
图5示出了存储元数据,尤其是前向索引504的一个例子,该前向索引保持一个或多个非易失性存储装置(如,上述的存储装置106)的逻辑地址空间的分配。可进一步配置前向索引504以保持所分配逻辑标识符与非易失性存储装置上物理存储位置之间的分配。前向索引504可通过VSL430、存储控制器(如,上述的存储控制器404)和/或(如,上述的驱动器118)等保持。
在图5的例子中,数据结构504作为范围编码的B树实现。然而,就这一点而言,本公开是不受限制的;可使用合适的数据结构实现前向索引504,该数据结构包括但不限于:树、B树、范围编码的B树、基数树、映射、内容可寻址映射(CAM)、表格、哈希表或其他合适的数据结构(或数据结构的组合)。
前向索引504包括多个条目505(条目505A-G),每个条目代表逻辑地址空间中的一个或多个逻辑标识符。例如,条目505B指逻辑标识符515(LID072-083)。数据可按顺序或“在不当位置”存储于非易失性存储装置上,这样,逻辑标识符与物理存储位置之间可能不存在对应。前向索引504保持所分配逻辑标识符与物理存储位置之间的分配(如,使用物理存储位置基准517)。例如,基准517B将逻辑标识符515(LID072-083)分配到非易失性存储装置的一个或多个物理存储位置。在一些实施例中,基准517包括非易失性存储装置上的物理地址。作为另外一种选择或除此之外,基准517可对应于次级数据结构(如,反向索引)等。基准517可根据数据物理存储位置的变化(如,由于梳理操作、数据更新、更改、覆写等引起的变化)进行更新。
在一些实施例中,一个或多个条目505可代表已分配到存储客户端但是未分配到任何具体物理存储位置的逻辑标识符(如,存储客户端未促使数据写入逻辑标识符)。未分配条目505的物理存储位置基准517可标记为“空”或未分配。
条目505通过边缘507排列到树数据结构中。在一些实施例中,条目505通过逻辑标识符进行索引,从而可以快速高效地查找条目505。在图5的例子中,条目505以逻辑标识符顺序排列,使得条目505C引用“最低”逻辑标识符而505G引用“最大”逻辑标识符。通过穿过前向索引504的边缘507而访问具体条目505。在一些实施例中,前向索引504是平衡的,使得所有叶条目505在树中具有相似的深度。
为清楚起见,图5的例子示出了具有数字逻辑标识符的条目505,然而,就这一点而言,本公开是不受限制的,并且本领域的技术人员将会知道条目505可包括任何合适的逻辑标识符表示,包括但不限于:α-数字字符、十六进制字符、二进制值、文本标识符、哈希码等。
索引504的条目505可引用不同尺寸和/或长度的逻辑标识符;单个条目可51205可引用多个逻辑标识符(如,逻辑标识符集、逻辑标识符范围、非连续的逻辑标识符集等等)。例如,条目505B表示连续范围的逻辑标识符072-083。索引504的其他条目可表示非连续的逻辑标识符集;条目505G表示逻辑标识符454-477和535-598,每个逻辑标识符通过各自的基准517G和527G分配到各自的物理存储位置。使用适合的技术,前向索引504可表示逻辑标识符;例如,条目505D引用逻辑标识符178和长度15,其对应于一系列逻辑标识符178-192。
在一些实施例中,条目504包括和/或引用元数据519,其可包括与逻辑标识符有关的元数据,例如,寿命、大小、逻辑标识符属性(如,客户端标识符、数据标识符、文件名称、组标识符)、基础物理存储位置等等。元数据519可按逻辑标识符(通过与各自条目505的关联)进行索引,这样,不论数据基础物理存储位置如何变化,元数据519都可保持与条目505相关。
索引504可用于有效地确定非易失性存储装置是否包括具体逻辑标识符。在一个例子中,存储客户端可请求分配具体逻辑标识符。如果索引504包括具有所请求逻辑标识符的条目505,则与请求相关的逻辑标识符可标识为已分配。如果逻辑标识符不在索引中,可通过在索引504中建立新的条目505而将其分配到请求者。在另一个例子中,存储客户端请求具体逻辑标识符的数据。数据的物理存储位置通过基准517访问具有逻辑标识符的条目505的物理存储位置进行确定。在另一个例子中,客户端更改了与逻辑标识符有关的数据。在另一个例子中,存储客户端更改了具体逻辑标识符的现有数据。修改过的数据按顺序写入非易失性存储装置上的新物理存储位置,并且索引504中条目505的物理存储位置基准517将会更新以引用新数据的物理存储位置。可将旧数据标记为无效以在梳理操作中回收。
图5的前向索引504保持逻辑地址空间,这样,将按逻辑标识符进行索引。如上所述,在索引504中的条目505包括非易失性存储装置上物理存储位置的基准517。在一些实施例中,基准517可包括物理存储位置的物理地址(或地址范围)。作为另外一种选择或除此之外,基准517可以是间接性的(如,引用次级数据结构,例如反向索引)。
图6示出了用于保持与非易失性存储装置的物理存储位置相关的元数据的反向索引622的一个例子。在图6的例子中,反向索引622作为表格数据结构实施。然而,就这一点而言,本公开是不受限制的,并且可使用任何适合的数据结构来实施反向索引622。例如,在一些实施例中,反向索引622以具有上述前向索引504的相同数据结构(如,可包括反向索引622的部分和/或条目作为前向索引504的叶条目)实施。索引622包括多个条目620(显示为表格数据结构622中的行),其中每个条目可包括条目ID624、物理地址626、与存储在非易失性存储介质410上的物理地址626的数据关联的数据长度628(在这种情况下,数据是压缩的)、有效标签630、与数据关联的逻辑地址632、与逻辑地址632关联的数据长度634以及其他杂项数据636。在另一个实施例中,反向索引622可包括指示符,用于指示物理地址626存储的是脏数据还是干净数据等。
可根据具体非易失性存储装置的配置和/或布局来组织反向索引622。因此,反向索引622可按存储分区(如,擦除块)、物理存储位置(如,页面)、逻辑存储位置等等排列。在图6的例子中,将反向索引622排列到多个擦除块(640、638和642)中,每个块均包括多个物理存储位置(如,页面、逻辑页面等等)。
条目620包括与包含图5的条目505F的数据的物理存储位置相关的元数据。条目620表明物理存储位置在擦除区块n638中。擦除区块n638之前为擦除区块n-1640并且之后为擦除区块n+1642。(擦除区块n-1和n+1的内容未示出)。
条目ID624可以是地址、虚拟链接或其他数据以使反向索引622中的条目与前向索引504(或其他存储元数据)中的条目相关。物理地址626表明在非易失性存储装置(如,非易失性存储介质410)上的物理地址。与物理地址626相关的数据长度628确定存储在物理地址626的数据的长度。物理地址626和数据长度628一起可称为目标参数644。
逻辑标识符632和数据长度634可称为源参数646。逻辑标识符632使条目与逻辑地址空间的逻辑标识符相关。逻辑标识符632可用于使反向索引622中的条目与前向索引504的条目505相关。数据长度624是指逻辑地址空间(如,从存储客户端的角度)中的数据的长度。由于特别是数据压缩、报头开销、加密开销等,源参数646数据长度634可不同于源参数644数据长度634。在图6的例子中,与条目620相关的数据是可高度压缩的并且从逻辑地址空间中的64个块压缩至非易失性存储装置上的1个块。
有效标签630表明映射到条目620的数据是否有效。在这种情况下,与条目620相关的数据是有效的并且在图6中被示出为条目620的行中的“Y”。如本文所用,有效数据是指最新的并且未被删除和/或废弃的(覆写或修改)数据。反向索引622可跟踪非易失性存储装置的每个物理存储位置的有效性状态。前向索引504可包括仅对应于有效数据的条目。在图6的例子中,条目“Q”648表明与条目648相关的数据是无效的。注意前向索引504不包括与条目Q648相关的逻辑地址。条目Q648可对应于条目505C的数据(由现存储在条目“C”处的数据覆写)的过时版本。
反向索引622可保持用于无效数据的条目使得有效的和无效的数据均可被快速地区分以供存储恢复(如,梳理)。在一些实施例中,当作为高速缓冲存储器运行时,前向索引504和/或反向索引622可以类似的方式跟踪脏数据和干净数据以从干净数据中区分脏数据。
在一些实施例中,反向索引622可省略源参数646。例如,如果源参数646随数据存储,则可能在所存储数据的报头中,反向索引622可通过包括与该数据相关的物理地址626来间接地识别逻辑地址并且可从所存储的数据识别源参数646。
反向索引622还可包括其他杂项数据636,例如文件名、对象名、源数据、存储客户端、安全标记、原子性标记、事务标识符等。本领域的技术人员将认识到可用在反向索引622中的其他信息。虽然物理地址626示出在反向索引622中,但在其他实施例中,物理地址626或其他目标参数644可包括在其他位置中,例如,在前向索引604、中间表格或数据结构等中。
反向索引622可由擦除块或擦除区域(或其他存储分区)布置使得遍历一部分索引允许梳理器识别在特定存储分区(如,擦除区块638)中的有效数据并且量化有效数据(或反之无效数据)的量。梳理器可部分地基于每个分区中有效和/或无效数据的量而选择用于恢复的存储分区。
在一些实施例中,梳理器和/或垃圾回收处理局限于在物理存储空间的某些部分中运行。例如,存储元数据434的部分可周期性地被持久化在非易失性存储装置402上,并且垃圾回收器和/或梳理器可局限于在对应于已持久化的元数据434的物理存储位置上运行。在一些实施例中,根据相对寿命(如,顺序)将存储元数据434持久化,将较旧的部分持久化,而将更多的现有部分保留在易失性存储器中。因此,梳理器和/或垃圾回收系统可局限于在物理地址空间的较旧的部分中运行并且,同样,不太可能影响在进程中的原子存储请求的数据。因此,在一些实施例中,当处理原子存储请求时,垃圾回收系统和/或梳理器可继续运行。作为另外一种选择或除此之外,垃圾回收系统和/或梳理器可访问存储元数据和/或飞行索引(下文中所述)以防止干扰原子存储操作。
再次参见图4,可配置非易失性存储装置402以用顺序的、基于日志的格式将数据存储在非易失性存储介质410上。因此,非易失性存储装置的内容可包括在非易失性存储介质410上的存储操作的有序“事件日志”。可通过在非易失性存储装置402的物理存储空间中的附加点处添加数据来保持存储操作的顺序次序。作为另外一种选择或除此之外,可通过存储在非易失性存储装置402上的持久化数据保持顺序信息。例如,在存储装置上的每个存储分区可包括各自的指示符(如,时间戳、顺序号或其他指示符)以指示事件日志中存储分区的顺序。
图7A示出了非易失性存储装置的物理存储空间700。物理存储空间700设置在存储分区(如,擦除区块712)中,每个存储分区都可在单一操作中被初始化(如,被擦除)。每个存储分区包括能存储数据的多个物理存储位置(如,页面或逻辑页面)。
每个物理存储位置可分配范围从零(0)至N的各自的物理地址。数据按顺序存储在附加点720处。附加点720按顺序移动通过物理存储空间700。在将数据存储在附加点720之后,附加点按顺序推进至下一个可用的物理存储位置。如本文所用,可用的物理存储位置是指已初始化且准备存储数据(如,已擦除)的物理存储位置。一些非易失性存储介质(例如,非易失性存储介质410)在擦除后可仅编程一次。因此,如本文所用,可用的物理存储位置可指处于初始化(或已擦除)状态的存储位置。如果该顺序中的下一个存储分区不可用(如,包括有效数据、未被擦除或初始化、失效等),则附加点720选择下一个可用的物理存储位置。在图7的例子中,在将数据存储在物理存储位置716上之后,附加点720可跳过不可用的存储分区713,并且在下一个可用的位置处(如,存储分区718的物理存储位置717)继续。
在将数据存储在“最后”存储位置(如,存储分区815的存储位置N718)之后,附加点720绕回到第一分区712(或如果712不可用,则回到下一个可用的存储分区)。因此,附加点720可以周期或循环方式处理物理地址空间710。如图7B中所示,附加点720按顺序循环通过非易失性存储装置的存储位置701。
如上所述,顺序的、基于日志的格式的存储数据可包括在描述存储于其上的数据的非易失性存储装置402上将元数据持久化。该持久化元数据可包括与数据相关的逻辑标识符和/或提供与在非易失性存储装置上进行的存储操作的顺序次序相关的顺序信息。因此,该顺序的、基于日志的数据可表示跟踪在非易失性存储装置402上进行的存储操作的顺序的“事件日志”。
图8示出了顺序的、基于日志的数据格式(数据包格式810)的一个例子。数据包810包括数据段812,该数据段包括一个或多个逻辑标识符的数据。在一些实施例中,数据段812包括压缩的、加密的和/或白化的数据。此外,数据段812可在一个或多个纠错码数据结构(如,ECC代码字)中编码。数据段812可以为预定大小(如,固定的“块”或“段”大小)。或者,数据段812可具有可变大小。
数据包810包括存储在非易失性存储装置上的持久化元数据814。在一些实施例中,持久化元数据814随数据段812(如,作为数据包报头、数据脚等)一起存储。持久化元数据814可包括用于识别与数据段812相关的逻辑标识符的逻辑标识符指示符815。逻辑标识符指示符815可用于重建存储元数据,例如前向索引(如,前向索引504)和/或反向索引(如,反向索引622)。持久化元数据814可还包括有一个或多个元数据标记817。如下所述,标记817可用于支持原子存储操作、处理等。
在一些实施例中,数据包810与顺序指示符818相关。可将顺序指示符818在具有数据包810的存储位置(如,页面)上和/或在数据包810的存储分区(如,擦除区块)上持久化。作为另外一种选择,可将顺序指示符818在单独的存储位置中持久化。在一些实施例中,当存储分区可用时(如,当擦除时、当编程第一和最后存储位置时等),应用顺序指示符。顺序指示符818可用于确定在非易失性存储装置上的存储操作的暂时的顺序次序。
再次参见图4,本文所公开的顺序的、基于日志的格式使VSL430在无效关闭事件中(或其他失效条件下)可重建存储元数据434以及其他数据。
存储元数据434(如,图5的前向索引504)保持在逻辑标识符和非易失性存储装置上的物理存储位置之间的分配。因此,在逻辑标识符和物理存储位置之间可能不存在预定的映射;逻辑标识符的数据可存储在非易失性存储装置的任意物理存储位置。此外,因为按顺序和以基于日志的格式存储数据,所以当数据被覆写或修改时,可保留先前版本的数据(直至在梳理操作中恢复)。
再次参见图7B,字母A-L表示存储在非易失性存储装置的物理存储位置上的数据。数据A最初存储在物理存储位置750。当在位置750处将数据A持久化时,更新对应的前向索引条目705的物理存储位置基准717以引用物理存储位置80。另外,可更新反向索引条目722以表明物理存储位置80包括有效数据和/或以使物理存储位置750与逻辑标识符205-212(未示出)相关。(为清楚起见,从图7B中省去前向索引和/或反向索引的其他部分)。
当数据A被修改和/或覆写时,已更新的数据可不存储在初始物理存储位置750中。相反,按顺序(不在适当的位置上)将已更新的数据A'存储在存储位置751(在附加点720的当前位置)。相应地更新存储元数据。更新前向索引条目705以使逻辑标识符205-212与包含A'的物理存储位置81相关。更新反向索引的条目722以将物理存储位置80标记为无效并且表明物理存储位置81包含有效数据。将物理存储位置80标记为无效可使得存储位置80在梳理和/或垃圾回收操作中被回收,如上所述。
用数据A''进一步更改和/或覆写数据A'。已更新的数据A''存储在当前附加点720(物理存储位置752)处。如上所述,更新存储元数据:更新前向索引条目705以使该条目与物理存储位置752相关,并且更新反向索引条目724以表明物理存储地址82包含有效数据(而且物理地址81包含无效数据)。
“过时”版本A和A'可保留在非易失性存储装置上,直到在梳理操作中将相应的物理存储位置80和/或81回收(如,被擦除)。
可以上述顺序的、基于日志的格式(“事件日志”格式)存储数据A、A'和A''。可通过顺序的、基于日志的格式化数据重建存储元数据,例如图5的前向索引504。随数据A、A'和/或A''存储的持久化元数据的逻辑标识符指示符可表明存储在物理存储位置80、81和82处的数据对应于逻辑标识符205-212。数据A、A'和/或A''(和/或附加点50的位置)的顺序指示符表明物理存储位置82包含数据当前的有效复制。因此,可重建前向索引条目705以使逻辑标识符205-212与物理存储位置82相关。另外,可重建反向索引条目722、723和/或724以表明物理存储位置750和751包含无效数据,而且物理存储位置752包含有效数据。
可利用本文所公开的存储元数据和顺序的、基于日志的数据存储来实施有效的原子操作。许多应用程序(如,用户应用程序412)依赖于原子存储操作。原子存储操作可局限于相对小的、固定大小的数据(如,块存储装置中的单个扇区)。原子存储操作可需要“写时拷贝”操作以确保一致性(如,允许原子存储操作回滚,如果需要的话),这可显著影响原子存储操作的性能。此外,对原子存储操作的支持可通常由保持与原子存储操作相关的其自身的单独元数据的层提供,这导致重复劳动、增加开销和/或降低性能。
在一些实施例中,利用和/或扩展存储元数据434以通过VSL接口440提供有效的原子存储操作。可通过推迟更新保持存储元数据434的一致性,直至完成包括原子存储请求的一个或多个存储操作。与在“进行中的”(如,尚未完成的进行中的操作)存储操作相关的元数据可保持在下述的单独的“飞行”元数据中。因此,在某些实施例中,保持存储元数据434的状态直至原子存储操作成功地完成,从而排除了对大量的后失效“回滚”操作的需要。
顺序的、基于日志的数据格式提供了在非易失性存储装置402上的存储操作的“事件日志”。顺序的、基于日志的存储保留了在非易失性存储装置402上的数据(如,先前版本的数据)的多个副本。可保留先前版本直至数据在存储元数据434中被标记为无效和/或数据在梳理操作中恢复。
如上所述,存储元数据434可从存储在非易失性存储装置402上的顺序的、基于日志的数据重新构建。基于附加点和/或与数据相关的顺序指示符的位置识别数据的最新版本。在重建期间,可使用与数据相关的持久化元数据识别(和丢弃)与不完全的原子存储请求相关的数据,如图8所示。
在一些实施例中,VSL430通过以下方式提供原子存储操作:以顺序的、基于日志的格式存储数据、在非易失性存储装置上连同持久化元数据一起存储与原子存储请求相关的数据和/或当一个或多个存储操作完成时确认完成原子存储请求。原子存储请求的逻辑标识符可以是非连续性的。存储请求的完成可包括将数据传送到写入缓冲器、保护域、断电安全域,和/或将数据存储在非易失性存储装置402上。持久化元数据可在单独的存储操作中随原子存储请求的数据存储。当原子存储操作在进行中时,可通过推迟对存储元数据434的更新来保留存储元数据434,直至原子存储操作完成。与在进行中的原子存储操作相关的元数据可保持在单独的索引(飞行索引)中。在一些实施例中,第一持久化元数据标记确定与原子存储请求相关的数据,第二持久化元数据标记表明原子存储请求的完成。当非易失性存储装置402包括第一标记但不包括第二标记时,确定不完全的原子存储请求。作为另外一种选择,持久化元数据标记可包括标识符(如,事物或原子存储请求标识符)。不论无效关闭状况(例如,主计算机装置401失效、电力损失等)如何,都可完成原子存储请求的存储操作。可保留逻辑标识符和物理存储位置之间的分配直至原子存储操作完成。与进行中的原子存储操作相关的元数据可保持在飞行索引中,其可与其他存储元数据分离。可访问飞行索引以识别与原子存储请求相关的读取和/或写入危害。
图9A示出了包括前向索引904和单独的飞行索引950的存储元数据434的一个例子。类似于上述的前向索引504,索引904为用于跟踪非易失性存储装置的逻辑地址空间内的逻辑标识符的分配的范围编码的B树。前向索引904也可跟踪逻辑地址空间的可用的逻辑容量930和/或可包括未分配的索引(未示出)以跟踪逻辑地址空间的未分配部分。
原子存储请求901可包括请求以将数据以原子的方式存储到一个或多个非连续性的、连续性的或连续性和非连续性逻辑标识符的组合的集合。在图9A的例子中,原子存储请求901包括以原子的方式存储到两个非连续性逻辑标识符范围(072-120和291-347),其部分将现有数据覆写在前向索引904中。前向索引904的条目905B和905E引用现有数据。条目905B和905E可包括对数据的物理存储位置的引用和/或可使用反向索引922(为清楚起见,仅示出了一部分反向索引922和反向索引条目)的条目924和925来引用数据的物理存储位置960和961。如图9A中所示,原子存储请求扩展了072-083至072-120的逻辑标识符范围。因此,处理原子存储请求可包括分配逻辑地址空间中的其他逻辑标识符。新的逻辑标识符可分配在前向索引904中(在未分配的条目(未示出)中),或如图9A-9C所示的飞行数据结构950中。
如上所述,当数据存储在非易失性存储装置402上时,可更新存储元数据434。该更新可包括更新前向索引904中的一个或多个条目以将逻辑标识符分配到已更新的物理存储位置。该更新可还包括更新反向索引922以使先前版本的覆写/修改数据无效并且跟踪已更新数据的物理存储位置。该更新更改了存储元数据434的状态,这使得难以“回滚”失效的原子存储操作。此外,所述更新可使得先前版本的数据通过梳理器、垃圾回收系统或其他方法(例如高速缓存管理器等)从非易失性存储装置402中移除;如上所述,可移除包含通过从前向索引904的缺失而所指的无效数据和/或将数据标记为在反向索引922中是无效的存储位置。移除由原子存储请求的数据覆写的先前版本的数据可使得很难或不可能在失效事件中回滚原子存储请求。
使用飞行数据结构950可提供对单独使用前向索引904而跟踪进行中的存储操作而言另外的优点。例如,当执行存储请求时,可通过“专用的”或“锁定的”操作更新飞行数据结构950。如果这些更新在前向索引904(或其他共享元数据)中进行,则该锁定可阻止完成其他存储请求。在单独的数据结构中隔离这些更新可“释放”存储元数据以处理其他潜在的并行请求。另外,飞行索引950可跟踪在失效事件(如,原子存储操作)中可回滚的进行中的操作。此外,隔离在飞行索引950内进行中的元数据使得其他元数据904保持在一致状态(直至存储请求全部完成)并且可使得更高效地回滚失效的和/或不完全的存储请求。
在一些实施例中,保留存储元数据434的状态直至原子存储请求完成。可在单独的数据结构(例如,发行索引950)中跟踪原子存储请求(如,请求901)的进程。可基于原子存储请求的完成(和/或基于到达确保原子存储操作完成后的点)将飞行索引950的修改形式应用到存储元数据(前向索引904和/或反向索引922)。
图9A中示出的飞行索引950可包括来自前向索引904的单独的数据结构。就这一点而言,本发明是不受限的;在其他实施例中,飞行索引950可作为前向索引条目的元数据条目等在前向索引904中(使用索引904中的专用条目)实施。
飞行索引950可包括任何适合的数据结构(如,树、B树、基数树、映射等)。在图9A的例子中,飞行索引950使用范围编码树实施。飞行索引950中的条目906可通过逻辑标识符而被索引,如上所述。
将条目906B和906E添加到对应于原子存储请求901的飞行索引950。条目906B和906E识别与原子存储操作相关的逻辑标识符。如图9A所示,原子存储请求901包括两个非连续性的逻辑标识符范围。飞行索引950包括用于每个逻辑标识符范围的各自的条目906B和906E。然而,就这一点而言,本发明是不受限的并且可用于生成每个逻辑标识符的条目以用于请求中逻辑标识符的子范围等。
原子存储请求901的一个或多个部分完成时,作为响应,更新飞行索引950。图9B示出了存储原子存储请求901的第一部分数据后的飞行索引950。条目906E表明与逻辑标识符291-347相对应的数据已成功保存在物理存储位置972-1028处。或者,也可以用次级数据结构(如单独的反向索引等)查阅物理存储位置。前向索引904和反向索引922保持不变。
飞行索引还对应原子存储请求901的其他部分的完成而进一步更新。图9C示出了原子存储请求完成时的飞行索引950。更新飞行索引条目906B,以便将物理存储位置分配至逻辑标识符072-083。前向索引904和/或反向索引922保持不变。
可以在检测到原子存储请求901完成和/或确定原子存储请求901将会成功完成(如,已在非易失性存储装置402的写入数据管道或写入缓冲区处接收到原子存储请求)时,作为响应,更新存储元数据434。
图9D示出了完成原子存储请求901之后更新的存储元数据434。如图9D所示,可以将条目906B和906E从飞行索引950中删除。另外,可以更新反向索引922,使原子存储请求进行的数据覆写和/或修改无效(如,失效条目924和925),并添加表示更新数据存储位置的条目926和927。更新前向索引904的条目950B和950E,以便将原子存储请求901的逻辑标识符分配至更新的物理存储位置926和927。更新还可以包括将条目950B从逻辑标识符范围072-83扩大至072-120。更新过程中可以锁定前向索引904和/或它的某些部分。锁定可以防止由于同时进行的存储请求而可能发生的读/写危害。
在一些实施例中,用飞行索引950避免写和/或读危害。如图9E所示,可以在原子存储请求901之后或与其同时,但在原子存储请求901完成之前收到与原子存储请求的逻辑标识符有关的存储请求902。例如,存储请求可以涉及要被原子存储请求901覆写的逻辑标识符072-083。如果请求902是针对072-083的读出数据,由于读取条目950B的物理存储位置924将会恢复过时数据,所以该请求会造成读危害(如,写入后读取)。可以在飞行索引950中辨别读危害,其显示请求902的目标正在修改过程中。可以延迟请求902,直到原子存储请求901完成或失效(并且从飞行索引950中移除了进行中的条目906B)。可以相似地检测和解决写危害。
还可以用飞行索引950防止后续的存储请求将数据写入到原子存储请求的逻辑标识符。例如,可以存取飞行索引950的条目906B,以防止另一个存储客户端分配逻辑标识符084-120。
再参见图4,可以将数据保存在非易失性存储装置402的“事件日志”中;数据以连续的基于日志的格式保存,其中将数据附加在非易失性存储介质410的附加点处,其按顺序(并循环地)穿过非易失性存储装置402的物理存储空间。在无效关机事件中,可以用非易失性存储装置402的内容重建存储元数据434。用连续的基于日志的格式的数据能进行这种重建;数据连同将该数据与一个或多个衍生前向和/或反向索引的逻辑标识符关联起来的持久化元数据一起保存。可以根据存储操作的顺序(如,相对于附加点的位置和/或与该数据相关的序列标识符)将最新的、有效的数据与过时的或无效的数据区分开来。
在重建过程中,部分完成的原子存储操作应是可辨别的。否则,与失败的原子存储操作有关的数据会看起来像是最新版本的数据。这种可能的问题如图10所示。将数据A、B、C分别保存在物理存储位置1080、1081和1082上。随后将其他数据D保存在非易失性存储装置1002的物理存储空间内。根据随后的原子存储请求修改(覆写)数据A、B和C。原子存储请求将更新的数据A'的一部分保存在物理存储位置1090处并将更新的B'保存在1091处,但原子存储操作完成之前(在物理存储位置1092处写入C'之前)发生故障(物理存储位置1092处的附加点1020)。故障可以要求重建存储元数据(如,通过功率损耗或数据损坏进行前向索引和/或反向索引)。
如上所述,可以用非易失性存储装置上的连续的基于日志的数据的“事件日志”重建前向索引。从最后知道的附加点1020访问事件日志,该附加点对应于日志中最近的操作。在一些实施例中,附加点1020位置定期保存在非易失性存储装置上。或者,也可以用与非易失性存储装置的存储分区(如,擦除块)相关的顺序标识符确定附加点1020。通过以预定顺序(如,从最近的存储操作到以前的存储操作)遍历事件日志重建元数据。
如上所述,将数据以连续的基于日志的格式保存在非易失性存储装置1002上,其中该数据与持久化元数据保存在一起。如上所述,图8示出了包含数据段812和持久化元数据814的示例性连续的基于日志的数据格式810。持久化元数据814可以包括逻辑标识符指示符815,其指示被分配数据段812的一个或多个逻辑标识符。顺序指示符1018(作为数据格式1010的一部分包括在同一存储分区上(如,擦除块)可以用于确定数据810在事件日志中的相对顺序。
再参见图10,根据事件日志(储存在非易失性存储装置1002上的连续的基于日志的数据),失效的原子存储请求的1090处的数据A'和1091处的B'可以如同包含最新版本的数据A和B(使一个或多个先前版本的1080处的A和1081处的B过时)。然而,应该回滚原子存储请求,以保存初始数据A、B和C。这可以导致在将A和B逻辑标识符与失效原子存储请求的数据关联起来的前向索引1004中重建无效条目1005A和1005B(如,存储位置1090和/或1091)。反向索引1022可以包含不适当地使1080处的A数据和1081处的B数据无效的条目1024和1025,以及不适当地将1090和1091处的失效原子存储请求标示为有效的条目1027和1028。
在一些实施例中,持久化指示符用于跟踪非易失性存储装置上正在运行的存储请求和/或说明存储元数据丢失。如本文所用,持久化指示符是指(持久地)保存在非易失性存储装置上的指示符,它具有与其相关的数据。在一些实施例中,持久化指示符与数据一起持久存在(如,作为与该数据相关的包标题等)。可以将持久化指示符与由非易失性存储装置102支持的单次存储操作和/或最小写入单元中的数据一起保存。因此,当用非易失性存储装置的内容重建存储元数据时,持久化存储指示符将是可用的。尽管无效关机和/或存储元数据434丢失,但持久化指示符仍可以识别未完成的和/或失效的原子存储请求。
再参见图8,在一些实施例中,连续的基于日志的数据格式的持久化元数据814用于识别失效的原子存储请求。一个或多个持久化元数据标记817可以识别与原子存储请求有关的数据810和/或指示原子存储请求的完成。一个或多个持久化元数据标记817可以与单个存储操作(如,单个程序操作、写入缓冲编程操作等)中的数据段812一起保存。
在一些实施例中,属于原子存储操作的数据与第一持久化元数据标记817(如,单个位“0”)一起保存。不属于原子存储操作或指示原子存储操作完成的数据与第二持久化元数据标记817(如,单个位“1”)一起保存。图11A-C示出了示例性原子存储操作中持久化元数据标记的进程。
在图11A中,事件日志(连续的基于日志的数据)1103包含与储存在各自的物理存储位置20-25上的逻辑标识符3-8有关的数据。附加点1120用于保存下一个连续物理存储位置26处的数据。如上所述,前向索引1104将逻辑标识符4、6和8与各自的物理存储位置关联起来。
接收原子存储请求1101,以保存与一组不连续的逻辑标识符(LID4、6和8)相关的数据。在一些实施例中,原子存储请求1101通过合计一个或多个子请求而形成。可以将子请求结合到单个原子存储请求中,将它们作为一个整体使用。
在一些实施例中,原子存储请求1101的数据被连续保存在事件日志1103中,使得不属于原子存储请求1101的数据不会与原子存储请求的数据交错。然而,原子存储请求1101的逻辑标识符可以是不连续的、乱序的等。因此,当原子存储请求1101的数据正被保存在事件日志1103上时,可以暂停不属于请求1101的其他数据,如垃圾收集旁路数据、梳理数据(如,数据刷新)、其他数据请求等。
图11B示出了原子存储请求1101正在进行时存储元数据114、飞行索引1150和事件日志1103的状态。在图11B中,逻辑标识符4和6的数据已保存在事件日志1103上(如,编程为物理存储位置、流式传输至程序缓冲区等)。飞行索引1150跟踪原子存储请求的进程(如,将逻辑标识符4和6分配至包含原子存储请求1101的数据的物理存储位置26和27)。
与物理存储位置26和27上的数据一起保存的持久化元数据标记1117指示物理存储位置26和27包含与未完成的原子存储操作有关的数据(持久化元数据标记1117为“0”,而不是“1”,从第一个“0”从左向右读,原子存储操作的结束将由持久化元数据标记1117为“1”的原子存储操作的最后一个包表示)。持久化元数据标记1117可以与物理存储位置26和27上的数据一起保存。
如果发生失败,可以用持久化元数据标记1117识别与失效的原子存储请求1101有关的数据。如上文结合图10所述,使用连续的基于日志的数据的事件日志重建存储元数据。当以反向顺序(如,从左向右)遍历图11B的事件日志1103时,第一个持久化元数据标记1117将为“0”,指示出该数据与失效的原子存储请求有关。因此,可以使存储位置27处的数据无效,并且不会导致重组无效的存储元数据1134,如图10的例子所示。可以继续使数据无效或忽略它,直到在物理存储位置25处遇到“1”标记。本领域的技术人员将会知道,该方法依靠正被连续保存在事件日志1103中的原子存储请求1101的数据。如果包含“1”持久化元数据标记1117的数据与原子存储数据(原子存储请求1101完成之前)交错,26和/或27处的数据会被错误地识别为有效(如,属于完成的原子存储请求1101)。
图11C示出了原子存储请求1101的完成。原子存储请求1101的最终存储操作包括指示出原子存储请求1101已完成的“1”标记。更新前向索引1104,以分配具有更新的物理存储位置26、27和28的逻辑标识符4、6和8。更新飞行索引(移除表示逻辑标识符4、6和8的条目),以指示出原子存储请求1101已不在进行中(如,已完成)。
如果将数据保存在物理存储位置28处之后发生失败,可以正确地重建存储元数据1134。当以反向顺序(如,从附加点的左侧)遍历事件日志1103时,遇到的第一个持久化元数据标记1117将为物理存储位置28上的“1”标记,指示出物理存储位置26和27处的数据与成功完成的原子存储请求有关。
在一些实施例中,可以用非易失性存储装置的存储边界(如,页边界、逻辑页边界、存储分区、擦除块、逻辑擦除块等)限制此类原子存储请求的数据。或者,子存储请求的数据大小可以要求原子存储请求等待,直到附加点在具有足够空闲空间的存储分区上,以便在达到逻辑擦除块边界之前适合原子存储请求。因此,可以将原子存储请求的大小限定为逻辑页大小。另外,在一些实施例中,原子存储请求不会越过逻辑擦除块边界。
又如,持久化元数据标记1117可以包括标识符,其可以允许数据与原子存储请求交错和/或允许同时维护原子存储请求。
图12示出了包含持久化元数据标记1217的事件日志1203的一个例子。事件日志1203包含与具有各自的标识符ID1和ID2的两个原子存储操作有关的数据。ID1对应于与逻辑标识符4、5和9有关的原子存储请求,ID2对应于与逻辑标识符6和7有关的原子存储请求。
物理存储位置21和22上的ID1_0持久化元数据标记1217识别与还未完成的原子存储操作ID1有关的数据。物理存储位置26上的持久化元数据标记1217ID1_1指示原子存储操作ID1的成功完成。另一个持久化元数据标记1217ID2_0识别与不同的交错的原子存储操作有关的数据。物理存储位置24的持久化元数据标记1217ID2_1指示原子存储请求ID2的成功完成。不属于原子存储操作的数据可以包括“1”持久化元数据标记1217或其他预定的标识符。当用事件日志1203重建存储元数据时,如果在遇到表示完成的持久化元数据标记1217(如,ID1_1)之前(或未遇到它)遇到包含“0”标记的原子存储请求标识符(如,ID1_0),那么可以使与持久化元数据标记1217ID1相关的所有数据无效。相比之下,在遇到ID1_1标记之后,可以将与ID1持久化元数据标记1217相关的所有数据识别为与完成的原子存储请求有关。尽管图12的扩大的持久化元数据标记1217可以为原子存储操作提供更稳固的支持,但它们会增加额外的开销。
图13A-C示出了提供原子存储操作的另一种方法。当为原子存储请求提供服务时,持久化指示符1371可以保存在非易失性存储介质1370上。指示符1371识别原子存储请求并指示原子存储请求完成。持久化指示符1371可以用一个或多个逻辑标识符、逻辑标识符范围或其他合适的标识符识别原子存储请求。在一些实施例中,指示符1371可以通过其对应的逻辑标识符或其他合适的标识符识别原子存储请求。
如上所述,以连续的基于日志的格式(如,打包格式)将数据保存在非易失性存储介质1370上。每个数据包1381-1385可以包括可识别(特别是)与对应数据段相关的逻辑标识符的标题信息。如果发生无效关机或存储元数据的其他丢失,标题信息可允许用保存在非易失性存储介质1370上的数据重建存储元数据。在图13A的例子中,数据段1381、1382、1383和1385与指示符1371的原子存储操作有关,数据段1384与不同的不相关的存储操作有关(因为数据1384不包括指示符1371)。
原子存储请求的存储操作完成后,作为响应,将持久化指示符1372保存在非易失性存储介质1370上。持久化指示符1372识别原子存储请求并指示原子存储请求完成(如,指示原子存储请求的所有存储操作都已成功完成)。持久化指示符1372可以如上所述识别原子存储请求(如,通过逻辑标识符、逻辑标识符范围等)。
可以在不参考存储元数据的情况下用持久化指示符1371和1372区分完成的和未完成的(如,失效的)原子存储请求。在重建存储元数据(或进行一些其他操作,如梳理或垃圾收集)时,持久化指示符1371可识别未完成的(如,打开的)原子存储请求。与原子存储请求有关的数据包1381、1382、1383和1385可以用它们的标题信息与原子存储操作相关联(如,通过将数据包1381、1382、1384和1385的逻辑标识符与持久化指示符1371的逻辑标识符或范围进行比较)。当遇到指示符1372时,原子存储请求以及对应的数据包1381、1382、1383和1385被验证为与完成的(如,“关闭的”)原子存储请求有关。
如图13B所示,无效关机(或其他失效状况)可以防止将第二指示符1372和/或一个或多个数据包(如,数据包1385)保存在非易失性存储介质1370上。因此,图13B中的非易失性存储介质1370不包括数据包1385和/或持久化指示符1372。当遇到存储元数据(或进行另一个存储操作)时,用持久化指示符1371识别原子存储请求。如上所述,用标题信息识别与原子存储请求有关的数据包。然而,持久化指示符1372不在非易失性存储介质1370上。根据持久化指示符1372的缺失,将原子存储请求识别为未完成(失败)。如上所述,可以重新运行失败的原子存储请求。因此,可以使与未完成的原子存储请求有关的数据无效和/或不需要将它们包括在重建的存储元数据中。使数据无效可以包括在存储元数据中将数据1381、1382和1383标为无效,保存另一个持久化指示符,擦除数据等。不会使与未完成的原子存储请求无关的数据包1384(根据其标题信息)无效。
图13C示出了持久化指示符的另一个例子。在图13C的例子中,与原子存储请求相关的每个数据包(数据包1381、1382、1383和1385)包含识别原子存储请求的持久化指示符1373。有利的是,以一定方式将具有相关数据的持久化指示符1373包含在内,使得可在单个不可分割的写入操作中将指示符1373及其相关数据均写入存储介质。这样,该数据及其指示符1373要么一起成功写入,要么未一起成功写入,因此不会有介质反映的机会以及与原子请求有关的不一致状态。指示符1373可包含在原子存储请求的“第一个”数据包1381和/或其他正在处理中的数据包1382和1383的报头(或其他字段)中。与指示符1371一样,指示符1373可识别正在处理中的未完成的原子存储请求(并指示对应的一个或多个数据包为该请求的一部分)。该请求的“最后一个”数据包1385可包含指示符1375,该指示符与指示符1372一样,指示原子存储请求已完成。如果指示符1375缺失,则可以识别未完成的原子存储操作,并如上所述重新运行。指示符1373和1375可以是相同类型的指示符或包含根据特定计算法的编码,使得可通过存在指示符1373、1375或不存在指示符来指示已完成或已中断的原子存储请求状态。
图14是原子存储操作中将数据存储到非易失性存储装置上的方法1400的一个实施例的流程图。方法1400可以在非易失性存储系统内或与其相结合实施,如上文所述的存储系统102。在一些实施例中,方法1400的步骤可以在计算装置的驱动器或其他存储层中实施。因此,方法1400的某些部分可以作为在计算装置(如,图4的VSL430和/或计算装置402)的处理器上操作的计算机可读指令或模块进行实施。方法1400的指令和/或模块可存储在非瞬时性计算机可读存储介质上。
方法1400从步骤1410开始并初始化。步骤1410可包括初始化和/或分配资源以管理非易失性存储装置(如,非易失性存储装置402),例如通信接口(如,总线、网络等),分配易失性存储器,访问非易失性存储介质等等。初始化还可以包括向一个或多个存储客户端提供逻辑地址空间、初始化存储元数据等等。
步骤1420包括接收请求,以便在非易失性存储装置上执行原子存储操作。该请求可能涉及非易失性存储装置的逻辑地址空间内的一个或多个非连续的逻辑标识符组或范围。原子存储请求可通过由虚拟存储层提供的接口(如,API)接收。
步骤1430包括将与原子存储请求相关的数据存储到非易失性存储装置上。该数据可以与将该数据识别为与原子存储请求相关的持久化元数据一起保存。持久化元数据可以在单个存储操作中与该数据一起存储;例如,持久化元数据可包括在包含该数据的数据包或其他容器中。在一些实施例中,持久化元数据包含标记(如,“0”)。或者,或此外,持久化元数据可包含原子存储请求标识符等。
步骤1430可包括将数据连续存储到非易失性存储装置上的事件日志中。通过连续存储可以识别与未完成和/或失效的原子存储请求相关的数据。因此,步骤1430可包括防止与原子存储请求无关的其他数据与原子存储请求数据交错。因此,步骤1430可包括禁用写入数据管道的垃圾回收器和/或垃圾回收器旁路等。
在一些实施例中,步骤1430还包括保持现有存储元数据的状态。因此,步骤1430可包括在独立于存储元数据的前向索引的飞行索引中跟踪原子存储请求的完成情况。
步骤1440包括响应原子存储请求的完成而更新存储元数据。步骤1440可包括更新前向索引,以便将原子存储请求的逻辑标识符分配至包含原子存储请求数据的物理存储位置。步骤1440还可以包括使原子存储请求所覆写和/或修改的数据无效(如,将过时数据标记为无效、删除过时数据的引用等)。
在一些实施例中,步骤1440还包括将指示原子存储请求已完成的持久化元数据标记存储在事件日志内(如,存储在非易失性存储装置上的基于日志的顺序数据)。持久化元数据标记可以与原子存储请求的最后一个数据包一起存储。或者,或此外,持久化元数据标记可以在原子存储请求的最后一个数据包之后作为单独的数据片存储。
在步骤1450中,流程在接收下一个原子存储请求之前结束。
图15是原子存储操作中将数据存储到非易失性存储装置上的方法1500的另一个实施例的流程图1500。在步骤1510中,方法1500开始并初始化,如上所述。
步骤1520包括提供逻辑地址空间和/或维护属于非易失性存储装置的存储元数据。存储元数据可包括跟踪逻辑地址空间分配情况的前向索引。前向索引还可以保留非易失性存储装置上逻辑标识符与物理存储位置之间的分配。存储元数据还可以包含反向索引,该反向索引包含与非易失性存储装置上的物理存储位置相关的元数据。
在步骤1530中,如上所述接收执行原子存储操作的请求。
步骤1540包括在一个或多个存储操作中保存原子存储请求的数据,如上所述。步骤1540可包括将持久化元数据标记与将该数据识别为与原子存储请求相关的数据一起保存。持久化元数据标记可包括标记位(“0”或“1”)。因此,步骤1540可包括将数据连续保存到非易失性存储介质上,防止与原子存储请求无关的其他数据与原子存储请求数据交错。步骤1540可包括如上所述的禁用梳理器或垃圾回收过程和/或垃圾回收旁路。
步骤1550包括在步骤1540执行原子存储请求的存储操作时使存储元数据维持步骤1520时的状态。步骤1550可包括防止原子存储请求所覆写和/或修改的先前版本的数据被非易失性存储装置删除(如,标记为无效)。步骤1550还可以包括保留前向索引中逻辑标识符与物理存储位置之间的现有分配。
在一些实施例中,通过保留单独的飞行索引中与原子存储操作相关的数据来保存存储元数据。飞行索引可包括原子存储请求的逻辑标识符与包含原子存储请求数据的物理存储位置之间的分配。
步骤1552还可以包括借助飞行索引防止如上所述的读取和/或写入危害。步骤1552的飞行索引还可以用于防止另一个存储客户端分配原子存储操作的逻辑标识符。
步骤1560包括完成原子存储请求的一个或多个存储操作。步骤1560可包括保存具有原子存储请求的最终数据段的持久化元数据标记,以指示原子存储请求已完成。持久化元数据标记可包含“1”、标识符等。
步骤1562包括向存储客户端等确认原子存储请求的完成。步骤1562的确认可以通过回调或其他机制异步发送。或者,原子存储请求可以是同步的,并且步骤1562的确认可包括从同步功能或方法调用返回。
在一些实施例中,在可以确保原子存储请求数据将保存到非易失性存储装置上时即提供步骤1562的确认,但该确认在数据被实际保存到其上之前进行。例如,步骤1562的确认可以在将原子存储请求数据传输到非易失性存储装置的缓冲区中、写入数据管道中、将数据传输至存储控制器(如,存储控制器404的保护域内)等之后发送。
步骤1564包括更新存储元数据(如,存储元数据434),以反映原子存储请求的完成。步骤1564可包括从飞行索引删除一个或多个条目和/或根据飞行数据结构中的一个或多个条目更新前向索引。更新还可以包括使被原子存储请求覆写和/或修改的数据无效(如,在反向索引中等等)。
在步骤1570中,流程1500在接收下一个原子存储请求之前结束。
图16是原子存储操作中将数据保存到非易失性存储装置上的方法1600的一个实施例的流程图。在步骤1610、1620和1630中,方法1600开始、初始化、接收原子存储请求,以及如上所述保存具有持久化元数据标记的原子存储请求数据。
步骤1640包括在原子存储请求的一个或多个存储操作过程中保存存储元数据,如上所述。
步骤1650包括检测与非易失性存储装置相关的失效状况。失效状况的原因可以是包括(但不限于)下列的多种原因:主机计算装置的硬件故障、主机计算装置的软件故障、功率损耗等。
步骤1660包括在尽管存在失效状况的情况下完成原子存储请求。步骤1660可包括刷新非易失性存储装置的缓冲区以完成原子存储请求、对写入缓冲区的内容进行编程等。当原子存储请求完成时,非易失性存储装置可以独立于主机计算装置和/或使用辅助电源工作。辅助电源可包括电池、电容器或其他蓄电装置。
方法在步骤1670结束。
图17是用于从基于日志的顺序数据的事件日志重组存储元数据的方法1700的一个实施例的流程图。在步骤1710中,方法1700开始并初始化,如上所述。
步骤1720包括检测非易失性存储装置的无效关机。步骤1720可包括确定存储元数据不可用(如,在关机过程中未保存)。或者,或此外,步骤1720可包括确定关闭数据(如,预定数据序列)在关机之前未保存到非易失性存储装置上。检测到无效关机和/或缺乏当前存储元数据后,作为响应,方法1700通过非易失性存储装置上存储的基于日志的顺序数据中保存的存储操作事件日志重组存储元数据。
步骤1730包括确定非易失性存储装置上的当前附加点。该附加点可以保存在持久化存储位置。或者,方法1700可以确定非易失性存储装置的存储分区上使用顺序指示符的附加点。该附加点可以识别为包含最新顺序指示符的位置。在一些实施例中,通过从特定位置(如,芯片0、擦除块0、页0等)开始逐步扫描非易失性存储装置直到发现附加点来识别附加点。
步骤1740包括从附加点开始按顺序访问事件日志。步骤1740的访问可以从附加点向后遍历事件日志(如,从附加点处的最新数据开始并按照事件日志中存储操作的顺序向后移动)。
步骤1750包括根据事件日志的遍历识别失效的一个或多个原子存储操作。如上所述,数据可以与将数据识别为与原子存储操作相关的持久化元数据标记一起保存。在一些实施例中,持久化元数据标记“0”识别未完成的原子存储操作的数据,持久化元数据标记“1”指示原子存储操作的完成。当步骤1740中事件日志的遍历遇到标有“0”的数据时,步骤1750将该数据识别为与失效的原子存储请求相关,并且流程继续到步骤1760。在其他实施例中,持久化元数据标记可包括与数据分开保存的持久化指示符和/或包含原子存储请求标识符的持久化元数据标记。因此,步骤1750可包括识别与未关闭和/或未发现已完成持久化指示符的原子存储请求相关的数据。当识别出与失效(或未完成)原子存储请求相关的数据时,流程继续到步骤1760;否则,流程继续到步骤1770。
步骤1760包括使与失效的原子存储请求相关的数据无效和/或忽略该数据。步骤1760可包括从前向索引中忽略与失效原子存储请求相关的物理存储位置和/或在反向索引中将该物理存储位置标记为无效。
步骤1770包括通过事件日志的基于日志的顺序数据重建存储元数据,如上所述。与数据相关的逻辑标识符可以通过与作为基于日志的数据格式的一部分的数据一起保存的持久化元数据而确定。根据事件日志中数据的相对顺序(如,根据该数据与附加点的偏移量和/或与该数据相关的顺序指示符)确定特定逻辑标识符的最新版本的数据。
流程在步骤1780结束。