CN108628761B - 原子命令执行方法与装置 - Google Patents
原子命令执行方法与装置 Download PDFInfo
- Publication number
- CN108628761B CN108628761B CN201710165414.3A CN201710165414A CN108628761B CN 108628761 B CN108628761 B CN 108628761B CN 201710165414 A CN201710165414 A CN 201710165414A CN 108628761 B CN108628761 B CN 108628761B
- Authority
- CN
- China
- Prior art keywords
- command
- sub
- atomic
- commands
- ftl
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/06—Addressing a physical block of locations, e.g. base addressing, module addressing, memory dedication
- G06F12/0646—Configuration or reconfiguration
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Memory System Of A Hierarchy Structure (AREA)
- Techniques For Improving Reliability Of Storages (AREA)
Abstract
本申请提供了原子命令的执行方法与装置。所提供的原子读命令包括多个子命令,该方法包括:将多个子命令按照各子命令要访问的逻辑地址排序;获取所述多个子命令中未被处理的多个子命令中排序最前的第一子命令,根据第一子命令要访问的第一逻辑地址,对与该第一逻辑地址对应的FTL表项加锁;若对与该第一逻辑地址对应的FTL表项加锁成功,则按照子命令的排序获取下一子命令,根据该下一子命令要访问的第二逻辑地址,对与该第二逻辑地址对应的FTL表项加锁,直到对同属于该原子读命令的所有子命令的每个子命令要访问的逻辑地址相对应的FTL表项加锁均成功。
Description
技术领域
本申请涉及存储技术领域,尤其涉及原子命令执行方法与装置。
背景技术
图1展示了存储设备的框图。存储设备102同主机相耦合,用于为主机提供存储能力。主机同存储设备102之间可通过多种方式相耦合,耦合方式包括但不限于通过例如SATA(Serial Advanced Technology Attachment,串行高级技术附件)、SCSI(Small ComputerSystem Interface,小型计算机***接口)、SAS(Serial Attached SCSI,串行连接SCSI)、IDE(Integrated Drive Electronics,集成驱动器电子)、USB(Universal Serial Bus,通用串行总线)、PCIE(Peripheral Component Interconnect Express,PCIe,高速***组件互联)、NVMe(NVM Express,高速非易失存储)、以太网、光纤通道、无线通信网络等连接主机与固态存储设备102。主机可以是能够通过上述方式同存储设备相通信的信息处理设备,例如,个人计算机、平板电脑、服务器、便携式计算机、网络交换机、路由器、蜂窝电话、个人数字助理等。存储设备102包括接口103、控制部件104、一个或多个NVM芯片105以及DRAM(Dynamic Random Access Memory,动态随机访问存储器)110。
其中,NAND闪存、相变存储器、FeRAM(Ferroelectric RAM,铁电存储器)、MRAM(Magnetic Random Access Memory,磁阻存储器)、RRAM(Resistive Random AccessMemory,阻变存储器)等是常见的NVM(Non-Volatile Memory,非易失存储器)。
控制部件104用于控制在接口103、NVM芯片105以及DRAM 110之间的数据传输,还用于存储管理、主机逻辑地址到闪存物理地址映射、擦除均衡、坏块管理等。控制部件104可通过软件、硬件、固件或其组合的多种方式实现,例如,控制部件104可以是FPGA(Field-programmable gate array,现场可编程门阵列)、ASIC(Application SpecificIntegrated Circuit,应用专用集成电路)或者其组合的形式。控制部件104也可以包括处理器或者控制器,在处理器或控制器中执行软件来操纵控制部件104的硬件来处理IO(Input/Output)命令。控制部件104还可以耦合到DRAM 110,并可访问DRAM 110的数据。在DRAM可存储FTL表和/或缓存的IO命令的数据。
控制部件104包括闪存接口控制器(或称为介质接口控制器、闪存通道控制器),闪存接口控制器耦合到NVM芯片105,并以遵循NVM芯片105的接口协议的方式向NVM芯片105发出命令,以操作NVM芯片105,并接收从NVM芯片105输出的命令执行结果。已知的NVM芯片接口协议包括“Toggle”、“ONFI”等。
在控制部件104中运行的软件和/或固件(下面统称为“固件”)可被存储在NVM芯片105或另外的固件存储器中。在固态存储设备102上电时,从固件存储器将固件加载到DRAM110和/或控制部件104内部的存储器中。可选地,通过接口103或调试接口接收并加载固件。
在NVMe规范(http://nvmexpress.org/wp-content/uploads/NVM_Express_1_2_1_Gold_20160603.pdf)中定义了原子操作(Atomic Operation)。原子操作包括原子写命令。为执行原子写命令,固态存储设备确保在原子写命令中指示的数据,要么都写入到固态存储设备中,要么都未写入到固态存储设备中,而不会有其他自行结果。当同时存在向相同或部分相同的地址写入数据的两个或更多原子写命令时,这些原子写命令的执行结果是如同这些原子写命令串行执行的。
例如,参看表1,原子写命令A向逻辑地址(Logic Block Address,LBA)LBA0-3写入数据,原子写命令B向逻辑地址LBA1-4写入数据(表1中用“A”指示由原子写命令A写入的数据,而由“B”指示由原子写命令B写入的数据)。下表的第2行与第3行示出了命令A与命令B的正确执行结果。参看表1,一种可能的结果(如下表第2行所示)是LBA 0-3是写命令A所写入的数据,而LBA 4是写命令B所写入的数据,换句话说,写命令B先生效,原子性地更新了LBA1-4,接下来写命令A生效,又原子性地更新了LBA 0-3。另一种可能的结果(如下表第3行所示)是LBA 0是写命令A所写入的数据,而LBA 2-4是写命令B所写入的数据,换句话说,写命令A先生效,原子性地更新了LBA 0-3,接下来写命令B生效,又原子性地更新了LBA 1-4。除了上面提到的两种结果,其他任何结果都不符合NVMe规范对原子写命令的要求。
表1
LBA 0 | LBA 1 | LBA 2 | LBA 3 | LBA 4 | LBA 5 | LBA 6 | |
有效结果 | A | A | A | A | B | ||
有效结果 | A | B | B | B | B | ||
无效结果 | A | A | B | B | B |
发明内容
有鉴于此,本申请提供一种原子命令执行方法与装置。
根据本发明的第一方面,提供了根据本发明第一方面的第一原子写命令执行方法,包括:从主机接收原子写命令;获取原子写命令要访问的逻辑地址;原子写命令要访问的逻辑地址,对与该逻辑地址对应的FTL表项加锁;若加锁成功,对原子写命令进行处理。
根据本发明的第一方面的第一原子写命令执行方法,提供了根据本发明第一方面的第二原子写命令执行方法,还包括:若加锁失败,暂停对原子写命令的处理,直到加锁成功。
根据本发明的第一方面的第一或第二原子写命令执行方法,提供了根据本发明第一方面的第三原子写命令执行方法,其中,对原子写命令的处理包括:为原子写命令分配物理地址;将原子写命令对应的数据写入所分配的物理地址中;以及将原子写命令要访问的逻辑地址与所分配的物理地址记录在被加锁的FTL表项中。
根据本发明的第一方面的第一、第二或第三原子写命令执行方法,提供了根据本发明第一方面的第四原子写命令执行方法,还包括:将原子写命令拆分成多个子命令,其中每个子命令所访问的逻辑地址的范围不超过一个FTL表项所指示的逻辑地址范围。
根据本发明的第二方面,提供了根据本发明第二方面的第一原子写命令执行方法,其中原子写命令包括多个子命令,该方法包括:将多个子命令按照各子命令要访问的逻辑地址排序;获取所述多个子命令中未被处理的多个子命令中排序最前的第一子命令,根据第一子命令要访问的第一逻辑地址,对与该第一逻辑地址对应的FTL表项加锁;若对与该第一逻辑地址对应的FTL表项加锁成功,则按照子命令的排序获取下一子命令,根据该下一子命令要访问的第二逻辑地址,对与该第二逻辑地址对应的FTL表项加锁,直到对同属于该原子写命令的所有子命令的每个子命令要访问的逻辑地址相对应的FTL表项加锁均成功。
根据本发明的第二方面的第一原子写命令执行方法,提供了根据本发明第二方面的第二原子写命令执行方法,还包括:若对与该第一逻辑地址对应的FTL表项加锁失败,暂停对所述原子写命令的执行,直到对与该第一逻辑地址对应的FTL表项加锁成功。
根据本发明的第二方面的第二原子写命令执行方法,提供了根据本发明第二方面的第三原子写命令执行方法,直到对与该第一逻辑地址对应的FTL表项加锁成功,才按照子命令的排序获取下一子命令。
根据本发明的第二方面的第二或第三原子写命令执行方法,提供了根据本发明第二方面的第四原子写命令执行方法,其中,若FTL表项已被加锁,则接下来对该FTL表项的加锁会失败。
根据本发明的第二方面的第一到第四之一原子写命令执行方法,提供了根据本发明第二方面的第五原子写命令执行方法,其中,若FTL表项未被加锁,则接下来对该FTL表项的加锁会成功。
根据本发明的第二方面的第一到第五之一原子写命令执行方法,提供了根据本发明第二方面的第六原子写命令执行方法,还包括:响应于对与子命令的逻辑地址对应的FTL表项加锁成功,处理该子命令。
根据本发明的第二方面的第一到第五之一原子写命令执行方法,提供了根据本发明第二方面的第七原子写命令执行方法,还包括:响应于对与所述原子写命令的所有子命令的逻辑地址对应的FTL表项都加锁成功,才处理所述原子写命令对应的子命令。
根据本发明的第二方面的第一到第七之一原子写命令执行方法,提供了根据本发明第二方面的第八原子写命令执行方法,还包括:从主机接收第二原子写命令;将第二原子写命令拆分成第二多个子命令;将第二多个子命令按照各子命令要访问的逻辑地址进行排序;以及获取所述第二多个子命令中未被处理的多个子命令中排序最前的第三子命令,根据第三子命令要访问的第三逻辑地址,对与该第三逻辑地址对应的FTL表项加锁;若对与该第三逻辑地址对应的FTL表项加锁成功,则按照子命令的排序获取下一子命令,根据该下一子命令要访问的第四逻辑地址,对与该第四逻辑地址对应的FTL表项加锁,直到对同属于第二原子写命令的所有子命令的每个子命令要访问的逻辑地址相对应的FTL表项加锁均成功。
根据本发明的第二方面的第一到第八之一原子写命令执行方法,提供了根据本发明第二方面的第九原子写命令执行方法,将属于所述原子写命令的多个子命令按照逻辑地址数值的升序排序,或者,按照逻辑地址数值的降序排序。
根据本发明的第二方面的第一到第九之一原子写命令执行方法,提供了根据本发明第二方面的第十原子写命令执行方法,还包括:响应于属于所述原子写命令的所有子命令均处理完成,才释放同所述原子写命令的所有子命令对应的FTL表项的锁。
根据本发明的第二方面的第六到第十之一原子写命令执行方法,提供了根据本发明第二方面的第十一原子写命令执行方法,其中,处理子命令,包括:为子命令分配物理地址;将子命令对应的数据写入所分配的物理地址中;以及将子命令要访问的逻辑地址与所分配的物理地址记录在被加锁的FTL表项中。
根据本发明的第三方面,提出了根据本发明第三方面的第一原子命令执行方法,包括:从主机接收原子读命令;获取原子读命令要访问的逻辑地址;依据原子读命令要访问的逻辑地址,对与该逻辑地址对应的FTL表项加锁;若加锁成功,对原子读命令进行处理。
根据本发明的第三方面的第一原子命令执行方法,提出了根据本发明第三方面的第二原子命令执行方法,还包括:若加锁失败,暂停对原子读命令的处理,直到加锁成功。
根据本发明的第三方面的第一或第二原子命令执行方法,提出了根据本发明第三方面的第三原子命令执行方法,其中,对原子读命令的处理包括:从FTL表项中获取物理地址;以及从所获取的物理地址中读出数据。
根据本发明的第三方面的第一、第二或第三原子命令执行方法,提出了根据本发明第三方面的第四原子命令执行方法,还包括:将原子读命令拆分成多个子命令,其中每个子命令所访问的逻辑地址的范围不超过一个FTL表项所指示的逻辑地址范围。
根据本发明的第四方面,提供了根据本发明的第四方面的第一原子读命令执行方法,包括:将多个子命令按照各子命令要访问的逻辑地址排序;获取所述多个子命令中未被处理的多个子命令中排序最前的第一子命令,根据第一子命令要访问的第一逻辑地址,对与该第一逻辑地址对应的FTL表项加锁;若对与该第一逻辑地址对应的FTL表项加锁成功,则按照子命令的排序获取下一子命令,根据该下一子命令要访问的第二逻辑地址,对与该第二逻辑地址对应的FTL表项加锁,直到对同属于该原子读命令的所有子命令的每个子命令要访问的逻辑地址相对应的FTL表项加锁均成功。
根据本发明的第四方面的第一原子读命令执行方法,提供了根据本发明的第四方面的第二原子读命令执行方法,还包括:若对与该第一逻辑地址对应的FTL表项加锁失败,暂停对所述原子读命令的执行,直到对与该第一逻辑地址对应的FTL表项加锁成功。
根据本发明的第四方面的第二原子读命令执行方法,提供了根据本发明的第四方面的第三原子读命令执行方法,直到对与该第一逻辑地址对应的FTL表项加锁成功,才按照子命令的排序获取下一子命令。
根据本发明的第四方面的第二或第三原子读命令执行方法,提供了根据本发明的第四方面的第四原子读命令执行方法,其中,若FTL表项已被加锁,则接下来对该FTL表项的加锁会失败。
根据本发明的第四方面的第一到第四之一原子读命令执行方法,提供了根据本发明的第四方面的第五原子读命令执行方法,其中,若FTL表项未被加锁,则接下来对该FTL表项的加锁会成功。
根据本发明的第四方面的第一到第五之一原子读命令执行方法,提供了根据本发明的第四方面的第六原子读命令执行方法,还包括:响应于对与子命令的逻辑地址对应的FTL表项加锁成功,处理该子命令。
根据本发明的第四方面的第一到第五之一原子读命令执行方法,提供了根据本发明的第四方面的第七原子读命令执行方法,还包括:响应于对与所述原子读命令的所有子命令的逻辑地址对应的FTL表项都加锁成功,才处理所述原子读命令对应的子命令。
根据本发明的第四方面的第一到第七之一原子读命令执行方法,提供了根据本发明的第四方面的第八原子读命令执行方法,还包括:从主机接收第二原子读命令;将第二原子读命令拆分成第二多个子命令;将第二多个子命令按照各子命令要访问的逻辑地址进行排序;以及获取所述第二多个子命令中未被处理的多个子命令中排序最前的第三子命令,根据第三子命令要访问的第三逻辑地址,对与该第三逻辑地址对应的FTL表项加锁;若对与该第三逻辑地址对应的FTL表项加锁成功,则按照子命令的排序获取下一子命令,根据该下一子命令要访问的第四逻辑地址,对与该第四逻辑地址对应的FTL表项加锁,直到对同属于第二原子读命令的所有子命令的每个子命令要访问的逻辑地址相对应的FTL表项加锁均成功。
根据本发明的第四方面的第一到第八之一原子读命令执行方法,提供了根据本发明的第四方面的第九原子读命令执行方法,将属于所述原子读命令的多个子命令按照逻辑地址数值的升序排序,或者,按照逻辑地址数值的降序排序。
根据本发明的第四方面的第一到第九之一原子读命令执行方法,提供了根据本发明的第四方面的第十原子读命令执行方法,还包括:响应于属于所述原子读命令的所有子命令均处理完成,才释放同所述原子读命令的所有子命令对应的FTL表项的锁。
根据本发明的第四方面的第六到第十之一原子读命令执行方法,提供了根据本发明的第四方面的第十一原子读命令执行方法,其中,处理子命令,包括:从与子命令的逻辑地址对应的FTL表项中获取物理地址;以及从所获取的物理地址中读出数据。
根据本发明的第五方面,提供了根据本发明第五方面的第一原子命令执行方法,包括:从主机接收第一子命令,获取第一子命令要访问的第一逻辑地址,以及获取第一子命令在其所属的原子命令中的未被处理的多个子命令中的排序;若第一子命令在其所属的原子命令中的未被处理的多个子命令中排序最前,则根据第一子命令要访问的第一逻辑地址,对与该第一逻辑地址对应的FTL表项加锁。
根据本发明的第五方面的第一原子命令执行方法,提供了根据本发明第五方面的第二原子命令执行方法,其中,原子命令的类型包括原子写命令和原子读命令。
根据本发明的第五方面的第一或第二原子命令执行方法,提供了根据本发明第五方面的第三原子命令执行方法,还包括:若第一子命令在其所属的原子命令中的未被处理的多个子命令中的排序不为最前,则暂停对第一子命令的处理。
根据本发明的第五方面的第一或第二原子命令执行方法,提供了根据本发明第五方面的第四原子命令执行方法,还包括:若对与该第一子命令要访问的第一逻辑地址对应的FTL表项加锁成功,处理该第一子命令。
根据本发明的第五方面的第一到第四之一原子命令执行方法,提供了根据本发明第五方面的第五原子命令执行方法,还包括:对于第一子命令所属的原子命令中的所有子命令,直到对所有子命令中的每个子命令要访问的逻辑地址相对应的FTL表项加锁均成功,才释放同所有子命令对应的FTL表项的锁。
根据本发明的第六方面,提供了根据本发明第六方面的第一原子命令执行方法,其中所述原子命令包括多个子命令,该方法包括:确定原子命令的类型,若原子命令的类型为原子读命令,且该原子读命令需要满足一般原子性,将多个子命令按照各子命令要访问的逻辑地址排序;获取所述多个子命令中未被处理的多个子命令中排序最前的第一子命令,根据第一子命令要访问的第一逻辑地址,对与该第一逻辑地址对应的FTL表项加锁;若对与该第一逻辑地址对应的FTL表项加锁成功,则按照子命令的排序获取下一子命令,根据该下一子命令要访问的第二逻辑地址,对与该第二逻辑地址对应的FTL表项加锁,直到对同属于该原子读命令的所有子命令的每个子命令要访问的逻辑地址相对应的FTL表项加锁均成功。
根据本发明第六方面的第一原子命令执行方法,提出了根据本发明第六方面的第二原子命令执行方法,还包括:若对与该第一逻辑地址对应的FTL表项加锁失败,暂停对所述原子读命令的执行,直到对与该第一逻辑地址对应的FTL表项加锁成功。
根据本发明第六方面的第二原子命令执行方法,提出了根据本发明第六方面的第三原子命令执行方法,直到对与该第一逻辑地址对应的FTL表项加锁成功,才按照子命令的排序获取下一子命令。
根据本发明第六方面的第一、第二或第三原子命令执行方法,提出了根据本发明第六方面的第四原子命令执行方法,还包括:响应于对与子命令的逻辑地址对应的FTL表项加锁成功,处理该子命令。
根据本发明第六方面的第一到第四之一原子命令执行方法,提出了根据本发明第六方面的第五原子命令执行方法,还包括:响应于属于所述原子读命令的所有子命令均处理完成,才释放同所述原子读命令的所有子命令对应的FTL表项的锁。
根据本发明第六方面的第一到第五之一原子命令执行方法,提出了根据本发明第六方面的第六原子命令执行方法,还包括:若该原子读命令不需要满足一般原子性,处理每个子命令,而无须依赖为其他子命令的加锁结果和/或处理结果。
根据本发明第六方面的第四到第六之一原子命令执行方法,提出了根据本发明第六方面的第七原子命令执行方法,其中,处理子命令,包括:从与子命令的逻辑地址对应的FTL表项中获取物理地址;以及从所获取的物理地址中读出数据。
根据本发明第六方面的第一到第七之一原子命令执行方法,提出了根据本发明第六方面的第八原子命令执行方法,还包括:若原子命令的类型为原子写命令,且该原子写命令需要满足一般原子性或掉电原子性,则将多个子命令按照各子命令要访问的逻辑地址排序;获取所述多个子命令中未被处理的多个子命令中排序最前的第一子命令,根据第一子命令要访问的第一逻辑地址,对与该第一逻辑地址对应的FTL表项加锁;若对与该第一逻辑地址对应的FTL表项加锁成功,则按照子命令的排序获取下一子命令,根据该下一子命令要访问的第二逻辑地址,对与该第二逻辑地址对应的FTL表项加锁,直到对同属于该原子写命令的所有子命令的每个子命令要访问的逻辑地址相对应的FTL表项加锁均成功。
根据本发明第六方面的第八原子命令执行方法,提出了根据本发明第六方面的第九原子命令执行方法,还包括:若对与该第一逻辑地址对应的FTL表项加锁失败,暂停对所述原子写命令的执行,直到对与该第一逻辑地址对应的FTL表项加锁成功。
根据本发明第六方面的第九原子命令执行方法,提出了根据本发明第六方面的第十原子命令执行方法,直到对与该第一逻辑地址对应的FTL表项加锁成功,才按照子命令的排序获取下一子命令。
根据本发明第六方面的第八到第十之一原子命令执行方法,提出了根据本发明第六方面的第十一原子命令执行方法,还包括:响应于对与子命令的逻辑地址对应的FTL表项加锁成功,处理该子命令。
根据本发明第六方面的第八到第十一之一原子命令执行方法,提出了根据本发明第六方面的第十二原子命令执行方法,还包括:响应于属于所述原子写命令的所有子命令均处理完成,才释放同所述原子写命令的所有子命令对应的FTL表项的锁。
根据本发明第六方面的第八到第十二之一原子命令执行方法,提出了根据本发明第六方面的第十三原子命令执行方法,还包括:若该原子写命令不需要满足一般原子性或掉电原子性,处理每个子命令,而无须依赖为其他子命令的加锁结果和/或处理结果。
根据本发明的第七方面,提供了根据本发明第七方面的第一原子写命令执行装置,包括:命令接收模块,用于从主机接收原子写命令;逻辑地址获取模块,用于获取原子写命令要访问的逻辑地址;加锁模块,用于依据原子写命令要访问的逻辑地址,对与该逻辑地址对应的FTL表项加锁;命令处理模块,用于若加锁成功,对原子写命令进行处理。
根据本发明的第八方面,提供了根据本发明第八方面的第一原子写命令执行装置,其中所述原子写命令包括多个子命令,该装置包括:子命令排序模块,用于将多个子命令按照各子命令要访问的逻辑地址排序;子命令获取模块,用于获取所述多个子命令中未被处理的多个子命令中排序最前的第一子命令;加锁模块,用于根据第一子命令要访问的第一逻辑地址,对与该第一逻辑地址对应的FTL表项加锁;子命令获取模块,还用于若对与该第一逻辑地址对应的FTL表项加锁成功,则按照子命令的排序获取下一子命令;以及加锁模块,还用于根据该下一子命令要访问的第二逻辑地址,对与该第二逻辑地址对应的FTL表项加锁,直到对同属于该原子写命令的所有子命令的每个子命令要访问的逻辑地址相对应的FTL表项加锁均成功。
根据本发明的第九方面,提供了根据本发明第九方面的第一原子命令执行装置,包括:命令接收模块,用于从主机接收原子读命令;逻辑地址获取模块,用于获取原子读命令要访问的逻辑地址;加锁模块,用于依据原子读命令要访问的逻辑地址,对与该逻辑地址对应的FTL表项加锁;命令处理模块,用于对原子读命令进行处理。
根据本发明的第十方面,提供了根据本发明第十方面的第一原子读命令执行装置,其中所述原子读命令包括多个子命令,其特征在于,包括:子命令排序模块,用于将多个子命令按照各子命令要访问的逻辑地址进行排序;子命令获取模块,用于获取所述多个子命令中未被处理的多个子命令中排序最前的第一子命令;加锁模块,还用于根据第一子命令要访问的第一逻辑地址,对与该第一逻辑地址对应的FTL表项加锁;若对与该第一逻辑地址对应的FTL表项加锁成功,则子命令获取模块,还用于按照子命令的排序获取下一子命令;加锁模块,还用于根据该下一子命令要访问的第二逻辑地址,对与该第二逻辑地址对应的FTL表项加锁,直到对于属于该原子读命令的所有子命令,对同每个子命令要访问的逻辑地址相对应的FTL表项加锁均处理完成。
根据本发明的第十一方面,提供了根据本发明第十一方面的第一原子命令执行装置,包括:命令接收模块,用于从主机接收第一子命令;逻辑地址获取模块,用于获取第一子命令要访问的第一逻辑地址;以及子命令排序获取模块,用于获取第一子命令在其所属的原子命令中的未被处理的多个子命令中的排序;若第一子命令在其所属的原子命令中的未被处理的多个子命令中排序最前,则加锁模块,用于根据第一子命令要访问的第一逻辑地址,对与该第一逻辑地址对应的FTL表项加锁。
根据本发明的第十二方面,提供了根据本发明第十二方面的第一原子命令执行装置,其中所述原子命令包括多个子命令,其特征在于,包括:原子命令类型确定模块,用于确定原子命令的类型;逻辑地址排序模块,用于若原子命令的类型为原子读命令,且该原子读命令需要满足一般原子性,将多个子命令按照各子命令要访问的逻辑地址排序;子命令获取模块,用于获取所述多个子命令中未被处理的多个子命令中排序最前的第一子命令;加锁模块,用于根据第一子命令要访问的第一逻辑地址,对与该第一逻辑地址对应的FTL表项加锁;子命令获取模块,还用于若对与该第一逻辑地址对应的FTL表项加锁成功,则按照子命令的排序获取下一子命令;加锁模块,用于根据该下一子命令要访问的第二逻辑地址,对与该第二逻辑地址对应的FTL表项加锁,直到对同属于该原子读命令的所有子命令的每个子命令要访问的逻辑地址相对应的FTL表项加锁均成功。
根据本发明的第十三方面,提供了根据本发明第十三方面的第一固态存储设备,包括控制部件与在控制部件外部的存储器,控制部件包括闪存接口与至少一个CPU,CPU通过闪存接口访问固态存储设备中的NVM芯片,在控制部件外部的存储器中存储FTL表,FTL表包括多个表项,CPU用于执行根据本发明的第一方面或第二方面的方法。
根据本发明的第十四方面,提供了根据本发明第十四方面的第一固态存储设备,包括控制部件与在控制部件外部的存储器,控制部件包括闪存接口与至少一个CPU,CPU通过闪存接口访问固态存储设备中的NVM芯片,在控制部件外部的存储器中存储FTL表,FTL表包括多个表项,CPU用于从主机接收原子读命令;获取原子读命令要访问的逻辑地址;依据原子读命令要访问的逻辑地址,对与该逻辑地址对应的FTL表项加锁;若加锁成功,对原子读命令进行处理。
根据本发明的第十五方面,提供了根据本发明第十五方面的第一固态存储设备,包括控制部件与在控制部件外部的存储器,控制部件包括闪存接口与至少一个CPU,CPU通过闪存接口访问固态存储设备中的NVM芯片,在控制部件外部的存储器中存储FTL表,FTL表包括多个表项,其特征在于,CPU用于执行根据本发明的第三方面、第四方面、第五方面或第六方面的方法。
根据本发明的第十六方面,提供一种包括程序代码的程序,当被载入固态存储设备并在固态存储设备上执行时,所述程序代码使所述固态存储设备执行根据本发明第一方面的原子写命令执行方法。
根据本发明的第十七方面,提供一种包括程序代码的程序,当被载入固态存储设备并在固态存储设备上执行时,所述程序代码使所述固态存储设备执行根据本发明第二方面的原子写命令执行方法。
根据本发明的第十八方面,提供一种包括程序代码的程序,当被载入固态存储设备并在固态存储设备上执行时,所述程序代码使所述固态存储设备执行根据本发明第三方面的原子命令执行方法。
根据本发明的第十九方面,提供一种包括程序代码的程序,当被载入固态存储设备并在固态存储设备上执行时,所述程序代码使所述固态存储设备执行根据本发明第四方面的原子读命令执行方法。
根据本发明的第二十方面,提供一种包括程序代码的程序,当被载入固态存储设备并在固态存储设备上执行时,所述程序代码使所述固态存储设备执行根据本发明第四方面的原子命令的执行方法。
根据本发明的第二十一方面,提供一种包括程序代码的程序,当被载入固态存储设备并在固态存储设备上执行时,所述程序代码使所述固态存储设备执行根据本发明第四方面的原子命令执行方法。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为现有技术的存储设备的框图;
图2为现有技术的控制部件访问FTL表的示意图;
图3为根据本发明实施例的IO命令与IO子命令的示意图;
图4为根据本发明实施例的处理原子写命令的流程图;
图5为根据本发明实施例的原子命令的示意图;
图6为根据本发明实施例的处理图5的原子命令过程中的一个FTL表的示意图;
图7为根据本发明实施例的处理图5的原子命令过程中的又一FTL表的示意图;
图8为根据本发明又一实施例的原子命令的示意图;
图9为根据本发明实施例的处理图8的原子命令过程中的一个FTL表的示意图;
图10为根据本发明实施例的处理图8的原子命令过程中的又一FTL表的示意图;
图11为根据本发明实施例的处理图8的原子命令过程中的又一FTL表的示意图;
图12为根据本发明实施例的处理原子读命令的流程图。
图13为根据本发明实施例的处理原子命令的流程图;
图14为根据本发明又一实施例的原子命令的示意图;
图15为根据本发明实施例的处理图14的原子命令过程中的一个FTL表的示意图;
图16为根据本发明实施例的处理图14的原子命令过程中的又一FTL表的示意图;
图17为根据本发明实施例的处理图14的原子命令过程中的又一FTL表的示意图;
图18为根据本发明又一实施例的原子命令的示意图;
图19为根据本发明实施例的处理图18的原子命令过程中的一个FTL表的示意图;
图20为根据本发明实施例的处理图18的原子命令过程中的又一FTL表的示意图;
图21为根据本发明实施例的处理图18的原子命令过程中的又一FTL表的示意图;
图22为根据本发明又一实施例的原子命令的示意图;
图23为根据本发明实施例的处理图22的原子命令过程中的一个FTL表的示意图;
图24为根据本发明实施例的处理图22的原子命令过程中的又一FTL表的示意图;
图25为根据本发明实施例的处理图22的原子命令过程中的又一FTL表的示意图;
图26为根据本发明实施例的处理图22的原子命令过程中的又一FTL表的示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
存储了从逻辑地址到物理地址的映射信息的表结构被称为FTL表。FTL表是固态存储设备中的重要元数据。FTL表记录了存储设备中以数据页为单位的地址映射关系。FTL表包括多个FTL表的表项(或称条目)。
在一个例子中,每个FTL表的表项中记录了一个逻辑页地址与一个物理页的对应关系。作为又一个例子,每个FTL表的表项记录了逻辑地址与物理地址的对应关系,以及每个表项所对应的数据称为数据帧,数据帧的大小可以为512字节或4K字节等。
在另一个例子中,每个FTL表的表项中记录了连续的多个逻辑页地址与连续的多个物理页的对应关系。在又一个实施例中,每个FTL表的表项中记录了逻辑块地址与物理块地址的对应关系。在依然又一个例子中,FTL表中记录逻辑块地址与物理块地址的映射关系,和/或逻辑页地址与物理页地址的映射关系。
表2展示了示例性的FTL表。表2中示出了逻辑地址LBA0-LBA7对应的物理页地址,物理地址的形式为“a-b”,在前的符号a指示物理块地址,而在后的符号b指示物理页地址。以物理块1为例,其物理地址(Physical Black Address,PBA)为“PBA 1-4”的物理页中存储了逻辑地址为“LBA 0”的数据。
表2
LBA0 | PBA 1-4 |
LBA1 | PBA 3-6 |
LBA2 | PBA 1-9 |
LBA3 | PBA 1-10 |
LBA4 | PBA 3-15 |
LBA5 | PBA 3-13 |
LBA6 | PBA 3-3 |
LBA7 | PBA 1-15 |
图2为现有技术的控制部件访问FTL表的示意图。控制部件204包括多个CPU(CPU210、CPU 212与CPU 214)与闪存接口,控制部件的CPU通过闪存接口访问固态存储设备中的NVM芯片。在控制部件204外部的存储器中存储FTL表,FTL表包括多个表项(表项220、表项222与表项224)。多个CPU的每个能够独立的访问FTL表。由于FTL表项可能被多个CPU同时访问,为实现数据一致性,为每个FTL表项提供锁。
参看图2,为更新FTL表项224,CPU 210检查FTL表项224的锁234,在锁234指示FTL表项224未被加锁的情况下,CPU 210获得锁234(例如,将锁234设置为加锁状态),并获取FTL表项224(t1时刻)。接下来,CPU 210对获取的FTL表项224进行操作,并在t4时刻更新FTL表项224,以及将锁234释放(例如,将锁234设置为未加锁状态)。在t1-t4时刻期间,其他CPU(CPU 212与CPU 214)检索到锁234的存在,而暂时放弃对FTL表项224的访问。在图2中,t2时刻,CPU 212尝试访问FTL表项224,但发现无法获得锁234,于是放弃对FTL表项224的访问。类似地,CPU214也由于无法获得锁234而放弃在t3时刻对FTL表项224的访问。而在t4时候之后,CPU 210释放锁234,CPU 212与CPU 214中抢到锁234的那个CPU,将访问FTL表项234。在另一个例子中,在t1-t4时间段内,CPU 210的一个任务获得锁234,而CPU 210中的另一个任务由于没有获得锁234而也暂时放弃对FTL表项224的访问。
FTL表项的锁可以存储在对应的FTL表项的相同位置,或者在另外的存储空间中将多个FTL表项的锁集中存储。
FTL表项所对应的逻辑地址范围均按指定的位置对齐(例如,按4KB对齐,其起始地址位于4KB的整数倍地址处,例如,0、4KB、8KB)。作为举例,以FTL表项所对应的逻辑地址范围的首地址作为该FTL表项的地址。
可以理解地,即使控制部件204仅包括单一CPU,在对多个IO命令,和/或IO命令的多个子命令并行处理时,也可利用锁来保证数据一致性。
根据本发明的实施例,固态存储设备从主机接收IO命令。IO命令可指示其为原子操作。
在一些情况下,IO命令访问的逻辑地址范围小于FTL表项所指示的范围。例如,FTL表项指示4KB逻辑地址的范围,而IO命令向该4KB范围中的2KB写入数据。访问一个FTL表项即可响应该IO命令。在又一些情况下,IO命令访问的逻辑地址范围(例如,128KB)大于FTL表项的逻辑地址范围(例如,4KB),在此情况下,将IO命令拆分为多个子命令,每个子命令所访问的逻辑地址范围不超过一个FTL表项的逻辑地址范围。为处理每个子命令,依据子命令的逻辑地址,访问对应的FTL表项。
图3展示了根据本发明实施例的IO命令与IO子命令的示意图。作为举例,IO命令310访问1KB-10KB的逻辑地址空间,而每个FTL表项对应4KB地址空间。为处理IO命令310,将IO命令310拆分成子命令312、子命令314与子命令316。子命令312访问1KB-3KB的大小为3KB逻辑地址范围,子命令314访问4KB-7KB的大小为4KB的逻辑地址范围,子命令316访问8KB-10KB的大小为3KB的地址范围。每个子命令访问的逻辑地址的范围不超过一个FTL表项的逻辑地址范围。
可选地,IO命令所对应的逻辑地址空间无需连续,以及子命令的逻辑地址空间也无需连续。
实施例一
图4是根据本发明实施例一的处理原子写命令的流程图。为处理包括多个子命令的原子写命令,将属于同一原子写命令多个子命令,按子命令访问的逻辑地址的值排序(401)。每次对排序在最前的一个子命令进行处理,在处理完成后,按未被处理的多个子命令的逻辑地址的排序处理下一个子命令。
在处理一个子命令时,依据子命令访问的逻辑地址,请求为同该逻辑地址对应的FTL表项加锁(402)。为进行加锁,当FTL表项的锁指示该表项已被加锁时,加锁操作失败。而若FTL表项的锁指示该表项未被加锁,则加锁操作将成功,并且FTL表项的锁被设置为被加锁状态。若加锁操作不成功,则可再次或反复尝试对FTL表项加锁,直到加锁操作成功。在加锁操作成功之前,不对该子命令进行处理,也不对该原子写命令的排序在该子命令之后的其他子命令进行处理。
响应于加锁成功,对子命令进行处理,例如,为子命令分配物理地址,将子命令对应的数据写入所分配的物理地址,以及将子命令的逻辑地址与所分配的物理地址记录在被加锁的FTL表项中(403)。可选地,固态存储设备确保在加锁成功后,对子命令的处理将被执行完成。即使在子命令处理过程中发生掉电等异常事件,通过使用备用电源,固态存储设备依然确保子命令处理被执行完成。
接下来,判断是否已为该原子写命令的所有子命令对应的FTL表项全部加锁(404)。若未全部加锁,则按照未被处理的多个子命令的逻辑地址的排序,处理下一个子命令(402)。若该原子写命令的所有子命令对应的FTL表项已被全部加锁,则可继续完成对这些多个子命令的处理(405)。直到原子写命令的所有子命令都处理完成,释放同这些所有子命令对应的FTL表项的锁,使得同这些所有子命令对应的FTL表项的锁指示该表项未被加锁(406)。
可选地,步骤403与步骤404的顺序可以交换。在步骤402,为排序在前的子命令获得对应FTL表项的锁后,可直接通过步骤404判断是否有其他子命令待处理。并返回步骤402为排序的多个子命令中的下一子命令的逻辑地址对应的FTL表项请求锁。而对获得锁的一个或多个子命令,通过执行步骤403对子命令进行处理(403)。而步骤406,则需要发生在步骤404中判断出已经为该原子写命令的所有子命令对应的FTL表项全部加锁之后。
可选地,在步骤405执行完成,执行步骤406。或者在步骤404中判断出已经为该原子写命令的所有子命令对应的FTL表项全部加锁之后,按该原子写命令的多个子命令的逻辑地址顺序,释放同处理完成的子命令的逻辑地址对应的FTL表项的锁。
在根据本申请的实施例一中,处理每一个原子写命令时,满足两个条件:
(1)按原子写命令的多个子命令的逻辑地址的值的顺序,为每个子命令对应的FTL表项加锁,仅在加锁成功后,才处理按逻辑地址的值排序的下一子命令;
(2)在依据原子写命令的所有子命令都更新了对应的FTL表项后,才释放同该原子写命令的所有子命令对应的FTL表项的锁。
可选地,若在处理原子写命令期间,有待处理的原子读命令或其子命令,则在处理原子读命令时,无须检查相关FTL表项是否被加锁,也无须为处理原子读命令或其子命令而对相关FTL表项加锁。可以理解地,在处理原子读命令时,也可在获得锁的情况下,才对原子读命令进行处理。
可选地,为对原子写命令的多个子命令按逻辑地址顺序排序,可以按逻辑地址数值的升序排序,也可以按逻辑地址数值的降序排序。无论采用哪种方式作为排序的依据,对于处理的多个原子写命令,使用相同的排序方式。
在根据本申请的实施例中,在满足上述两个条件的情况下,可以对多个原子写命令的多个子命令并行处理。
实施例二
图5是根据本发明实施例二的原子命令的示意图。图6与图7是处理图5的原子命令过程中的FTL表的示意图。图5展示了固态存储设备从主机接收的原子写命令A与原子写命令B。原子写命令A包括3个子命令(X(t1),X+1(t5)与X+2(t3)),原子写命令B包括3个子命令(X(t4),X+1(t2)与X+2(t6))。在图5中,由每个方框指示子命令,例如,用X(t1)表示其中一个子命令,X指示子命令访问的逻辑地址,t1指示收到该子命令的时间,以及数字的大小指示了时间先后顺序。
t1时刻,收到原子写命令A的子命令X(t1)的数据。按逻辑地址顺序处理原子写命令A的多个子命令。由于子命令X(t1)是原子写命令A的多个子命令中逻辑地址排序最前的子命令,可以对子命令X(t1)进行处理(也参看图4,步骤402)。针对同逻辑地址X对应的FTL表项610(参看图6)申请锁,且申请成功;图6中,FTL表项610对应的锁A(t1)指示该表项的锁属于原子写命令A。可以理解地,在存储器中记录的锁可以仅指示锁的存在性,而不指示该锁所属的对象。
t2时刻,收到原子写命令B的子命令X+1(t2)的数据。由于需要按逻辑地址的顺序处理原子写命令B的多个子命令,而原子写命令B的多个子命令中,逻辑地址排序在前的子命令X(t4)的数据尚未收到,此时不能开始处理子命令X+1(t2)。
t3时刻,收到原子写命令A的子命令X+2(t3)的数据。由于需要按逻辑地址的顺序处理写原子命令A的多个子命令,而原子写命令A的多个子命令中,逻辑地址排序在前的子命令X+1(t5)的数据尚未收到,此时不能开始处理子命令X+2(t3)。
t4时刻,收到原子写命令B的子命令X(t4)的数据。按逻辑地址的顺序处理原子写命令B的多个子命令,子命令X(t4)是原子写命令B的尚未被处理的多个子命令中,逻辑地址排序最前的子命令,因而可以处理子命令X(t4)。为处理X(t4),请求用于逻辑地址X的FTL表项610的锁,而此时,该锁A(t1)属于原子写命令A,因而为原子写命令B请求用于逻辑地址X的FTL表项610的锁失败,此时不能开始处理子命令X(t4)。
t5时刻,收到原子写命令A的子命令X+1(t5)的数据,按逻辑地址的顺序处理原子写命令A的多个子命令,子命令X+1(t5)是原子写命令A尚未获得锁的多个子命令中排序最前的子命令,因而针对同子命令X+1(t5)的逻辑地址X+1对应的FTL表项612(参看图6)申请锁,且申请成功;FTL表项612对应的锁A(t5)指示该表项的锁属于原子写命令A。
由于为原子写命令A的按逻辑地址排序的第2个子命令X+1(t5)申请到锁,接下来可以处理原子写命令A的第3个子命令X+2(t3),针对同逻辑地址X+2对应的FTL表项614(参看图6)申请锁,且申请成功;FTL表项614对应的锁A(t3)指示该表项的锁属于原子写命令A。以及在原子写命令A的所有子命令处理完成后(也参看图4,步骤404),释放属于原子写命令A的所有子命令的锁(也参看图4,步骤406)。
接下来,检查等待执行的其他子命令的处理时机是否满足。原子写命令B的子命令X(t4)是原子写命令B的多个子命令中逻辑地址排序最前的子命令,为子命令X(t4)申请得到用于子命令X(t4)的逻辑地址X的FTL表项710(参看图7)的锁B(t4)。由于为原子写命令B的第1个子命令X(t4)申请到锁,接下来可以处理原子写命令B的第2个子命令X+1(t2),并成功申请到用于逻辑地址X+1的FTL表项712(参看图7)的锁B(t2)。接下来在t6时刻收到原子写命令B的第3个子命令X+2(t6),并且因子命令X+2(t6)是原子写命令B的未被处理的子命令中逻辑地址排序最前的子命令,可对其进行处理,并成功申请到用于逻辑地址X+2的FTL表项714(参看图7)的锁B(t6)。以及在原子写命令B的所有子命令处理完成后(也参看图4,步骤404),释放属于原子写命令B的所有子命令的锁(也参看图4,步骤406)。
参看表3,第二行示出了依据本发明实施例二,原子写命令A执行完成后的有效结果:在逻辑地址LBA(x)、LBA(x+1)与LBA(x+2)中分别是原子写命令A所写入的数据X(t1),X+1(t5)和X+2(t3)。表3的第三行示出了原子写命令B执行完成后的有效结果:在LBA(x)、LBA(x+1)与LBA(x+2)中分别是原子写命令B所写入的数据X(t4),X+1(t2)和X+2(t6)。因而,确保了在逻辑地址X到X+2范围内,不会出现部分逻辑地址是原子写命令A写入的数据而部分逻辑地址是原子写命令B写入的数据的情形,实现了原子写命令处理的原子性。
表3
实施例三
图8是根据本发明实施例三的原子命令的示意图。图9到图11是处理图8的原子命令过程中的FTL表的示意图。图8展示了固态存储设备从主机接收的原子写命令C、原子写命令D与原子写命令E。原子写命令C包括子命令(X(t1),X+1(t5)与X+2(t6));原子写命令D包括子命令(X(t7),X+1(t8)与X+2(t9));原子写命令D包括子命令(X+1(t2),X+2(t3)与X+3(t4))。在图8中,由每个方框指示子命令,例如,用X(t1)表示其中一个子命令,X指示子命令访问的逻辑地址,t1指示收到该子命令的时间,以及数字的大小指示了时间先后顺序。
t1时刻,收到原子写命令C的子命令X(t1)的数据。按逻辑地址顺序处理原子写命令C的多个子命令。由于子命令X(t1)是原子写命令C的多个子命令中逻辑地址排序最前的子命令,可以对子命令X(t1)进行处理(也参看图4,步骤402)。针对同逻辑地址X对应的FTL表项910(参看图9)申请锁,且申请成功。图9中,FTL表项910对应的锁C(t1)指示该表项的锁属于原子写命令C。可以理解地,在存储器中记录的锁可以仅指示锁的存在性,而不指示该锁所属的对象。
t2时刻,收到原子写命令E的子命令X+1(t2)的数据。按逻辑地址顺序处理原子写命令E的多个子命令。由于子命令X+1(t2)是原子写命令E的多个子命令中逻辑地址排序最前的子命令,可以对子命令X+1(t2)进行处理(也参看图4,步骤402)。针对同子命令X+1(t2)的逻辑地址X+1对应的FTL表项912(参看图9)申请锁,且申请成功;FTL表项912对应的锁E(t2)指示该表项的锁属于原子写命令E。
t3时刻,收到原子写命令E的子命令X+2(t3)的数据。按逻辑地址的顺序处理原子写命令E的多个子命令。子命令X+2(t3)是原子写命令E的尚未被处理的多个子命令中,逻辑地址排序最前的子命令,因而可以处理子命令X+2(t3)。针对同子命令X+2(t3的逻辑地址X+2对应的FTL表项914(参看图9)申请锁,且申请成功。FTL表项914对应的锁E(t3)指示该表项的锁属于原子写命令E。
t4时刻,收到原子写命令E的子命令X+3(t4)的数据。按逻辑地址的顺序处理写命令E的多个子命令。子命令X+3(t4)是原子写命令E的尚未被处理的多个子命令中,逻辑地址排序最前的子命令,因而可以处理子命令X+3(t4)。针对同子命令X+3(t4)的逻辑地址X+3对应的FTL表项916(参看图9)申请锁,且申请成功。FTL表项916对应的锁E(t4)指示该表项的锁属于原子写命令E。以及在原子写命令E的所有子命令处理完成后(也参看图4,步骤404),释放属于原子写命令E的所有子命令的锁(也参看图4,步骤406)。
t5时刻,收到原子写命令C的子命令X+1(t5)的数据。按逻辑地址顺序处理原子写命令C的多个子命令。由于子命令X+1(t5)是原子写命令C的尚未被处理的多个子命令中逻辑地址排序最前的子命令,可以对子命令X+1(t5)进行处理。针对同子命令X+1(t5)的逻辑地址X+1对应的FTL表项912(参见图10)申请锁,且申请成功;FTL表项912对应的锁C(t5)指示该表项的锁属于原子写命令C。
t6时刻,收到原子写命令C的子命令X+2(t6)的数据。由于子命令X+2(t)是原子写命令C的尚未被处理的多个子命令中逻辑地址排序最前的子命令,可以对子命令X+2(t6)进行处理。针对同子命令X+2(t6)的逻辑地址X+2对应的FTL表项914(参见图10)申请锁,且申请成功。FTL表项914对应的锁C(t6)指示该表项的锁属于原子写命令C。以及在原子写命令C的所有子命令处理完成后(也参看图4,步骤404),释放属于原子写命令C的所有子命令的锁(也参看图4,步骤406)。
以及同图9相比,图10中,FTL表项916的锁已被释放。
t7时刻,收到原子写命令D的子命令X(t7)的数据。由于子命令X(t7)是原子写命令D的尚未被处理的多个子命令中逻辑地址排序最前的子命令,可以对子命令X(t7)进行处理。针对同子命令X(t7)的逻辑地址X对应的FTL表项910(参见图11)申请锁,且申请成功。FTL表项910对应的锁D(t7)指示该表项的锁属于原子写命令D。
t8时刻,收到原子写命令D的子命令X+1(t8)的数据。由于子命令X+1(t8)是原子写命令D的尚未被处理的多个子命令中逻辑地址排序最前的子命令,可以对子命令X+1(t8)进行处理。针对同子命令X+1(t8)的逻辑地址X+1对应的FTL表项912(参见图11)申请锁,且申请成功。FTL表项912对应的锁D(t8)指示该表项的锁属于原子写命令D。
t9时刻,收到原子写命令D的子命令X+2(t9)的数据。由于子命令X+2(t9)是原子写命令D的尚未被处理的多个子命令中逻辑地址排序最前的子命令,可以对子命令X+2(t9)进行处理。针对同子命令X+2(t9)的逻辑地址X+2对应的FTL表项914(参见图11)申请锁,且申请成功。FTL表项914对应的锁D(t9)指示该表项的锁属于原子写命令D。以及在原子写命令D的所有子命令处理完成后(也参看图4,步骤404),释放属于原子写命令D的所有子命令的锁(也参看图4,步骤406)。
参看表4,第二行示出了依据本发明实施例三,原子写命令E执行完成后的有效结果:在逻辑地址LBA(X+1)、LBA(X+2)与LBA(X+3)中分别是原子写命令E所写入的数据X+1(t2)、X+2(t3)和X+3(t4),而在逻辑地址LBA(X)中则是原子写命令C所写入的数据X(t1)。表4的第三行示出了原子写命令C执行完成后有效的结果:在逻辑地址LBAX、LBA(X+1)与LBA(X+2)中分别是原子写命令C所写入的数据X(t1),X+1(t5)和X+2(t6),而在逻辑地址LBA(X+3)处则保留了原子写命令E所写入的数据X+3(t4)。表4的第四行示出了原子写命令D执行完成后的有效结果:在逻辑地址LBA(X)、LBA(X+1)与LBA(X+2)中分别是原子写命令D所写入的数据X(t7),X+1(t8)和X+2(t9),而在逻辑地址LBA(X+3)处则保留了原子写命令E所写入的数据X+3(t4)。
表4
根据本申请的实施例二或三,可选地,若在处理原子写命令期间,有待处理的读命令或其子命令,则在处理读命令时,无须检查相关FTL表项是否被加锁,也无须为处理读命令或其子命令而对相关FTL表项加锁。可以理解地,在处理读命令时,也可在获得锁的情况下,才对读命令进行处理。
通过以上面公开的方式处理原子写命令,能够满足NVMe协议中对掉电原子性(AWUPF,Atomic Write Unit Power Fail)的要求,保障在掉电或其他错误条件打断了写操作时,固态存储设备对写操作的处理行为。固态存储设备确保,如果因掉电或其他错误条件导致命令处理失败,那么对关联于失败命令的逻辑地址的后续读命令将得到:(1)所有的旧数据(被打断的写命令访问的逻辑地址上的原始数据);或者(2)所有的新数据(被打断的写命令所写入的全部数据)。
实施例四
NVMe规范中还定义了一般原子性(AWUN,Atomic Write Unit Normal)。一般原子性定义了命令执行相对于其他命令的原子性,确保写命令相对于其他读命令或写命令具有原子性。除了要求写入NVM芯片的数据不会同时包含新命令的部分数据与新命令之外的其他命令的部分数据,还需要保证主机发出的读命令读到的数据中不会同时包含新命令的部分数据与新命令之外的其他命令的部分数据。
在根据本申请的实施例中,固态存储设备通过同时实现读命令的原子处理与写命令的原子处理来实现符合NVMe规范要求的一般原子性(AWUN)。
图12是根据本发明实施例四的处理原子读命令的流程图。原子读命令可被拆分为多个子命令,每个子命令具有所访问的逻辑地址。为处理包括多个子命令的原子读命令,将属于同一原子读命令多个子命令,按子命令访问的逻辑地址的值排序(121)。每次对排序在最前的一个子命令进行处理,在处理完成后,按未被处理的多个子命令的逻辑地址的排序处理下一个子命令。
在处理一个子命令时,依据子命令访问的逻辑地址,请求为同该逻辑地址对应的FTL表项加锁(122)。为进行加锁,当FTL表项的锁指示该表项已被加锁时,加锁操作失败。而若FTL表项的锁指示该表项未被加锁,则加锁操作将成功,并且将FTL表项的锁被设置为被加锁状态。若加锁操作不成功,则可再次或反复尝试对FTL表项加锁,直到加锁操作成功。在加锁操作成功之前,不对该子命令进行处理。也不对该原子写命令的排序在该子命令之后的其他子命令进行处理。
响应于加锁成功,对子命令进行处理(123),例如,依据子命令的逻辑地址获取对应的物理地址,从所获取的物理地址读出数据。
接下来,判断是否已为该原子写命令的所有子命令对应的FTL表项全部加锁(124)。若未全部加锁,则按照未被处理的多个子命令的逻辑地址的排序,处理下一个子命令(122)。若该原子写命令的所有子命令对应的FTL表项已被全部加锁,则可继续完成对这些多个子命令的处理(125)。直到原子读命令的所有子命令都处理完成,释放同这些所有子命令对应的FTL表项的锁(126),使得同这些所有子命令对应的FTL表项的锁指示对应的表项未被加锁。
可选地,步骤123与步骤124的顺序可以交换。在步骤122为排序在前的子命令获得对应FTL表项的锁后,可直接通过步骤124判断是否有其他子命令待处理。并返回步骤122为排序的多个子命令中的下一子命令的逻辑地址对应的FTL表项请求锁。而对获得锁的一个或多个子命令,通过执行步骤123对子命令进行处理(123)。而步骤126,则需要发生在步骤124中判断出已经为该原子读命令的所有子命令对应的FTL表项全部加锁之后。
可选地,在步骤125执行完成,执行步骤126。或者在步骤124中判断出已经为该原子读命令的所有子命令对应的FTL表项全部加锁之后,按该原子读命令的多个子命令的逻辑地址顺序,释放同处理完成的子命令的逻辑地址对应的FTL表项的锁。
可选地,对原子读命令的子命令对应的FTL表项加锁成功后,即可处理该子命令,依据从FTL表项中获取的物理地址,从物理地址读出数据,作为该子命令所需的数据,而无须等待为该读命令的所有子命令对应的FTL表项全都加锁成功。
在根据本申请的实施例四中,处理每一个原子读命令时,满足两个条件:
(1)按原子读命令的多个子命令的逻辑地址的值的顺序,为每个子命令对应的FTL表项加锁,仅在加锁成功后,才处理按逻辑地址的值排序的下一子命令;
(2)在依据原子读命令的所有子命令都获得了对应的FTL表项的锁与FTL表项中记录的物理地址后,才释放同该原子读命令的所有子命令对应的FTL表项的锁。
可选地,为对原子读命令的多个子命令按逻辑地址顺序排序,可以按逻辑地址数值的升序排序,也可以按逻辑地址数值的降序排序。无论采用哪种方式作为排序的依据,对于处理的多个原子读命令和/或原子写命令,使用相同的排序方式。
在根据本申请的实施例中,在满足上述两个条件的情况下,可以对多个原子读命令的多个子命令并行处理。
实施例五
图13是根据本发明实施例五的处理原子命令的流程图。在根据本发明的实施例五中,固态存储设备从主机接收原子命令,原子命令中指示了原子命令的类型(例如,原子读命令或原子写命令),若原子命令的类型为原子读命令(130),还确定该原子读命令是否需要满足一般原子性(1310)。
在一个例子中,若该原子读命令需要满足一般原子性,且原子读命令被拆分为多个子命令,则按照图12所示的流程(也参看对实施例四的描述)来处理该原子读命令(参看图12)。
若该原子读命令不需要满足一般原子性,则无须检查相关FTL表项是否被加锁,也无须为处理原子读命令或其子命令而对相关FTL表项加锁,而直接处理属于该原子读命令的每个子命令(1330)。
若原子命令的类型为原子写命令,继续确定该原子写命令是否需要满足一般原子性或掉电原子性(1340)。若该原子写命令需要满足一般原子性或掉电原子性,且原子写命令包括多个子命令,则按照图4所示的流程(也参看对实施例一的描述)处理该原子写命令。
因而,在实施例五中,若固态存储设备需要满足掉电原子性,对原子写命令,按图4所示的流程进行处理,而对原子读命令的处理则无约束(无须为对个子命令按逻辑地址的顺序请求锁)。若固态存储设备需要满足一般原子性,则在对原子写命令按图4所示的流程进行处理的同时,对原子读命令按图12所示的流程进行处理。
实施例六
图14是根据本发明的实施例六的原子命令的示意图。图15到图17是处理图14的原子命令过程中的FTL表的示意图。图14展示了固态存储设备从主机接收的原子写命令F、原子读命令G与原子写命令H。原子写命令F包括子命令(X(t1),X+1(t2)与X+2(t3));原子读命令G包括有子命令(X(t4),X+1(t8)与X+2(t9));原子写命令H包括有子命令(X(t5),X+1(t6)与X+2(t7))。在图14中,由每个方框指示子命令,例如,用X(t1)表示其中一个子命令,X指示子命令访问的逻辑地址,t1指示收到该子命令的时间,以及数字的大小指示了时间先后顺序。在实施例六中,根据图13所示的流程图对图14展示的原子命令进行处理。
t1时刻,收到原子写命令F的子命令X(t1)的数据。按逻辑地址顺序处理原子写命令F的多个子命令。由于子命令X(t1)是原子写命令F的多个子命令中逻辑地址排序最前的子命令,可以对子命令X(t1)进行处理(也参看图4,步骤402,图13,步骤1344)。针对同子命令X(t1)的逻辑地址X对应的FTL表项1510申请锁(参看图15),且申请成功。图15中,FTL表项1510对应的锁F(t1)指示该表项的锁属于原子写命令F。
t2时刻,收到原子写命令F的子命令X+1(t2)的数据。按逻辑地址顺序处理原子写命令F的多个子命令。子命令X+1(t2)是原子写命令F的尚未被处理的多个子命令中,逻辑地址排序最前的子命令,因而可以处理子命令X+1(t2)。针对同子命令X+1(t2)的逻辑地址X+1对应的FTL表项1512申请锁(参看图15),且申请成功。FTL表项1512对应的锁F(t2)指示该表项的锁属于原子写命令F。
t3时刻,收到原子写命令F的子命令X+2(t3)的数据。按逻辑地址顺序处理原子写命令F的多个子命令。子命令X+2(t3)是原子写命令F的尚未被处理的多个子命令中,逻辑地址排序最前的子命令,因而可以处理子命令X+2(t3)。针对同子命令X+2(t3)的逻辑地址X+2对应的FTL表项1514(参看图15)申请锁,且申请成功;FTL表项1514对应的锁F(t3)指示该表项的锁属于原子写命令F。接下来,在原子写命令F的所有子命令处理完成后(也参看图4,步骤405,图13,步骤1350),释放属于原子写命令F的所有子命令对应的FTL表项1510、FTL表项1512与FTL表项1514的锁(也参看图4,步骤406,图13,步骤1352)。
t4时刻,收到原子读命令G的子命令X(t4)。按逻辑地址顺序处理原子读命令G的多个子命令。子命令X(t4)是原子读命令G的尚未被处理的多个子命令中,逻辑地址排序最前的子命令,因而可以处理子命令X(t4)。针对同子命令X(t4)的逻辑地址X对应的FTL表项1510申请锁(参看图16),且申请成功;FTL表项1510对应的锁G(t4)指示该表项的锁属于原子读命令G。
t5时刻,收到原子写命令H的子命令X(t5)的数据。按逻辑地址的顺序处理原子写命令H的多个子命令。子命令X(t5)是原子写命令H的尚未被处理的多个子命令中,逻辑地址排序最前的子命令,因而可以处理子命令X(t5)。为处理子命令X(t5),请求用于逻辑地址X的FTL表项1510的锁,而此时,该锁G(t4)属于原子读命令G,因而为原子写命令H请求用于逻辑地址X的FTL表项1510的锁失败,此时不能开始处理子命令X(t5)。
t6时刻,收到原子写命令H的子命令X+1(t6)的数据。按逻辑地址的顺序处理原子写命令H的多个子命令。由于原子写命令H的按逻辑地址排序在前的子命令X(t5)尚未申请到锁,因而与子命令X(t5)同属于原子写命令H的排序在后的子命令X+1(t6)暂不被处理。
t7时刻,收到原子写命令H的子命令X+2(t7)的数据。按逻辑地址的顺序处理原子写命令H的多个子命令。由于原子写命令H的按逻辑地址排序在前的子命令X(t5)和X+1(t6)均尚未申请到锁,因而与子命令X(t5)和X+1(t6)同属于原子写命令H的排序在后的子命令X+2(t7)也暂不被处理。
t8时刻,收到原子读命令G的子命令X+1(t8)。按逻辑地址的顺序处理原子读命令G的多个子命令。由于原子读命令G的按逻辑地址排序的第1个子命令X(t4)已申请到锁,接下来可以处理原子读命令G的第2个的子命令X+1(t8)。针对同X+1(t8)的逻辑地址X+1对应的FTL表项1512(参看图16)申请锁,且申请成功,FTL表项1512对应的锁G(t8)指示该表项的锁属于原子读命令G。
t9时刻,收到原子读命令G的子命令X+2(t9),按逻辑地址的顺序处理原子读命令G的多个子命令。子命令X+2(t9)是原子读命令G的尚未被处理的多个子命令中,逻辑地址排序最前的子命令,因而可以处理子命令X+2(t9)。针对同X+2(t9)的逻辑地址X+2对应的FTL表项1514申请锁(参看图16),且申请成功;FTL表项1514对应的锁G(t9)指示该表项的锁属于原子读命令G。以及在原子读命令G的所有子命令处理完成后(也参看图12,步骤125;以及图13,步骤1320),释放属于原子读命令G的所有子命令对应的FTL表项1510、FTL表项1512与FTL表项1514的锁(也参看图12,步骤126,以及图13,步骤1322)。
接下来,检查等待执行的其他子命令的处理时机是否满足。原子写命令H的子命令X(t5)是原子写命令H的多个子命令中逻辑地址排序最前的子命令。由于之前已为原子写命令H的按逻辑地址排序的最先的子命令X(t5)请求锁,当FTL表项1510的锁被释放后,为子命令X(t5)申请得到用于逻辑地址X的FTL表项1510(参看图17)的锁H(t5)。由于为原子写命令H的第1个子命令X(t5)申请到锁,接下来可以处理原子写命令H的排序在后的子命令X+1(t6)与X+2(t7)。依次分别为子命令X+1(t6)与子命令X+2(t7)的逻辑地址X+1与X+2的FTL表项1512与FTL表项1514(参看图17)申请锁,且申请成功;FTL表项1512对应的锁H(t6)与FTL表项1514对应的锁H(t7)均指示其属于原子写命令H。以及在原子写命令H的所有子命令处理完成后(也参看图4,步骤405,图13,步骤1350),释放属于原子写命令H的所有子命令对应的FTL表项1510、FTL表项1512与FTL表项1514的锁(也参看图4,步骤406,以及图13,步骤1352)。
参看表5,第二行示出了依据本发明实施例六,原子写命令F执行完成后的有效结果:在逻辑地址LBA(x+1)、LBA(x+2)与LBA(x+3)中分别是原子写命令F所写入的数据X(t1)(这里用子命令X(t1)指示该子命令所写入的数据)、X+1(t2)和X+2(t3)。图14的三个原子命令中,原子读命令G先于原子写命令H被执行完成。表5的第三行示出了原子读命令G所读到的结果:原子读命令G从逻辑地址LBA(x)、LBA(x+1)与LBA(x+2)中分别读出的数据X(t1)(这里用X(t1)指示读出的是子命令X(t1)所写入的数据)、X+1(t2)和X+2(t3)。表5的第四行示出了原子写命令H执行完成后的有效结果:在逻辑地址LBA(x)、LBA(x+1)与LBA(x+2)中分别是原子写命令H所写入的数据X(t5)、X+1(t6)和X+2(t7)。
表5
实施例七
图18是根据本发明的实施例七的原子命令的示意图。图19到图21是处理图18的原子命令过程中的FTL表的示意图。图18展示了固态存储设备从主机接收的原子写命令I、原子读命令J与原子写命令K。原子写命令I包括子命令(X(t1),X+1(t2)与X+2(t3));原子读命令J包括子命令(X(t9),X+1(t4)与X+2(t7));原子写命令K包括子命令(X(t5),X+1(t6)与X+2(t8))。在实施例七中,根据图13所示的流程图对图18展示的原子命令进行处理。
t1时刻,收到原子写命令I的子命令X(t1)的数据。按逻辑地址顺序处理原子写命令I的多个子命令。由于子命令X(t1)是原子写命令I的多个子命令中逻辑地址排序最前的子命令,可以对子命令X(t1)进行处理(也参看图4,步骤402,图13,步骤1344)。针对同子命令X(t1)的逻辑地址X对应的FTL表项1910申请锁(参看图19),且申请成功。图19中,FTL表项1910对应的锁I(t1)指示该表项的锁属于原子写命令I。
t2时刻,收到原子写命令I的子命令X+1(t2)的数据。按逻辑地址顺序处理原子写命令I的多个子命令。子命令X+1(t2)是原子写命令I的尚未被处理的多个子命令中,逻辑地址排序最前的子命令,因而可以处理子命令X+1(t2)。针对同子命令X+1(t2)的逻辑地址X+1对应的FTL表项1912申请锁(参看图19),且申请成功。FTL表项1912对应的锁I(t2)指示该表项的锁属于原子写命令I。
t3时刻,收到原子写命令I的子命令X+2(t3)的数据。按逻辑地址顺序处理原子写命令I的多个子命令。子命令X+2(t3)是原子写命令I的尚未被处理的多个子命令中,逻辑地址排序最前的子命令,因而可以处理子命令X+2(t3)。针对同子命令X+2(t3)的逻辑地址X+2对应的FTL表项1914(参看图19)申请锁,且申请成功;FTL表项1914对应的锁I(t3)指示该表项的锁属于原子写命令I。接下来,在原子写命令I的所有子命令处理完成后(也参看图4,步骤405,图13,步骤1350),释放属于原子写命令I的所有子命令对应的FTL表项1910、FTL表项1912与FTL表项1914的锁(也参看图4,步骤406,图13,步骤1352)。
t4时刻,收到原子读命令J的子命令X+1(t4)。由于需要按逻辑地址顺序处理原子读命令J的多个子命令,而原子读命令J的多个子命令中,逻辑地址排序在前的子命令X(t9)尚未收到,此时不能开始处理子命令X+1(t4)。
t5时刻,收到原子写命令K的子命令X(t5)的数据。按逻辑地址顺序处理原子写命令K的多个子命令。由于子命令X(t5)是原子写命令K的多个子命令中逻辑地址排序最前的子命令,可以对子命令X(t5)进行处理(也参看图4,步骤402,图13,步骤1344)。针对同子命令X(t5)的逻辑地址X对应的FTL表项1910申请锁(参看图20),且申请成功。图20中,FTL表项1910对应的锁K(t5)指示该表项的锁属于原子写命令K。
t6时刻,收到原子写命令K的子命令X+1(t6)的数据。按逻辑地址顺序处理原子写命令K的多个子命令。由于子命令X+1(t6)是原子写命令K的多个尚未处理的子命令中逻辑地址排序最前的子命令,可以对子命令X+1(t6)进行处理(也参看图4,步骤402,图13,步骤1344)。针对同子命令X+1(t6)的逻辑地址X+1对应的FTL表项1910申请锁(参看图20),且申请成功。图20中,FTL表项1910对应的锁K(t6)指示该表项的锁属于原子写命令K。
t7时刻,收到原子读命令J的子命令X+2(t7)。由于需要按逻辑地址顺序处理原子读命令J的多个子命令,而原子读命令J的多个子命令中,由于尚未为读命令J的逻辑地址排序在前的子命令X(t9)申请锁,因而不能开始处理子命令X+2(t7)。
t8时刻,收到原子写命令K的子命令X+2(t8)的数据。按逻辑地址顺序处理原子写命令K的多个子命令。由于子命令X+2(t8)是原子写命令K的多个尚未处理的子命令中逻辑地址排序最前的子命令,可以对子命令X+2(t8)进行处理(也参看图4,步骤402,图13,步骤1344)。针对同子命令X+2(t8)的逻辑地址X+2对应的FTL表项1914申请锁(参看图20),且申请成功。图20中,FTL表项1914对应的锁K(t8)指示该表项的锁属于原子写命令K。以及在原子写命令K的所有子命令处理完成后(也参看图4,步骤405,图13,步骤1350),释放属于原子写命令K的所有子命令对应的FTL表项1910、FTL表项1912与FTL表项1914的锁(也参看图4,步骤406,图13,步骤1352)。
T9时刻,收到原子读命令J的子命令X(t9)。按逻辑地址顺序处理原子写命令J的多个子命令。由于子命令X(t9)是原子写命令J的多个子命令中逻辑地址排序最前的子命令,可以对子命令X(t9)进行处理(也参看图4,步骤402,图13,步骤1314)。针对同子命令X(t9)的逻辑地址X对应的FTL表项1910申请锁(参看图21),且申请成功。图21中,FTL表项1910对应的锁J(t9)指示该表项的锁属于原子写命令J。
接下来,检查等待执行的其他子命令的处理时机是否满足。由于已为原子读命令J的按逻辑地址排序的最先的子命令X(t9)请求锁成功,因而可以处理原子读命令的排序在后的子命令X+1(t4)与X+2(t7)。依次分别为子命令X+1(t4)与子命令X+2(t7)的逻辑地址X+1与X+2的FTL表项1912与FTL表项1914(参看图21)申请锁,且申请成功;FTL表项1912对应的锁J(t4)与FTL表项1914对应的锁J(t7)均指示其属于原子读命令J。以及在原子读命令J的所有子命令处理完成后(也参看图12,步骤125,图13,步骤1320),释放属于原子读命令J的所有子命令对应的FTL表项1910、FTL表项1912与FTL表项1914的锁(也参看图12,步骤126,图13,步骤1322)。
参看表6,第二行示出了依据本发明实施例七,原子写命令I执行完成后的有效结果:在逻辑地址LBA(x+1)、LBA(x+2)与LBA(x+3)中分别是原子写命令I所写入的数据X(t1)、X+1(t2)和X+2(t3)。原子写命令K在原子读命令J之前被执行完成。表6的第三行示出了原子写命令K执行完成后的有效结果:在LBA(x)、LBA(x+1)与LBA(x+2)中分别是原子写命令K所写入的X(t5)、X+1(t6)和X+2(t8)。表6的第四行示出了原子读命令J所读到的结果:从LBA(x)、LBA(x+1)与LBA(x+2)中分别读出的是原子写命令K所写入的数据X(t5)、X+1(t6)和X+2(t8)。
表6
实施例八
图22是根据本发明实施例八的原子命令的示意图。图22到图26是处理图22的原子命令过程中的FTL表的示意图。图22展示了固态存储设备从主机接收的原子写命令L、原子读命令M、原子写命令N和原子写命令O。原子写命令L包括子命令(X(t1),X+1(t6)与X+2(t7));原子读命令M包括子命令(X(t8),X+1(t9)与X+2(t10));原子写命令N包括子命令(X+1(t2),X+2(t4)与X+3(t5));原子读命令O包括子命令(X-1(t3),X(t11),X+1(t12),X+2(t13)与X+3(t14))。
t1时刻,收到原子写命令L的子命令X(t1)的数据。按逻辑地址顺序处理原子写命令L的多个子命令。由于子命令X(t1)是原子写命令L的多个子命令中逻辑地址排序最前的子命令,可以对子命令X(t1)进行处理(也参看图4,步骤402,图13,步骤1344)。针对同子命令X(t1)的逻辑地址X对应的FTL表项2310申请锁(参看图23),且申请成功。图23中,FTL表项2310对应的锁L(t1)指示该表项的锁属于原子写命令L。
t2时刻,收到原子写命令N的子命令X+1(t2)的数据。按逻辑地址顺序处理原子写命令N的多个子命令。由于子命令X+1(t2)是原子写命令N的多个子命令中逻辑地址排序最前的子命令,可以对子命令X+1(t2)进行处理(也参看图4,步骤402,图13,步骤1344)。针对同子命令X+1(t2)的逻辑地址X+1对应的FTL表项2312申请锁(参看图23),且申请成功。图23中,FTL表项2312对应的锁N(t2)指示该表项的锁属于原子写命令N。
t3时刻,收到原子读命令O的子命令X-1(t3)的数据。按逻辑地址顺序处理原子读命令O的多个子命令。由于子命令X-1(t3)是原子读命令O的多个子命令中逻辑地址排序最前的子命令,可以对子命令X-1(t3)进行处理(也参看图12,步骤122,图13,步骤1344)。针对同子命令X-1(t3)的逻辑地址X-1对应的FTL表项2318申请锁(参看图23),且申请成功。图23中,FTL表项2318对应的锁O(t3)指示该表项的锁属于原子读命令O。
t4时刻,收到原子写命令N的子命令X+2(t4)的数据。按逻辑地址顺序处理原子写命令N的多个子命令。由于子命令X+2(t4)是原子写命令N的多个尚未处理的子命令中逻辑地址排序最前的子命令,可以对子命令X+2(t4)进行处理(也参看图4,步骤402,图13,步骤1344)。针对同子命令X+2(t4)的逻辑地址X+2对应的FTL表项2314申请锁(参看图23),且申请成功。图23中,FTL表项2314对应的锁N(t4)指示该表项的锁属于原子写命令N。
t5时刻,收到原子写命令N的子命令X+3(t5)的数据。按逻辑地址顺序处理原子写命令N的多个子命令。由于子命令X+3(t5)是原子写命令N的多个尚未处理的子命令中逻辑地址排序最前的子命令,可以对子命令X+3(t5)进行处理(也参看图4,步骤402,图13,步骤1344)。针对同子命令X+3(t5)的逻辑地址X+3对应的FTL表项2316申请锁(参看图23),且申请成功。图23中,FTL表项2316对应的锁N(t5)指示该表项的锁属于原子写命令N。在T5之后,为原子写命令N的所有子命令所对应的FTL表项均申请了锁。以及在原子写命令N的多个子命令处理完成后(也参看图4,步骤405,图13,步骤1350),释放属于原子写命令N的所有子命令对应的FTL表项2312、FTL表项2314与FTL表项2316的锁(也参看图4,步骤406,图13,步骤1352)。
t6时刻,收到原子写命令L的子命令X+1(t6)的数据。按逻辑地址顺序处理原子写命令L的多个子命令。由于已为原子写命令L的按逻辑地址排序最前的子命令X(t1)申请到锁,且子命令X+1(t6)是原子写命令L的多个尚未处理的子命令中逻辑地址排序最前的子命令,因而可以对子命令X+1(t6)进行处理。针对同子命令X+1(t6)的逻辑地址X+1对应的FTL表项2312申请锁(参看图24),且申请成功。图24中,FTL表项2312对应的锁L(t6)指示该表项的锁属于原子写命令L。
t7时刻,收到原子写命令L的子命令X+2(t7)的数据。按逻辑地址顺序处理原子写命令L的多个子命令。由于子命令X+2(t7)是原子写命令L的多个尚未处理的子命令中逻辑地址排序最前的子命令,可以对子命令X+2(t7)进行处理(也参看图4,步骤402,图13,步骤1344)。针对同子命令X+2(t7)的逻辑地址X+2对应的FTL表项2314申请锁(参看图24),且申请成功。图24中,FTL表项2314对应的锁L(t7)指示该表项的锁属于原子写命令L。以及在原子写命令L的多个子命令处理完成后(也参看图4,步骤405,图13,步骤1350),释放属于原子写命令L的所有子命令对应的FTL表项2310、FTL表项2312与FTL表项2314的锁(也参看图4,步骤406,图13,步骤1352)。
以及同图24相比,图23中,FTL表项2316的锁已被释放。
t8时刻,收到原子读命令M的子命令X(t8)。按逻辑地址顺序处理原子读命令M的多个子命令。由于子命令X(t8)是原子读命令M的多个子命令中逻辑地址排序最前的子命令,可以对子命令X(t8)进行处理(也参看图12,步骤122,以及图13,步骤1314。针对同子命令X(t8)的逻辑地址X对应的FTL表项2310申请锁(参看图25),且申请成功。图25中,FTL表项2310对应的锁M(t8)指示该表项的锁属于原子读命令M。
t9时刻,收到原子读命令M的子命令X+1(t9)。按逻辑地址顺序处理原子读命令M的多个子命令。由于子命令X+1(t9)是原子读命令M的多个尚未处理的子命令中逻辑地址排序最前的子命令,可以对子命令X+1(t9)进行处理(也参看图12,步骤122,图13,步骤1314)。针对同子命令X+1(t9)的逻辑地址X+1对应的FTL表项2312申请锁(参看图25),且申请成功。图25中,FTL表项2312对应的锁M(t9)指示该表项的锁属于原子读命令M。
t10时刻,收到原子读命令M的子命令X+2(t10)。按逻辑地址顺序处理原子读命令M的多个子命令。由于子命令X+2(t10)是原子读命令M的多个尚未处理的子命令中逻辑地址排序最前的子命令,可以对子命令X+2(t10)进行处理(也参看图12,步骤122,图13,步骤1314)。针对同子命令X+2(t10)的逻辑地址X+2对应的FTL表项2314申请锁(参看图25),且申请成功。图25中,FTL表项2314对应的锁M(t10)指示该表项的锁属于原子读命令M。以及在原子读命令M的多个子命令处理完成后(也参看图12,步骤125,图13,步骤1320),释放属于原子读命令M的所有子命令对应的FTL表项2310、FTL表项2312与FTL表项2314的锁(也参看图12,步骤126,图13,步骤1322)。
t11时刻,收到原子读命令O的子命令X(t11)的数据。按逻辑地址顺序处理原子读命令O的多个子命令。由于已为原子读命令O的按逻辑地址排序最前的子命令X-1(t3)申请到锁,且子命令X(t11)是原子读命令O的多个尚未处理的子命令中逻辑地址排序最前的子命令,因而可以对子命令X(t11)进行处理。针对同子命令X(t11)的逻辑地址X对应的FTL表项2310申请锁(参看图26),且申请成功。图26中,FTL表项2310对应的锁O(t11)指示该表项的锁属于原子读命令O。
接下来,t12时刻,收到原子读命令O的子命令X+1(t12)的数据。按逻辑地址顺序处理原子读命令O的多个子命令。由于子命令X+1(t12)是原子读命令O的多个尚未处理的子命令中逻辑地址排序最前的子命令,因而可以对子命令X+1(t12)进行处理。针对同子命令X+1(t12)的逻辑地址X+1对应的FTL表项2312申请锁(参看图26),且申请成功。图26中,FTL表项2312对应的锁O(t12)指示该表项的锁属于原子读命令O。
接下来,t13时刻,收到原子读命令O的子命令X+2(t13)的数据。按逻辑地址顺序处理原子读命令O的多个子命令。由于子命令X+2(t13)是原子读命令O的多个尚未处理的子命令中逻辑地址排序最前的子命令,因而可以对子命令X+2(t13)进行处理。针对同子命令X+2(t13)的逻辑地址X+2对应的FTL表项2314申请锁(参看图26),且申请成功。图26中,FTL表项2314对应的锁O(t13)指示该表项的锁属于原子读命令O。
接下来,t14时刻,收到原子读命令O的子命令X+3(t14)的数据。按逻辑地址顺序处理原子读命令O的多个子命令。由于子命令X+3(t14)是原子读命令O的多个尚未处理的子命令中逻辑地址排序最前的子命令,因而可以对子命令X+3(t14)进行处理。针对同子命令X+3(t14)的逻辑地址X+3对应的FTL表项2316申请锁(参看图26),且申请成功。图26中,FTL表项2316对应的锁O(t14)指示该表项的锁属于原子读命令O。
在t14时刻之后,为原子读命令O的所有子命令所对应的FTL表项的锁均申请成功。以及在原子读命令O的多个子命令处理完成后(也参看图12,步骤125,图13,步骤1320),释放属于原子读命令O的所有子命令对应的FTL表项2310、FTL表项2312、FTL表项2314、FTL表项2316与的FTL表项2318锁(也参看图12,步骤126,图13,步骤1322)。
图22中的四条原子命令,按原子写命令N、原子写命令L、原子读命令M以及原子读命令O的顺序被处理完成。参看表7,第二行示出了依据本发明实施例八,原子写命令N执行完成后的有效结果:在LBA(x+1)、LBA(x+2)与LBA(x+3)中分别是原子写命令N所写入的数据X+1(t2)、X+2(t4)和X+3(t5)。表7的第三行示出了原子写命令L执行完成后的有效结果:在LBA(x)、LBA(x+1)、LBA(x+2)与LBA(X+3)中分别是原子写命令L所写入的数据X(t1),X+1(t6)和X+2(t7),以及原子写命令N所写入的数据X+3(t5)。表7的第四行示出了原子读命令M执行完成后所读到的结果:从LBA(x)、LBA(x+1)与LBA(x+2)中读出的分别是原子写命令L所写入的数据X(t1),X+1(t6)和X+2(t7)。表7的第五行示出了原子读命令O执行完成后所读到的结果:从LBA(x-1)、LBA(x)、LBA(x+1)、LBA(x+2)与LBA(x+3)中读出的分别是原子写命令执行前逻辑地址LBA(x-1)被写入的数据X-1(t3)(可以理解地,这里用X-1(t3)指示子命令X-1(t3)所读到的数据),原子写命令L所写入的数据X(t1),X+1(t6)和X+2(t7),以及原子写命令N所写入的数据X+3(t5)。
表7
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。
Claims (9)
1.一种原子读命令执行方法,其中所述原子读命令包括多个子命令,其特征在于,包括:
将多个子命令按照各子命令要访问的逻辑地址排序;
获取所述多个子命令中未被处理的多个子命令中排序最前的第一子命令,根据第一子命令要访问的第一逻辑地址,对与该第一逻辑地址对应的FTL表项加锁;
若对与该第一逻辑地址对应的FTL表项加锁成功,则按照子命令的排序获取下一子命令,根据该下一子命令要访问的第二逻辑地址,对与该第二逻辑地址对应的FTL表项加锁,直到对同属于该原子读命令的所有子命令的每个子命令要访问的逻辑地址相对应的FTL表项加锁均成功。
2.根据权利要求1所述的方法,其特征在于,直到对与该第一逻辑地址对应的FTL表项加锁成功,才按照子命令的排序获取下一子命令。
3.根据权利要求1或2所述的方法,其特征在于,还包括:
从主机接收第二原子读命令;
将第二原子读命令拆分成第二多个子命令;
将第二多个子命令按照各子命令要访问的逻辑地址进行排序;以及
获取所述第二多个子命令中未被处理的多个子命令中排序最前的第三子命令,根据第三子命令要访问的第三逻辑地址,对与该第三逻辑地址对应的FTL表项加锁;
若对与该第三逻辑地址对应的FTL表项加锁成功,则按照子命令的排序获取下一子命令,根据该下一子命令要访问的第四逻辑地址,对与该第四逻辑地址对应的FTL表项加锁,直到对同属于第二原子读命令的所有子命令的每个子命令要访问的逻辑地址相对应的FTL表项加锁均成功。
4.一种原子命令执行方法,其特征在于,包括:
从主机接收第一子命令,获取第一子命令要访问的第一逻辑地址,以及获取第一子命令在其所属的原子命令中的未被处理的多个子命令中的排序;
若第一子命令在其所属的原子命令中的未被处理的多个子命令中排序最前,则根据第一子命令要访问的第一逻辑地址,对与该第一逻辑地址对应的FTL表项加锁。
5.根据权利要求4所述的方法,其特征在于,还包括:
对于第一子命令所属的原子命令中的所有子命令,直到对所有子命令中的每个子命令要访问的逻辑地址相对应的FTL表项加锁均成功,才释放同所有子命令对应的FTL表项的锁。
6.一种原子命令执行方法,其中所述原子命令包括多个子命令,其特征在于:包括:
确定原子命令的类型,若原子命令的类型为原子读命令,且该原子读命令需要满足一般原子性,将多个子命令按照各子命令要访问的逻辑地址排序;
获取所述多个子命令中未被处理的多个子命令中排序最前的第一子命令,根据第一子命令要访问的第一逻辑地址,对与该第一逻辑地址对应的FTL表项加锁;
若对与该第一逻辑地址对应的FTL表项加锁成功,则按照子命令的排序获取下一子命令,根据该下一子命令要访问的第二逻辑地址,对与该第二逻辑地址对应的FTL表项加锁,直到对同属于该原子读命令的所有子命令的每个子命令要访问的逻辑地址相对应的FTL表项加锁均成功。
7.根据权利要求6所述的方法,其特征在于,还包括:
若原子命令的类型为原子写命令,且该原子写命令需要满足一般原子性或掉电原子性,则将多个子命令按照各子命令要访问的逻辑地址排序;
获取所述多个子命令中未被处理的多个子命令中排序最前的第一子命令,根据第一子命令要访问的第一逻辑地址,对与该第一逻辑地址对应的FTL表项加锁;
若对与该第一逻辑地址对应的FTL表项加锁成功,则按照子命令的排序获取下一子命令,根据该下一子命令要访问的第二逻辑地址,对与该第二逻辑地址对应的FTL表项加锁,直到对同属于该原子写命令的所有子命令的每个子命令要访问的逻辑地址相对应的FTL表项加锁均成功。
8.一种原子读命令执行装置,其中所述原子读命令包括多个子命令,其特征在于,包括:
子命令排序模块,用于将多个子命令按照各子命令要访问的逻辑地址进行排序;
子命令获取模块,用于获取所述多个子命令中未被处理的多个子命令中排序最前的第一子命令;
加锁模块,还用于根据第一子命令要访问的第一逻辑地址,对与该第一逻辑地址对应的FTL表项加锁;
若对与该第一逻辑地址对应的FTL表项加锁成功,则子命令获取模块,还用于按照子命令的排序获取下一子命令;加锁模块,还用于根据该下一子命令要访问的第二逻辑地址,对与该第二逻辑地址对应的FTL表项加锁,直到对于属于该原子读命令的所有子命令,对同每个子命令要访问的逻辑地址相对应的FTL表项加锁均处理完成。
9.一种固态硬盘存储设备,包括控制部件与在控制部件外部的存储器,控制部件包括闪存接口与至少一个CPU,CPU通过闪存接口访问固态存储设备中的NVM芯片,在控制部件外部的存储器中存储FTL表,FTL表包括多个表项,其特征在于,CPU用于执行根据权利要求1-3之一的原子读命令执行方法、根据权利要求4或5的原子命令执行方法,或者根据权利要求6或7的原子命令执行方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710165414.3A CN108628761B (zh) | 2017-03-16 | 2017-03-16 | 原子命令执行方法与装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710165414.3A CN108628761B (zh) | 2017-03-16 | 2017-03-16 | 原子命令执行方法与装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108628761A CN108628761A (zh) | 2018-10-09 |
CN108628761B true CN108628761B (zh) | 2022-04-22 |
Family
ID=63687139
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710165414.3A Active CN108628761B (zh) | 2017-03-16 | 2017-03-16 | 原子命令执行方法与装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108628761B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR20200088635A (ko) * | 2019-01-15 | 2020-07-23 | 에스케이하이닉스 주식회사 | 메모리 시스템 및 메모리 시스템의 동작방법 |
CN110377230B (zh) * | 2019-06-29 | 2022-07-22 | 苏州浪潮智能科技有限公司 | 一种应用于固态硬盘的原子写入方法及装置 |
US10860388B1 (en) | 2019-07-09 | 2020-12-08 | Micron Technology, Inc. | Lock management for memory subsystems |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101095115A (zh) * | 2004-11-05 | 2007-12-26 | 数据机器人技术公司 | 存储***条件指示器和方法 |
CN105607867A (zh) * | 2014-11-14 | 2016-05-25 | 爱思开海力士有限公司 | 使用主装置和从装置的重复删除 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7171537B1 (en) * | 2004-06-11 | 2007-01-30 | Sun Microsystems, Inc. | Non-blocking growable arrays |
US20070150658A1 (en) * | 2005-12-28 | 2007-06-28 | Jaideep Moses | Pinning locks in shared cache |
US9842128B2 (en) * | 2013-08-01 | 2017-12-12 | Sandisk Technologies Llc | Systems and methods for atomic storage operations |
CN104636285B (zh) * | 2015-02-03 | 2016-03-23 | 北京麓柏科技有限公司 | 一种闪存存储***及其读写、删除方法 |
CN106020731B (zh) * | 2016-05-23 | 2019-07-02 | 中国科学技术大学 | 存储设备、存储设备阵列和网络适配器 |
-
2017
- 2017-03-16 CN CN201710165414.3A patent/CN108628761B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101095115A (zh) * | 2004-11-05 | 2007-12-26 | 数据机器人技术公司 | 存储***条件指示器和方法 |
CN105607867A (zh) * | 2014-11-14 | 2016-05-25 | 爱思开海力士有限公司 | 使用主装置和从装置的重复删除 |
Also Published As
Publication number | Publication date |
---|---|
CN108628761A (zh) | 2018-10-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10108366B2 (en) | Non-volatile memory apparatus and operating method thereof | |
CN106354615B (zh) | 固态硬盘日志生成方法及其装置 | |
CN108628760B (zh) | 原子写命令的方法与装置 | |
US11354192B2 (en) | Data storage devices and methods for firmware failure prevention | |
CN107797934B (zh) | 处理去分配命令的方法与存储设备 | |
US11210226B2 (en) | Data storage device and method for first processing core to determine that second processing core has completed loading portion of logical-to-physical mapping table thereof | |
US20160110107A1 (en) | Method for writing data into flash memory apparatus, flash memory apparatus, and storage system | |
CN108628761B (zh) | 原子命令执行方法与装置 | |
CN108228483B (zh) | 处理原子写命令的方法和设备 | |
CN112204515A (zh) | 逻辑到物理数据结构 | |
US10466938B2 (en) | Non-volatile memory system using a plurality of mapping units and operating method thereof | |
CN109213425B (zh) | 利用分布式缓存在固态存储设备中处理原子命令 | |
CN107562648B (zh) | 无锁ftl访问方法与装置 | |
CN110865945B (zh) | 存储设备的扩展地址空间 | |
CN110515861B (zh) | 处理刷写命令的存储设备及其方法 | |
TWI792534B (zh) | 以局部清理操作來進行垃圾回收的方法與相關控制器和儲存系統 | |
CN111625477B (zh) | 访问擦除块的读请求的处理方法与装置 | |
WO2018041258A1 (zh) | 去分配命令处理的方法与存储设备 | |
US11662949B2 (en) | Storage server, a method of operating the same storage server and a data center including the same storage server | |
CN107562654B (zh) | Io命令处理方法与装置 | |
US11366775B2 (en) | Data storage device with an exclusive channel for flag checking of read data, and non-volatile memory control method | |
US10719461B2 (en) | Solid state device with distributed bit buckets | |
TWI697778B (zh) | 資料儲存裝置與資料處理方法 | |
TWI503841B (zh) | 寫入方法、記憶體控制器與記憶體儲存裝置 | |
CN115933995B (zh) | 固态硬盘中数据写入方法、装置、电子设备及可读介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
CB02 | Change of applicant information |
Address after: 100192 room A302, building B-2, Dongsheng Science Park, Zhongguancun, 66 xixiaokou Road, Haidian District, Beijing Applicant after: Beijing yihengchuangyuan Technology Co.,Ltd. Address before: 100192 Room 302, 3 / F, building B-2, Dongsheng Science Park, 66 xixiaokou Road, Haidian District, Beijing Applicant before: BEIJING MEMBLAZE TECHNOLOGY Co.,Ltd. |
|
CB02 | Change of applicant information | ||
GR01 | Patent grant | ||
GR01 | Patent grant |