无锁FTL访问方法与装置
技术领域
本发明涉及固态存储设备,更具体地,涉及固态存储设备处理IO请求时对FTL(Flash Translation Layer,闪存映射层)的锁的处理。
背景技术
参看图1,展示了存储设备的框图。存储设备102同主机相耦合,用于为主机提供存储能力。主机同存储设备102之间可通过多种方式相耦合,耦合方式包括但不限于通过例如SATA、IDE、USB、PCIE、NVMe(NVM Express)、SAS、以太网、光纤通道、无线通信网络等连接主机与存储设备102。主机可以是能够通过上述方式同存储设备相通信的信息处理设备,例如,个人计算机、平板电脑、服务器、便携式计算机、网络交换机、路由器、蜂窝电话、个人数字助理等。存储设备102包括接口103、控制部件104、一个或多个NVM(非易失存储器,Non-Volatile Memory)芯片105以及可选地固件存储器110。接口103可适配于通过例如SATA、IDE、USB、PCIE、NVMe、SAS、以太网、光纤通道等方式与主机交换数据。控制部件104用于控制在接口103、NVM芯片105以及固件存储器110之间的数据传输,还用于存储管理、主机逻辑地址到闪存物理地址映射、擦除均衡、坏块管理等。可通过软件、硬件、固件或其组合的多种方式实现控制部件104。控制部件104可以是FPGA(Field-progra mmable gate array,现场可编程门阵列)、ASIC(Application Specific Integrated Circuit,应用专用集成电路)或者其组合的形式。控制部件104也可以包括处理器或者控制器。控制部件104在运行时从固件存储器110加载固件。固件存储器110可以是NOR闪存、ROM、EEPROM,也可以是NVM芯片105的部分。
在固态存储设备中,利用FTL(Flash Translation Layer,闪存转换层)来维护从逻辑地址到物理地址的映射信息。逻辑地址构成了操作***等上层软件所感知到的固态存储设备的存储空间。物理地址是用于访问固态存储设备的物理存储单元的地址。在现有技术中还可利用中间地址形态实施地址映射。例如将逻辑地址映射为中间地址,进而将中间地址进一步映射为物理地址。
存储了从逻辑地址到物理地址的映射信息的表结构被称为FTL表。FTL表是固态存储设备中的重要元数据。通常FTL表的数据项记录了固态存储设备中以数据页为单位的地址映射关系。
FTL表包括多个FTL表条目(或称表项)。在一个实施例中,每个FTL表条目中记录了一个逻辑页地址与一个物理页的对应关系。在另一个例子中,每个FTL表条目中记录了连续的多个逻辑页地址与连续的多个物理页的对应关系。在又一个实施例中,每个FTL表条目中记录了逻辑块地址与物理块地址的对应关系。在依然又一个实施例中,FTL表中记录逻辑块地址与物理块地址的映射关系,和/或逻辑页地址与物理页地址的映射关系。
图2是现有技术的控制部件访问FTL表的示意图。控制部件204包括多个CPU(CPU210、CPU212与CPU214)与闪存接口,控制部件的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表项的锁集中存储。
发明内容
在固态存储设备中,同时处理多个IO请求,几乎每个IO请求都需要访问FTL表。而锁机制使得对FTL表项的访问串行化,降低了固态存储的并行处理能力,增加了IO请求的处理延迟。
在本发明中,提供了根据本发明第一方面的第一处理IO请求的方法,包括:响应于收到写请求,访问写请求对应的第一FTL表项,若第一FTL表项未被加锁,则对第一FTL表项加锁;响应于收到读请求,访问读请求对应的第一FTL表项,即使第一FTL表项被加锁,也从第一表项的物理地址读取数据;为写请求分配第一物理地址,以第一物理地址更新第一FTL表项,对第一FTL表项解锁,向第一物理地址写入数据。
提供了根据本发明第一方面的第一处理IO请求的方法,提供了根据本发明第一方面的第二处理IO请求的方法,其中在处理写请求时,若第一FTL表项被加锁,中止对所述写请求的处理,直到第一FTL表项的锁被释放。
提供了根据本发明第一方面的第二处理IO请求的方法,提供了根据本发明第一方面的第三处理IO请求的方法,其中所述第一FTL表项的锁被释放后,获取所述第一FTL表项,并对第一FTL表项加锁。
提供了根据本发明第一方面的第一处理IO请求的方法,提供了根据本发明第一方面的第四处理IO请求的方法,其中在处理写请求时,若第一FTL表项被加锁,结束对所述写请求的处理。
根据本发明的第二方面,提供了根据本发明第二方面的第一处理IO请求的方法,包括:响应于收到写请求,访问写请求对应的第一FTL表项,若第一FTL表项未被加锁,则对第一FTL表项加锁;响应于收到读请求,访问读请求对应的第一FTL表项,若第一FTL表项被加锁,将所述写请求要写入的数据作为对所述读请求的响应;为写请求分配第一物理地址,以第一物理地址更新第一FTL表项,对第一FTL表项解锁,向第一物理地址写入数据。
根据本发明的第三方面,提供了根据本发明第三方面的第一处理IO请求的方法,包括:响应于收到写请求,访问写请求对应的第一FTL表项与第二FTL表项,对所述第一FTL表项与所述第二FTL表项加锁;响应于收到读请求,访问读请求对应的第一FTL表项,即使第一FTL表项被加锁,也从第一表项的物理地址读取数据;为写请求分配第一物理地址与第二物理地址,以第一物理地址更新第一FTL表项,对第一FTL表项解锁,以第二物理地址更新第二FTL表项,以及向第一物理地址与第二物理地址写入数据。
根据本发明第三方面的第一处理IO请求的方法,提供了根据本发明第三方面的第二处理IO请求的方法,其中在处理写请求时,若第一FTL表项被加锁,等待第一FTL表项的锁被释放。
据本发明第三方面的第二处理IO请求的方法,提供了根据本发明第三方面的第三处理IO请求的方法,其中在处理写请求时,在第一FTL表项的锁被释放后,获取第一FTL表项,并对第一FTL表项加锁。
根据本发明的第四方面,提供了根据本发明第四方面的第一处理IO请求的装置,包括:写请求处理模块,用于响应于收到写请求,访问写请求对应的第一FTL表项,若第一FTL表项未被加锁,则对第一FTL表项加锁;读请求处理模块,用于响应于收到读请求,访问读请求对应的第一FTL表项,即使第一FTL表项被加锁,也从第一表项的物理地址读取数据;写请求执行模块,用于为写请求分配第一物理地址,以第一物理地址更新第一FTL表项,对第一FTL表项解锁,向第一物理地址写入数据。
根据本发明的第五方面,提供了根据本发明第五方面的第一处理IO请求的装置,包括:写请求处理模块,用于响应于收到写请求,访问写请求对应的第一FTL表项,若第一FTL表项未被加锁,则对第一FTL表项加锁;读请求处理模块,用于响应于收到读请求,访问读请求对应的第一FTL表项,若第一FTL表项被加锁,将所述写请求要写入的数据作为对所述读请求的响应;写请求执行模块,用于为写请求分配第一物理地址,以第一物理地址更新第一FTL表项,对第一FTL表项解锁,向第一物理地址写入数据。
根据本发明的第六方面,提供了根据本发明第六方面的第一处理IO请求的装置,包括:写请求处理模块,用于响应于收到写请求,访问写请求对应的第一FTL表项与第二FTL表项,对所述第一FTL表项与所述第二FTL表项加锁;读请求处理模块,用于响应于收到读请求,访问读请求对应的第一FTL表项,即使第一FTL表项被加锁,也从第一表项的物理地址读取数据;写请求执行模块,用于为写请求分配第一物理地址与第二物理地址,以第一物理地址更新第一FTL表项,对第一FTL表项解锁,以第二物理地址更新第二FTL表项,以及向第一物理地址与第二物理地址写入数据。
根据本发明的第七方面,提供了根据本发明第七方面的第一处理IO请求的方法,包括:响应于收到写请求,访问写请求对应的第一FTL表项,若第一FTL表项未被加锁,则对第一FTL表项加锁;响应于收到读请求,访问读请求对应的第一FTL表项,若第一FTL表项被加锁或第一FTL表项未被加锁,则从第一表项的物理地址读取数据;为写请求分配第一物理地址,以第一物理地址更新第一FTL表项,对第一FTL表项解锁,向第一物理地址写入数据。
根据本发明的第八方面,提供了根据本发明第八方面的第一处理IO请求的方法,包括:响应于收到写请求,访问写请求对应的第一FTL表项,若第一FTL表项未被加锁,则对第一FTL表项加锁;响应于收到读请求,访问读请求对应的第一FTL表项,无论第一FTL表项是否被加锁,都从第一表项的物理地址读取数据;为写请求分配第一物理地址,以第一物理地址更新第一FTL表项,对第一FTL表项解锁,向第一物理地址写入数据。
根据本发明的第九方面,提供一种包含计算机程序代码的计算机程序,当被载入计算机***并在计算机***上执行时,所述计算机程序代码使所述计算机***执行根据本发明第一方面至第三方面、第七方面与第八方面提供的处理IO请求的方法。
根据本发明的第一方面,提供一种包括程序代码的程序,当被载入存储设备并在存储设备上执行时,所述计程序代码使所述存储设备执行根据本发明第一方面至第三方面、第七方面与第八方面提供的处理IO请求的方法。
附图说明
当连同附图阅读时,通过参考后面对示出性的实施例的详细描述,将最佳地理解本发明以及优选的使用模式和其进一步的目的和优点,其中附图包括:
图1是现有技术的存储设备的框图;
图2是现有技术的存储设备的控制部件访问FTL表的示意图;
图3A是根据本发明实施例的存储设备的控制部件访问FTL表的示意图;
图3B是根据本发明另一实施例的存储设备的控制部件访问FTL表的示意图;
图3C是根据本发明依然另一实施例的存储设备的控制部件访问FTL表的示意图;以及
图4A是根据本发明实施例的为处理写命令而访问FTL表的流程图;以及
图4B是根据本发明实施例的为处理读IO命令而访问FTL表的流程图。
具体实施方式
在NVMe(Non-Volatile Memory express,高速非易失存储)协议中,定义了不同的IO命令类型。对于一部分IO命令,对IO命令之间的顺序性不做要求。例如,如果提交了一个对逻辑地址x的读命令,以及还提交了一个对逻辑地址x的写命令,虽然写命令的执行结果,会影响读命令的执行结果,但如果在这两个IO命令中未要求他们之间的顺序性,NVMe协议允许固态存储设备以任意顺序执行这两个IO命令。
针对NVMe协议的此特性,在根据本发明的实施例中,对IO请求的处理方式做出改进,以提升固态存储设备的IO命令处理能力,降低IO命令的处理延迟。所属领域技术人员将意识到,虽然以NVMe协议为例描述根据本发明的实施例,在其他不要求IO命令之间的执行顺序中协议中,同样可实施根据本发明的实施例。
参看图3A,示出了根据本发明实施例的存储设备的控制部件访问FTL表的示意图。固态硬盘的控制部件304包括多个CPU(CPU 310、CPU 312与CPU 314),每个CPU能够访问外部于控制部件304的FTL表。FTL表存储在例如DRAM(Dynamic Random Access Memory,动态随机访问存储器)中。控制部件的CPU还通过闪存接口(未示出)访问NVM芯片。作为举例,CPU310处理来自主机的写命令,根据写命令指示的逻辑地址在t1时刻访问FTL表项324(由图3A的W-t1指示),来为写命令分配物理地址。为避免多个写命令同时写相同的逻辑地址,在访问FTL表项时还请求与表项对应的锁。在图3A的例子中,CPU 310访问与FTL表项324对应的锁334。在图3的例子中,锁334指示FTL表项324未被加锁,CPU 310修改锁334以指示对FTL表项324的加锁。在根据本发明的实施例中,处理写命令时,要获取写命令将修改的FTL表项的锁。在无法获取到锁时,对该写命令的处理暂时中止,并等待锁的释放。在图3A的例子中,在t1时刻后,CPU 310获得FTL表项324的锁。此时,其他CPU为处理写命令要访问FTL表项324时,由于发现锁334指示FTL表项324已被加锁,则中止对访问FTL表项324的写命令的处理。
依然参看图3A,CPU 314处理来自主机的读命令,根据该读命令的逻辑地址在t2时刻访问FTL表项324。虽然FTL表项324已被加锁,在根据本发明的实施例中,CPU 314忽略FTL表项324的锁,依然获取FTL表项324,并根据FTL表项324获取要访问的物理地址。进一步地,CPU 314或其他CPU通过该物理地址读取数据,并向主机提供读取的数据作为对读命令的响应。由于处理读命令时不检查FTL表项324上是否被加锁,使得访问FTL表项324的写命令与访问FTL表项324的一个或多个读命令能够同时执行,从而提升了IO命令的并行处理能力。以及由于在处理读命令时,无需等待FTL表项324的锁被释放,降低了读命令处理的时间。
在图3A的例子中,为处理写命令,CPU 310为写命令分配新的物理地址,并用新的物理地址更新FTL表项324,在t3时刻,CPU 310完成对FTL表项324的更新(图3中,用W-t3指示)。以及还向新的物理地址写入数据来响应写命令。可由CPU 310或其他CPU来向新的物理地址写入数据。因而,在t3时刻之前的t2时刻,CPU 314从FTL表项324中获得的是旧的物理地址,而在t3时刻之后,响应于读命令从FTL表项324中获得的是新的物理地址(被CPU 310在处理写命令时更新)。因而,在处理读命令时,若CPU 314在t3时刻之前访问FTL表项324,将得到在t3时刻之后访问FTL表项324不同的物理地址,进而读取到不同的数据。这样的结果符合诸如NVMe协议等对IO命令的处理顺序没有要求的协议。
在一个例子中,锁334与FTL表项324彼此分立地存储。为处理读命令,CPU 314访问FTL表项324而无需访问锁334。在另一个例子中,锁334与FTL表项324存储在相同的存储位置。在处理读命令时,CPU 314访问FTL表项324的同时将获得锁334的内容,但CPU 314无需处理锁334的内容,而仅关心FTL表项324所提供的物理地址。
继续参看图3A,锁的粒度是针对每个FTL表项。响应于IO命令,CPU 312访问FTL表项328。对于读命令,CPU 312忽略与FTL表项328所对应的锁338;对于写命令,CPU 312检查与FTL表项328所对应的锁338,在锁338指示FTL表项328未被加锁时,才继续对写命令的处理,在锁338指示FTL表项328被加锁时,暂停对写命令的处理,或推迟对FTL表项328的更新。
图3B是根据本发明另一实施例的存储设备的控制部件访问FTL表的示意图。来自主机的读命令或写命令访问不同长度的数据,并访问不同数量的FTL表项。在根据本发明的实施例中,加锁的粒度是每个FTL表项。作为举例,CPU 310处理来自主机的写命令,写命令访问3个逻辑地址,根据写命令指示的逻辑地址CPU 310在t1时刻访问FTL表项320、FTL表项322与FTL表项324(由图3B的W1-t1、W2-t1与W3-t1指示),来为写命令分配物理地址。CPU310在访问FTL表项时还请求与表项对应的锁,通过访问锁330、锁332与锁334来请求与FTL表项320、FTL表项322以及FTL表项324对应的锁。在获取到对应的锁时,CPU 310进行后续操作,分配新的物理地址并用新的物理地址更新对应的FTL表项,在无法获取到对应的锁时,CPU310中止对对应FTL表项的操作,等待对应的锁被释放。例如,CPU 310获得了FTL表项320与FTL表项322的锁,但未获得FTL表项324的锁,则CPU 310继续后续处理更新FTL表项320与FTL表项322,并中止对FTL表项324的操作,直到FTL表项324的锁334被释放并由CPU 310获得,CPU 310继续更新FTL表项324。响应于FTL表项被更新,还向新的物理地址处写入数据来响应写命令。当写命令对应的三个FTL表项的新物理地址均被写入数据后,写命令处理完成。
依然参看图3B,CPU 314处理来自主机的读命令,根据该读命令的逻辑地址在t2时刻访问FTL表项324(在图3B中,记为R-t2)。虽然FTL表项324已被CPU 310在处理写命令时加锁,在根据本发明的实施例中,CPU 314忽略FTL表项324的锁,依然获取FTL表项324,并根据FTL表项324获取要访问的物理地址。进一步地,CPU 314或其他CPU通过该物理地址读取数据,并向主机提供读取的数据作为对读命令的响应。由于处理读命令时不检查FTL表项324上是否被加锁,使得访问FTL表项324的写命令与访问FTL表项324的一个或多个读命令能够同时执行,从而提升了IO命令的并行处理能力。以及由于在处理读命令时,无需等待FTL表项324的锁被释放,降低了读命令处理的时间。
图3C是根据本发明依然另一实施例的存储设备的控制部件访问FTL表的示意图。在图3C是示出的实施例中,同一CPU上可并行处理多个IO命令。作为举例,CPU 310处理来自主机的写命令,根据写命令指示的逻辑地址CPU 310在t1时刻访问FTL表项324(由图3C的W1-t2指示),来为写命令分配物理地址。CPU310在访问FTL表项时还请求与表项对应的锁,通过访问锁334来请求与FTL表项324对应的锁。在获取到对应的锁时,CPU 310进行后续操作,分配新的物理地址并用新的物理地址在t3时刻更新对应的FTL表项324(由图3C的W3-t3指示对FTL表项324的更新)。在t1与t3时刻之间,CPU 310还响应主机的读命令,在t2时刻访问FTL表项324。虽然在t2时刻,锁334指示FTL表项324被加锁,但对于读命令,即使FTL表项324上存在锁,CPU310依然访问并使用FTL表项324,利用FTL表项324提供的物理地址读取数据。在进一步的实施例中,CPU 310缓存在t1时刻取得的FTL表项324,并在t2时刻从CPU 310的缓存中取得FTL表项324的内容。以及对于处理读命令,无论CPU 310缓存的FTL表项324是否被更新,都利用缓存的FTL表项324提供的物理地址读取数据。在t2时刻,CPU 314响应于另一读命令的逻辑地址而访问FTL表项324(图3C中,用R3-t2示出)。由于是读命令,虽然锁334指示FTL表项324被加锁,CPU 314依然访问并使用FTL表项324,并用FTL表项324提供的物理地址读取数据。
图4A是根据本发明实施例的为处理写命令而访问FTL表的流程图。在根据本发明的实施例中,响应于收到访问第一FTL表项的逻辑地址的写命令(410),检查第一FTL表项是否被加锁(420)。若第一FTL表项被加锁,中止对该第一FTL表项的后续处理,并等待第一FTL表项的锁被释放。对第一FTL表项的后续处理是该写命令的处理的一部分。若第一FTL表项未被加锁,或者第一FTL表项的锁被释放,为处理该写命令,对第一FTL表项加锁(430),以使得访问第一FTL表项的其他写命令暂时挂起。为处理该写命令,为该写命令分配第一物理地址,以第一物理地址更新第一FTL表项,将更新后的FTL表项写入FTL表,并对第一FTL表项解锁(440)。为写命令分配新的物理地址可利用所属领域中已知的多种方式。以及将该写命令对应的数据写入第一物理地址(450)。
在另一个例子中,在响应于收到第二写命令而访问写命令的逻辑地址对应的第一FTL表项时,发现第一FTL表项被加锁,则完成对第二写命令的处理,而不再为第二写命令分配物理地址,也不将第二写命令对应的数据写入非易失存储器。
图4B是根据本发明实施例的为处理写命令而访问FTL表的流程图。响应于收到读命令,读命令的逻辑地址对应第一FTL表项(432)。对于读命令,不检查第一FTL表项是否被加锁。即使由于处理写命令,第一FTL表项已被加锁(参见图4A的步骤430),在处理读命令时,也从FTL表中获取并使用被加锁的第一FTL表项(434)。以及根据第一物理地址读出数据(436)作为对读命令的响应。
在另一个例子中,为处理读命令而获取第一FTL表项时,若第一FTL表项被加锁,则表明有在执行中的写命令在访问第一FTL表,而写命令要写入的数据在缓存中。从缓存中查找访问第一FTL表的写命令要写入的数据,作为读命令的读出数据。从缓存中获取数据的速度远快于从非易失存储芯片中获取数据的速度,从而利用缓存的待写入数据作为对读命令的响应,进一步降低了读命令的处理时间。
本发明实施例还提供一种包含程序代码的程序,当被载入CPU并在CPU中执行时,程序使CPU执行上面提供的根据本发明实施例的方法之一。
本发明实施例还提供一种包括程序代码的程序,当被载入存储设备并在存储设备上执行时,所述程序使存储设备的处理器执行上面提供的根据本发明实施例的方法之一。
应该理解,框图和流程图的每个框以及框图和流程图的框的组合可以分别由包括计算机程序指令的各种装置来实施。这些计算机程序指令可以加载到通用计算机、专用计算机或其他可编程数据控制设备上以产生机器,从而在计算机或其他可编程数据控制设备上执行的指令创建了用于实现一个或多个流程图框中指定的功能的装置。
这些计算机程序指令还可以存储在可以引导计算机或其他可编程数据控制设备的计算机可读存储器中从而以特定方式起作用,从而能够利用存储在计算机可读存储器中的指令来制造包括用于实现一个或多个流程图框中所指定功能的计算机可读指令的制品。计算机程序指令还可以加载到计算机或其他可编程数据控制设备上以使得在计算机或其他可编程数据控制设备上执行一系列的操作操作,从而产生计算机实现的过程,进而在计算机或其他可编程数据控制设备上执行的指令提供了用于实现一个或多个流程图框中所指定功能的操作。
因而,框图和流程图的框支持用于执行指定功能的装置的组合、用于执行指定功能的操作的组合和用于执行指定功能的程序指令装置的组合。还应该理解,框图和流程图的每个框以及框图和流程图的框的组合可以由执行指定功能或操作的、基于硬件的专用计算机***实现,或由专用硬件和计算机指令的组合实现。
虽然当前发明参考的示例被描述,其只是为了解释的目的而不是对本发明的限制,对实施方式的改变,增加和/或删除可以被做出而不脱离本发明的范围。
这些实施方式所涉及的、从上面描述和相关联的附图中呈现的教导获益的领域中的技术人员将认识到这里记载的本发明的很多修改和其他实施方式。因此,应该理解,本发明不限于公开的具体实施方式,旨在将修改和其他实施方式包括在所附权利要求书的范围内。尽管在这里采用了特定的术语,但是仅在一般意义和描述意义上使用它们并且不是为了限制的目的而使用。