处理原子写命令的方法和设备与流程

文档序号:14835596发布日期:2018-06-30 12:16阅读:177来源:国知局
处理原子写命令的方法和设备与流程
本申请涉及存储领域,具体地,涉及固态硬盘领域,更具体地,涉及对原子写命令进行处理的方法和设备。
背景技术
:图1展示了存储设备的框图。如图1所示,固态存储设备102同主机相耦合,用于为主机提供存储能力。主机同固态存储设备102之间可通过多种方式相耦合,耦合方式包括但不限于通过例如SATA(SerialAdvancedTechnologyAttachment,串行高级技术附件)、SCSI(SmallComputerSystemInterface,小型计算机系统接口)、SAS(SerialAttachedSCSI,串行连接SCSI)、IDE(IntegratedDriveElectronics,集成驱动器电子)、USB(UniversalSerialBus,通用串行总线)、PCIE(PeripheralComponentInterconnectExpress,PCIe,高速外围组件互联)、NVMe(NVMExpress,高速非易失存储)、以太网、光纤通道、无线通信网络等连接主机与固态存储设备102。主机可以是能够通过上述方式同存储设备相通信的信息处理设备,例如,个人计算机、平板电脑、服务器、便携式计算机、网络交换机、路由器、蜂窝电话、个人数字助理等。存储设备102包括接口103、控制部件104、一个或多个NVM芯片105以及DRAM(DynamicRandomAccessMemory,动态随机访问存储器)110。NAND闪存、相变存储器、FeRAM(FerroelectricRAM,铁电存储器)、MRAM(MagneticRandomAccessMemory,磁阻存储器)、RRAM(ResistiveRandomAccessMemory,阻变存储器)等是常见的NVM。接口103可适配于通过例如SATA、IDE、USB、PCIE、NVMe、SAS、以太网、光纤通道等方式与主机交换数据。控制部件104用于控制在接口103、NVM芯片105以及DRAM110之间的数据传输,还用于存储管理、主机逻辑地址到闪存物理地址映射、擦除均衡、坏块管理等。控制部件104可通过软件、硬件、固件或其组合的多种方式实现,例如,控制部件104可以是FPGA(Field-programmablegatearray,现场可编程门阵列)、ASIC(ApplicationSpecificIntegratedCircuit,应用专用集成电路)或者其组合的形式。控制部件104也可以包括处理器或者控制器,在处理器或控制器中执行软件来操纵控制部件104的硬件来处理IO命令。控制部件104还可以耦合到DRAM110,并可访问DRAM110的数据。在DRAM可存储FTL表和/或缓存的IO命令的数据。控制部件104包括闪存接口控制器(或称为介质接口控制器、闪存通道控制器),闪存接口控制器耦合到NVM芯片105,并以遵循NVM芯片105的接口协议的方式向NVM芯片105发出命令,以操作NVM芯片105,并接收从NVM芯片105输出的命令执行结果。已知的NVM芯片接口协议包括“Toggle”、“ONFI”等。在控制部件104中运行的软件和/或固件(下面统称为“固件”)可被存储在NVM芯片105或另外的固件存储器中。在固态存储设备102上电时,从固件存储器将固件加载到DRAM110和/或控制部件104内部的存储器中。可选地,通过接口103或调试接口接收并加载固件。通常按页来在NVM上存储和读取数据。而按块来擦除数据。块包含多个页。存储介质上的页(称为物理页)具有固定的尺寸,例如17664字节。物理页也可以具有其他的尺寸。在固态存储设备中,利用FTL(FlashTranslationLayer,闪存转换层)来维护从逻辑地址到物理地址的映射信息。逻辑地址构成了操作系统等上层软件所感知到的固态存储设备的存储空间。物理地址是用于访问固态存储设备的物理存储单元的地址。在现有技术中还可利用中间地址形态实施地址映射。例如将逻辑地址映射为中间地址,进而将中间地址进一步映射为物理地址。存储了从逻辑地址到物理地址的映射信息的表结构被称为FTL表。FTL表是固态存储设备中的重要元数据。通常FTL表的数据项记录了固态存储设备中以数据页为单位的地址映射关系。在NVMe规范中定义了原子操作(AtomicOperation),具体请参见http://nvmexpress.org/wp-content/uploads/NVM_Express_1_2_1_Gold_20160603.pdf。原子操作包括原子写命令。为执行原子写命令,固态存储设备需要确保,在原子写命令中指示的数据,要么都写入到固态存储设备中,要么都未写入到固态存储设备中,而不会有其他执行结果。当同时存在向相同或部分相同的地址写入数据的两个或更多原子写命令时,这些原子写命令是串行执行的。例如,参看表1,原子写命令A向逻辑地址(LBA)0-3写入数据,原子写命令B向逻辑地址(LBA)1-4写入数据(表1中用“A”指示由原子写命令A写入的数据,而用“B”指示由原子写命令B写入的数据)。表1的第2行与第3行示出了命令A与命令B的正确执行结果。参看表1,一种可能的结果(如表1第2行所示)是,LBA0-LBA3是写命令A所写入的数据,而LBA4是写命令B所写入的数据。换句话说,写命令B先生效,原子性地更新了LBA1-4,接下来写命令A生效,又原子性地更新了LBA0-3。另一种可能的结果(如表2第3行所示)是,LBA0是写命令A所写入的数据,而LBA2-4是写命令B所写入的数据。换句话说,写命令A先生效,原子性地更新了LBA0-3,接下来写命令B生效,又原子性地更新了LBA1-4。除了上面提到的两种结果,其他任何结果都不符合NVMe规范对原子写命令的要求。例如表1第4行中的结果,对于原子写命令而言是不允许出现的。LBA0123456正确执行结果AAAAB正确执行结果ABBBB无效结果AABBB表1但是,现有技术中没有提供如何在固态存储设备中实现原子写命令,以满足NVMe规范的要求。技术实现要素:本申请的目的在于提供一种能够在固态存储设备中实现原子写命令的技术,并且满足NVMe规范的要求。根据本公开的第一方面,提供一种处理原子写命令的第一方法,包括:接收原子写命令;为所述原子写命令分配一个或多个缓存单元;响应于所述一个或多个缓存单元都可接收所述原子写命令要写入的数据,将所述原子写命令要写入的数据写入所述一个或多个缓存单元;以及向主机指示所述原子写命令处理完成。本公开根据本公开第一方面的处理原子写命令的第一方法,提供一种处理原子写命令的第二方法,其中,为所述原子写命令分配的一个或多个缓存单元包括:所述原子写命令命中的一个或多个缓存单元;和/或在所述原子写命令的部分或全部未命中缓存单元时,为所述原子写命令申请的一个或多个缓存单元。根据本公开第一方面的处理原子写命令的第一或第二方法,提供一种处理原子写命令的第三方法,其中,若所述一个或多个缓存单元的任何一个不能接收所述原子写命令要写入的数据,则暂停对所述原子写命令的处理。根据本公开第一方面的处理原子写命令的第三方法,提供一种处理原子写命令的第四方法,其中,如果所述原子写命令命中缓存单元,但所命中的缓存单元中存储有数据,则所述命中的缓存单元不能接收所述原子写命令要写入的数据。根据本公开第一方面的处理原子写命令的第三方法,提供一种处理原子写命令的第五方法,其中,如果所述原子写命令命中缓存单元,但所命中的缓存单元中存储的数据的逻辑地址范围同所述原子写命令的逻辑地址范围重叠,则所述命中的缓存单元不能接收所述原子写命令要写入的数据。根据本公开第一方面的处理原子写命令的第三至第五方法之一,提供一种处理原子写命令的第六方法,其中,如果为所述原子写命令申请的一个或多个缓存单元中存储有数据,则所申请的一个或多个缓存单元不能接收所述原子写命令要写入的数据。根据本公开第一方面的处理原子写命令的第三至第六方法之一,提供一种处理原子写命令的第七方法,进一步包括:若所述一个或多个缓存单元的任何一个不能接收所述原子写命令要写入的数据,则将不能接收所述原子写命令要写入数据的缓存单元清空。根据本公开第一方面的处理原子写命令的第七方法,提供一种处理原子写命令的第八方法,其中,将不能接收所述原子写命令要写入数据的缓存单元清空包括:将所述一个或多个缓存单元中的数据写入NVM。根据本公开第一方面的处理原子写命令的第七方法,提供一种处理原子写命令的第四方法,其中,每个缓存单元包括多个缓存子单元,将不能接收所述原子写命令要写入数据的缓存单元清空包括:如果所述缓存单元中的缓存子单元中具有尚未被写入数据的空白缓存子单元,则向所述空白缓存子单元所对应的逻辑地址发出读命令以填充所述空白缓存子单元;当所述缓存单元中的所有缓存子单元中被填充入数据后,将所述缓存单元的数据整体写入NVM。根据本公开第一方面的处理原子写命令的第一至第九方法之一,提供一种处理原子写命令的第十方法,其中,如果所述原子写命令命中一个或多个缓存单元,并且所命中的一个或多个缓存单元中已存储的数据的逻辑地址同所述原子写命令的逻辑地址不重叠,则所命中的一个或多个缓存单元可接收所述原子写命令要写入的数据。根据本公开第一方面的处理原子写命令的第二至第十方法之一,提供一种处理原子写命令的第十一方法,其中,如果在所述原子写命令的部分或全部未命中缓存单元时,为所述原子写命令申请的一个或多个缓存单元中不存在有效数据,则为所述原子写命令申请的一个或多个缓存单元可接收所述原子写命令要写入的数据。根据本公开第一方面的处理原子写命令的第二至第十一方法之一,提供一种处理原子写命令的第十二方法,其中,从缓存单元池中申请缓存单元。根据本公开第一方面的处理原子写命令的第七至第九方法之一,提供一种处理原子写命令的第十三方法,其中,在清空缓存单元期间,暂停对所述原子写命令的处理。根据本公开第一方面的处理原子写命令的第一至第十三方法之一,提供一种处理原子写命令的第十四方法,进一步包括:根据缓存单元的大小,将所述原子写命令拆分为一个或多个子命令;为每个子命令分配缓存单元;其中,每个子命令所访问的逻辑地址的范围不超过一个缓存单元的逻辑地址的范围。根据本公开第一方面的处理原子写命令的第十四方法,提供一种处理原子写命令的第十五方法,其中,为每个子命令分配的缓存单元包括:所述子命令命中的缓存单元;或者在所述子命令未命中任何缓存单元时为所述子写命令申请的缓存单元。根据本公开第一方面的处理原子写命令的第十四或十五方法,提供一种处理原子写命令的第十六方法,其中,若为所述一个或多个子命令分配的缓存单元有任何一个不能接收子命令要写入的数据,则暂停对所述原子写命令的处理,直到为所述一个或多个子命令分配的缓存单元都能接收子命令要写入的数据。根据本公开第一方面的处理原子写命令的第十六方法,提供一种处理原子写命令的第十七方法,其中,如果所述子命令命中第一缓存单元,但所述第一缓存单元中存储的数据的逻辑地址范围同所述子命令的逻辑地址范围重叠,则所述第一缓存单元不能接收所述子命令要写入的数据。根据本公开第一方面的处理原子写命令的第十七方法,提供一种处理原子写命令的第十八方法,其中,如果在所述子命令未命中任何缓存单元时为所述子写命令申请的第二缓存单元存储的数据的逻辑地址范围同所述子命令的逻辑地址范围重叠,则所述第二缓存单元不能接收所述子命令要写入的数据。根据本公开第一方面的处理原子写命令的第十六至十八方法之一,提供一种处理原子写命令的第十九方法,进一步包括:将不能接收所述子命令要写入的数据的缓存单元清空,以使得能够在所述缓存单元中写入数据。根据本公开第一方面的处理原子写命令的第十九方法,提供一种处理原子写命令的第二十方法,其中,将不能接收所述子命令要写入的数据的缓存单元清空包括:将该缓存单元中的数据写入NVM。根据本公开第一方面的处理原子写命令的第十九方法,提供一种处理原子写命令的第二十一方法,其中,每个缓存单元包括多个缓存子单元,将不能接收所述子命令要写入的数据的缓存单元清空包括:如果所述缓存单元中的缓存子单元中具有尚未被写入数据的空白缓存子单元,则向所述空白缓存子单元所对应的逻辑地址发出读命令以填充所述空白缓存子单元;当所述缓存单元中的所有缓存子单元中被填充入数据后,将所述缓存单元的数据整体写入NVM。根据本公开第一方面的处理原子写命令的第十四至二十一方法之一,提供一种处理原子写命令的第二十二方法,其中,如果所述子命令命中第三缓存单元,并且所述第三缓存单元中已存储的数据的逻辑地址同所述子命令的逻辑地址不重叠,则所述第三缓存单元可接收所述子命令要写入的数据。根据本公开第一方面的处理原子写命令的第十六方法,提供一种处理原子写命令的第二十三方法,其中,如果在所述子命令未命中任何缓存单元时为所述子命令申请的第四缓存单元中不存在有效数据,则所述第四缓存单元可接收所述子命令要写入的数据。根据本公开第一方面的处理原子写命令的第一至二十三方法之一,提供一种处理原子写命令的第二十四方法,进一步包括:响应于掉电,利用备用电源将缓存单元中的数据写入到NVM。根据本公开的第二方面,提供一种处理写命令的第一方法,包括:接收写命令;检测所述写命令是否命中缓存单元;如果所述写命令命中缓存单元,则向被命中的缓存单元中写入数据;如果所述写命令未命中缓存单元,则为所述写命令分配缓存单元。根据本公开第二方面的处理写命令的第一方法,提供一种处理写命令的第二方法,进一步包括:如果在所分配的缓存单元中存储有数据,则在将所分配的缓存单元中存储的数据清空前,暂定对所述写命令的执行。根据本公开第二方面的处理写命令的第一或第二方法,提供一种处理写命令的第三方法,进一步包括:如果所分配的缓存单元中未存储有效数据,则向所述缓存单元中写入对应于所述写命令的数据。根据本公开第二方面的处理写命令的第一方法,提供一种处理写命令的第四方法,其中,根据缓存单元的大小,将所述写命令拆分为多个子命令,其中每个子命令所访问的逻辑地址的范围不超过一个缓存单元的逻辑地址的范围。根据本公开第二方面的处理写命令的第四方法,提供一种处理写命令的第五方法,其中,所述多个子命令包括命中缓存单元的第一子命令,将第一子命令的数据写入所命中的缓存单元中,而不管其他子命令是否命中缓存单元。根据本公开第二方面的处理写命令的第四方法,提供一种处理写命令的第五方法,进一步包括:响应于将所述写命令所对应的数据写入缓存单元,向主机指示所述写命令处理完成。根据本公开第二方面的处理写命令的第一至第五方法之一,提供一种处理写命令的第六方法,响应于掉电,利用备用电源将缓存单元中的数据写入NVM。根据本公开的第三方面,提供一种存储设备,包括:一个或者多个处理器;一个或多个存储器;当存储在所述一个或者多个存储器中的程序被一个或者多个处理器执行时,所述程序使所述控制器执行如上所述的方法。根据本公开第四方面,提供一种处理原子写命令的设备,包括:用于接收原子写命令的装置;用于为所述原子写命令分配一个或多个缓存单元的装置;用于响应于所述一个或多个缓存单元都可接收所述原子写命令要写入的数据,将所述原子写命令要写入的数据写入所述一个或多个缓存单元的装置;以及用于向主机指示所述原子写命令处理完成的装置。根据本公开第五方面,提供一种处理写命令的设备,包括:用于接收写命令的装置;用于检测所述写命令是否命中缓存单元的装置;用于如果所述写命令命中缓存单元,则向被命中的缓存单元中写入数据的装置;用于如果所述写命令未命中缓存单元,则为所述写命令分配缓存单元的装置。根据本公开第六方面,提供一种计算机可读存储介质,所述计算机可读存储介质存储有程序,当所述程序被一个设备执行时,使得所述设备进行上面所述的方法。本公开至少提供了能够在固态存储设备中实现原子写命令的技术,从而满足NVMe规范的要求。附图说明图1展示了现有技术的存储设备的框图;图2示出了根据本公开实施例的存储设备的控制部件的框图;图3示出了缓存单元各个不同的状态以及状态转换示意的状态转换图图;图4示出了根据本公开实施例的处理原子写命令的方法流程图;图5A-5B是根据本发明本公开一个实施例的原子写命令的示意图以及相应的缓存单元的状态变化图;图6A-6B是根据本公开另一个实施例的原子写命令的示意图以及相应的缓存单元的状态变化图;图7A-7B是根据本公开又一个实施例的原子写命令的示意图以及相应的缓存单元的状态变化图;图8A-8B是根据本公开再一个实施例的原子写命令的示意图以及相应的缓存单元的状态变化图;图9A-9B是根据本公开依然又一个实施例的非原子写命令的示意图以及相应的缓存单元的状态变化图;以及图10是根据本公开实施例的掉电处理过程的流程图。具体实施方式下面结合附图对本公开的具体实施方式进行详细描述。需要理解的是,本公开中“第一”、“第二”仅用于指示对象,而并不用于限制数量和/或顺序。图2示出了根据本公开实施例的存储设备的控制部件的框图。控制部件104包括主机接口210、前端处理模块220、闪存管理模块230与后端处理模块240。主机接口210用于同主机交换命令与数据。在一个例子中,主机与存储设备通过NVMe/PCIe协议通信,主机接口210处理PCIe协议数据包,提取出NVMe协议命令,并向主机返回NVMe协议命令的处理结果。FTL模块230将闪存访问命令的逻辑地址转换为物理地址,并对闪存实施管理,提供磨损均衡、垃圾回收等服务。后端处理模块240依据物理地址访问一个或多个NVM芯片。将在访问FTL之前的处理称为前端处理,而将在访问FTL之后的处理称为后端处理。前端控制部件104还耦合到外部存储器(例如,RAM)260。存储器260的部分空间被用作前端缓存(前端缓存265),前端处理模块220可访问存储器260来使用前端缓存。可选地,在控制部件104内提供前端缓存模块225用作前端缓存。本公开前端缓存提供多个缓存单元。缓存单元的每个可处于多种不同状态。在可选的实施方式中,由存储器260(参看图2)提供缓存单元,而由控制部件104内部的存储器存储用于缓存单元的元数据。元数据记录与缓存单元相对应的状态、缓存单元对应的逻辑地址和/或缓存单元的缓存子单元被使用情况的记录。图3示出了缓存单元的状态转换图图。缓存单元可处于多种状态,包括“空闲”、“占用”和“淘汰”。可选地,还可以包括忙碌状态。“空闲”状态指示的是该缓存单元未被使用,“空闲”状态的缓存单元中未缓存有效数据。当向“空闲”状态的缓存单元写入了数据之后,缓存单元变为“占用”状态,以指示缓存单元中已经存储了数据。可选地,由于写入数据过程“占用”一定时间,因而,由忙碌状态指示已开始向缓存单元写入数据但写入数据的过程尚未完成的状态。将“占用”状态的缓存单元所缓存的数据写入NVM的过程称为“淘汰”。响应于“淘汰”过程开始,缓存单元进入“淘汰”状态。响应于缓存单元“淘汰”状态的结束,缓存单元重新进入“空闲”状态。“淘汰”状态也可称为“清空”状态。作为举例,每个缓存单元的大小可以为4KB。显然,缓存单元可具有其他的大小。优选地,缓存单元的大小为FTL表中的一个条目的物理地址范围所对应的数据单元大小。可选地,缓存单元还包括缓存子单元。作为举例,每个缓存子单元大小为1KB。优选地,缓存子单元的大小等于主机发送给固态存储设备的IO命令的最小数据单元大小。图4示出了根据本发明本公开一个方面实施例的处理原子写命令的方法本公开,该方法包括如下操作。首先,在操作S410,接收原子写命令。接下来,在操作S420,为原子写命令分配一个或多个缓存单元。缓存单元所对应的逻辑地址(即,缓存单元的元数据所指示的逻辑地址)范围均按例如4KB对齐(其起始地址位于4KB的整数倍地址处,例如,0、4KB、8KB),缓存单元所对应的逻辑地址空间大小为例如4KB。原子写命令的逻辑地址范围的大小同缓存单元的大小(例如4KB)可以不同。在根据本公开的实施例中,按原子写命令的逻辑地址范围,为原子写命令生成一个或多个子命令,每个子命令所访问的逻辑地址范围不超过一个缓存单元所对应的逻辑地址范围。以及为每个子命令分配一个缓存单元。分配给子命令的缓存单元可以是该子命令所命中的缓存单元,在子命令未命中任何缓存单元的情况下,为子命令申请缓存单元。根据本公开的一个实施方式,所分配的缓存单元可以是原子写命令所命中的一个或多个缓存单元。通过比较子命令的逻辑地址与缓存单元元数据中记录的逻辑地址,来确定缓存单元是否命中。若子命令的逻辑地址同缓存单元的元数据记录的逻辑地址相同,或子命令的逻辑地址范围被缓存单元的元数据记录的逻辑地址范围所包含,则该子命令命中该缓存单元。为子命令申请的缓存单元可以是尚未被写入数据的处于“空闲”状态的缓存单元,也可以是已被写入数据的处于“可用”、“忙碌”或“淘汰”中的缓存单元。可以理解地,若原子写命令被拆分为多个子命令,这些子命令可以全部命中缓存单元,也可以是一部分子命令命中缓存单元,而另外一部分子命令未命中缓存单元,并且为未命中缓存单元的子命令申请缓存单元。在为原子写命令分配了缓存单元之后,在操作S430,响应于所分配的缓存单元都可接收原子写命令要写入的数据,将该原子写命令要写入的数据写入这些缓存单元。在一个实施例中,为了方便为未命中任何缓存单元的子命令分配缓存单元,为处于“空闲”状态的缓存单元建立缓存单元池,缓存单元池中均是处于“空闲”状态的缓存单元。当子命令未命中任何缓存单元时,从该缓存单元池中获取缓存单元,由此能够方便地为子命令分配缓存单元。更进一步地,可以将被清空的缓存单元归还该缓存单元池。在操作S440,响应于该原子写命令要写入的数据被全部被写入这些缓存单元,向主机指示原子写命令处理完成。此时,尽管原子写命令所对应的数据可能尚未被写入NVM,但只要这些数据被写入到了缓存单元中,则通知主机,该原子写入完成。这有利于降低写命令处理的延迟。根据本公开的实施例在操作S430中,缓存单元可接收原子写命令要写入的数据是指,(1)原子写命令的子命令命中缓存单元,且所命中的缓存单元处于“可用”状态,且该缓存单元存储的数据的逻辑地址范围同该子命令访问的逻辑地址范围不重叠;或者(2)为子命令申请了缓存单元,该缓存单元处于“空闲”状态。若为原子写命令所分配的缓存单元中有任何一个或多个缓存单元不能接收原子写命令的数据,根据本公开的实施例中,则暂停对原子写命令的处理(暂停对原子写命令的所有子命令的处理)。缓存单元不能接收原子写命令的数据是指,(1)原子写命令的子命令命中缓存单元,所命中的缓存单元处于“可用”状态,但所命中的缓存单元中存储的数据的逻辑地址范围同该子命令访问的逻辑地址范围重叠;或者(2)子命令未命中缓存单元,为子命令申请的缓存单元处于非“空闲”状态(包括“可用”、“忙碌”或“淘汰”状态)。将缓存单元不能接收原子写命令的数据的情形,也称为原子写命令或其子命令同缓存单元存在冲突。对于不能接收原子写命令要写入数据的缓存单元,通过“淘汰”或清空过程,使其处于“空闲”状态,从而消除冲突。并使得缓存单元将能够接收原子写命令的数据。通过将缓存单元中的数据写入到NVM中,来清空该缓存单元中的数据。为“淘汰”或清空缓存单元,若缓存单元中具有尚未被写入数据的缓存子单元,换言之,该缓存单元的缓存子单元中的一些被填充了数据,而另一些缓存子单元则未被填充数据。在此情况下,向未被填充数据的缓存子单元所对应的逻辑地址发出读命令,从该逻辑地址读出数据并填充这些未被填充数据的缓存子单元;在这些未被填充数据的缓存子单元被全部填充入数据后,将缓存单元的数据整体写入NVM,由此完成对缓存单元的清空。实施例1图5A与图5B是根据本公开一个实施例的原子写命令的示意图以及相应的缓存单元的状态变化图。为了清楚描述的目的,缓存单元所对应的逻辑地址(即,缓存单元的元数据所指示的逻辑地址)范围均按4KB对齐(其起始地址位于4KB的整数倍地址处,例如,0、4KB、8KB),缓存单元所对应的逻辑地址空间大小为4KB。例如,原子写命令510指示向逻辑地址空间1KB-10KB写入数据。将原子写命令510按缓存单元的逻辑地址范围拆分为多个子命令,每个子命令所访问的逻辑地址范围不超过一个缓存单元的逻辑地址范围。依据子命令所访问的逻辑地址范围为子命令分配缓存单元。在缓存单元的元数据中记录缓存单元被填充了数据的逻辑地址范围。参看图5A,原子写命令510被拆分成子命令L1/L2/L3,子命令L1访问1KB-3KB的大小为3KB逻辑地址范围,子命令L2访问4KB-7KB的大小为4KB的逻辑地址范围,子命令L3访问8KB-10KB的大小为3KB的地址范围,子命令访问的逻辑地址的范围不超过分配给其的缓存单元的逻辑地址的范围。可选地,写命令所对应的逻辑地址空间无需连续,以及子命令的逻辑地址空间也无需连续。图5B示出了原子写命令未命中任何缓存单元时,为该原子写命令的子命令分配空闲缓存单元后,这些缓存单元的状态变化图。如图5B所示,依据每个子命令访问的逻辑地址,为每个子命令分配缓存单元。作为一个示例性实施例,子命令L1/L2/L3均未命中任何缓存单元,为子命令L1/L2/L3分别获取缓存单元512/514/516,并且这些缓存单元512/514/5516均处于“空闲”状态(如图5B中“状态51”所示)。然后,在所分配的缓存单元512/514/516的元数据中分别记录子命令L1/L2/L3的逻辑地址。由于为原子写命令510分配的所有缓存单元(512/514/516)均处于“空闲”状态,能够接收所有子命令L1/L2/l3要写入的数据,因而将原子写命令510对应的数据分别写入到这些缓存单元中。在发出原子写命令510的主机与缓存单元512/514/516之间发起DMA传输,将要写入的数据依据其逻辑地址传输到缓存单元512/5214/516。响应于数据被写入缓存单元,在缓存单元(512/514/516)的元数据中记录的缓存单元的状态变为“占用”,如图5B中的“状态52”所示。响应于原子写命令510的所有子命令L1/L2/L3的数据都已写入缓存单元,向主机发送消息,指示原子写命令510处理完成。实施例2图6A与6B是根据本公开另一个实施例的原子写命令的示意图以及相应的缓存单元的状态变化图。作为示例性实施方式,写命令610向逻辑地址范围0-1KB的1KB大小的空间、逻辑地址范围4KB-7KB的4KB大小的空间以及逻辑地址范围10KB-11KB的1KB大小的空间写入数据。参看图6A,将原子写命令610拆分为子命令L4/L5/L6,其中子命令L4向逻辑地址范围0-1KB的空间写入数据,子命令L5向逻辑地址范围4KB-7KB的空间写入数据,以及子命令L6向逻辑地址10KB-11KB的空间写入数据。以示例的方式,存在缓存单元612、614以及616,其中,缓存单元612的逻辑地址范围为0-3KB,并且处于“占用”状态,但逻辑地址范围0-1KB中未存储有任何数据;缓存单元614的逻辑地址范围为4-7KB,处于“占用”状态,并且逻辑地址范围4-7KB中已经存储有数据;缓存单元616的逻辑地址范围为8-11KB,处于“占用”状态,并且逻辑地址10KB-11KB中未存储任何数据,如图6B的“状态61所示”。子命令L4向逻辑地址范围0-1KB的1KB大小的空间写入数据,命中缓存单元612的逻辑地址范围(0-3KB范围,大小为4KB);子命令L5向逻辑地址范围4-7KB的4KB大小的空间写入数据,命中缓存单元614的逻辑地址范围(4-7KB范围,大小为4KB);子命令L6向逻辑地址范围10KB-11KB的1KB大小的空间写入数据,命中缓存单元616的逻辑地址范围(8KB-11KB范围,大小为4KB)。进一步地,由于缓存单元612的0-1KB的逻辑地址范围尚未被写入数据,缓存单元616的10KB-11KB的逻辑地址范围尚未被写入数据,(由于缓存单元612/616存储的数据的逻辑地址范围同对应的子命令L4/L6访问的逻辑地址范围不重叠),因而缓存单元612/616分别可接收子命令L4/L6要写入的数据。而由于缓存单元614的4KB-7KB的逻辑地址范围已存储有数据,使得缓存单元614暂时不能接收子命令L5所对应的数据。在此情况下,由于原子写命令610所需的3个缓存单元尚未都可接收子命令要写入数据,在根据本公开的实施例中,为确保操作结果的原子性,暂停对原子写命令610的处理,将原子写命令610挂起或加入等待命令集合。接下来,启动对缓存单元614的“淘汰”或清空过程,并将缓存单元614的状态标记为“淘汰”,如图6B的“状态62”所示。在“淘汰”过程中,将缓存单元614的数据写入NVM。将缓存单元614的数据写入NVM后,“淘汰”过程完成,并将缓存单元614的状态标记为“空闲”。进一步地,在“淘汰”缓存单元614的数据的过程中,无需“淘汰”被分配给相同原子写命令610的其他可被写入数据的缓存单元的数据,例如,无须淘汰缓存单元612和616中的数据。在对缓存单元614的“淘汰”完成之后,缓存单元614变为“空闲”状态,而缓存单元612/616仍处于“占用”状态(如图6B的“状态63”所示)。此时,分配给原子写命令610的所有缓存单元612/614/616均可接收原子写命令610的子命令L4/L5/L6要写入的数据,因而发起在主机与缓存单元612/614/616之间的数据传输,将子命令L4/L5/L6对应的数据写入缓存单元612/614/616。响应于子命令L4/L5/L6对应的数据被完整写入缓存单元612/614/616,将缓存单元612/614/616的状态标记为“占用”,并向主机发送消息以指示原子写命令610处理完成,如图6B中的“状态64”所示。实施例3图7A-7B是根据本公开又一个实施例的原子写命令的示意图以及相应的缓存单元的状态变化图。如图7A所示,为处理原子写命令710,按所访问的逻辑地址将其拆分为3个子命令(L7/L8/L9)。以举例的方式,通过查询缓存单元,发现子命令L7/L8/L9未命中任何缓存单元,则为子命令L7/L8/L9例如分配缓存单元(712/714/716)。可依据直诸如接映射、多路组相联或全相联等缓存映射方式分配缓存单元,还可以从缓存单元池中分配缓存单元。作为一个示例性实施方式,参看图7B,所获得的缓存单元712处于“空闲”状态,而缓存单元714/716处于“占用”状态,如图7B中的“状态71”所示。由于原子写命令710未命中缓存单元714/716,需将处于“占用”状态的缓存单元714/716的数据清空,即写入NVM。通过发起“淘汰”或清空过程来实现此目的,并将缓存单元714/716的状态设置为“淘汰中”。进一步地,为“淘汰”缓存单元714/716的数据,无需“淘汰”与缓存单元714/716被分配给相同原子写命令710的其他缓存单元的数据(例如缓存单元712)。由于原子写命令710所需的3个缓存单元尚未都可接收子命令要写入的数据,为确保操作结果的原子性,暂停对原子写命令710的处理,将原子写命令710挂起或加入等待命令集合。将缓存单元714/716的数据写入NVM后,“淘汰”过程完成,并将缓存单元714/716的状态标记为“空闲”,如图7B中的“状态72”所示。此时,缓存单元712/714/716均可分别接收原子写命令710的子命令L7/L8/L9要写入的数据,因而(原子写命令710被从等待命令集合中取出)发起在主机与缓存单元712/714/716之间的数据传输,将子命令L7/L8/L9对应的数据写入缓存单元712/714/716。响应于子命令L7/L8/L9对应的数据分别被完整写入缓存单元712/714/716,将缓存单元712/714/716的状态标记为“占用”(如图7B的“状态73”所示),并向主机发送消息以指示原子写命令710处理完成。实施例4图8A与8B是根据本公开再一个实施例的原子写命令的示意图以及相应的缓存单元的状态变化图。如图8A所示,为处理原子写命令810,根据其逻辑地址将其拆分为3个子命令(L10/L11/L12)。通过查询缓存单元的逻辑地址,发现子命令L10命中缓存单元812,而子命令L11/L12未命中任何缓存单元,则为子命令L11/L12分配缓存单元(814/816)。作为举例,参看图8B,所获得的缓存单元812处于“占用”状态,而缓存单元814/816也处于“占用”状态,如“状态81”所示。为使用缓存单元814/816,由于未命中缓存单元814/816,需要将处于“占用”状态的缓存单元814/816的数据写入NVM。通过发起“淘汰”过程来实现此目的,并将缓存单元814/816的状态设置为“淘汰中”。对于命中的缓存单元812,进一步检查子命令L10要写入的逻辑地址范围与缓存单元812的已经被写入数据的逻辑地址范围是否有重叠,若存在任何重叠部分,则需要将缓存单元812的数据写入NVM,待为原子写命令810所分配的3个缓存单元(812/814/816)都可接收子命令的数据后,再用缓存单元812接受子命令L10的数据,以确保数据的原子性。为了将缓存单元812的数据写入NVM,也发起“淘汰”过程。由于原子写命令810所需的3个缓存单元尚未都可写入数据,为确保操作结果的原子性,暂停对原子写命令810的处理,将原子写命令810挂起或加入等待命令集合。在图8B的例子中,由于子命令L10要写入的逻辑地址范围与缓存单元812的已经被写入数据的逻辑地址范围有重叠,则等待缓存单元812的“淘汰”过程完成,以及也等待对缓存单元814/824的“淘汰”过程的完成。在另一个例子中,若子命令L10要写入的逻辑地址范围与缓存单元812的已经被写入数据的逻辑地址范围不存在任何重叠,则无需对缓存单元812发起“淘汰”过程,只等待缓存单元814/824的“淘汰”过程完成。当缓存单元812/814/816均各自可接收原子写命令810的子命令L10/L11/L12要写入的数据后,例如当缓存单元812/814/816均处于“空闲”状态时(如图8B的“状态82”所示),原子写命令810被从等待命令集合中取出或从挂起状态中恢复,发起在主机与缓存单元812/814/816之间的数据传输,将子命令L10/L11/L12对应的数据分别写入缓存单元812/814/816。响应于子命令L10/L11/L12对应的数据被完整写入缓存单元812/814/816,将缓存单元812/814/816的状态标记为“占用”,并向主机发送消息以指示原子写命令810处理完成,如图8B的“状态83”所示。实施例5本公开中的图9A与9B是处理非原子写命令(普通写命令)910的示意图。如图9A所示,以示例的方式,写命令910被拆分为3个子命令(L13/L14/L15)。通过查询缓存单元的逻辑地址,发现子命令L13命中缓存单元912,而子命令L14/L15未命中任何缓存单元,则为子命令L14/L15分配缓存单元914/916。作为举例,参看图9B,所命中的缓存单元912处于“占用”状态,而所分配的缓存单元914/916处于“占用”状态,如图9B中的“状态91”所示。由于写命令910不要求原子性,对写命令910的任何子命令,当可向缓存单元发起数据传输时,即可启动数据传输过程向缓存单元填充数据,而无需等待写命令910的所有缓存单元都可接收数据。根据本公开的一个实施方式,即使写命令910的一个子命令未命中缓存单元,而其他子命令可以向缓存单元中写入,也无须等待那个未命中缓存单元的子命令被分配缓存单元。参看图9B,由于子命令L13命中了缓存单元912,且缓存单元912处于“占用”状态,依据子命令L13在主机与缓存单元912之间传输数据(例如通过DMA传输)。即使子命令L13要写入的逻辑地址范围与缓存单元912的已经被写入数据的逻辑地址范围存在重叠,也可立即依据子命令L13向缓存单元912写入数据。而子命令L14与L15未命令缓存单元914与916,且缓存单元914/916处于“占用”状态(这意味着缓存单元914/916中已被写入的数据同子命令L14/L15要写入的数据属于不同的逻辑地址),需将缓存单元914/916的数据写入NVM,通过发起“淘汰”过程来实现此目的,并将缓存单元914/916的状态设置为“淘汰中”。当“淘汰”过程完成,缓存单元912仍然为“占用”状态,而缓存单元914/916变为“空闲”状态(如图9B中的“状态92”所示),依据子命令L14/L15向缓存单元914/916写入数据。响应于子命令L14/L15/L16对应的数据被完整写入缓存单元912/914/916,缓存单元912/914/916均变为“占用”状态,并向主机发送消息以指示写命令910处理完成,如图9B的“状态93”所示。图10是根据本公开实施例的掉电处理过程的流程图。当发生异常而出现掉电(S1010)时,利用备用电源为固态硬盘供电,将(例如,所有)“占用”状态的缓存单元中被写入的数据写入NVM(S1020),并确保对处于“淘汰中”状态的缓存单元的“淘汰”操作完成。以及丢弃(或忽略)尚未向主机指示被处理完成(ACK)的命令(S1030)。从而,依据本公开的实施例,对于已经向主机指示处理完成的原子写命令和/或非原子写命令,其要写入的数据都至少被写入了缓存单元中,并在掉电时被写入NVM,从而保证了原子写命令/非原子写命令的处理符合NVMe规范。即使未发生掉电,当缓存单元被淘汰时,缓存单元中的数据被写入NVM。可选地,周期性地、在固态存储设备空闲时或依据主机发出的“清空”命令,将“占用”状态的缓存单元的数据写入到NVM中。本申请实施例的方法和装置可以由硬件、软件、固件以及上述中的任意组合来实现。硬件可以包括数字电路、模拟电路、数字信号处理器(DSP)、应用专用集成电路(ASIC)等。软件可以包括信息处理设备可读程序,这些信息处理设备可读程序在被信息处理设备执行时,实现根据本申请实施例所提供的方法。例如,本申请的实施例可以实施为存储控制器,该存储控制器可以包括:一个或者多个处理器;存储器;存储在存储器中的程序,当被一个或者多个处理器执行时,程序使固态存储设备处理器执行根据本发明实施例所提供的方法。本申请实施例的软件还可以存储在计算机可读存储介质,例如硬盘,光盘等中,该计算机可读存储介质存储有程序,当程序被一个设备执行时,使得设备执行根据本发明实施例所提供的方法。上面的描述仅仅是对本发明示例性而非穷尽式的描述,本领域技术人员可以对上述方法、设备、装置、模块等进行添加,删减、修改、替换等等,而并不脱离本发明的实质和保护范围。当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1