本申请涉及计算机技术领域,特别涉及一种固态硬盘的数据处理方法以及该固态硬盘。
背景技术
随着数据时代的到来,大数据、云服务等对固态硬盘的容量和性能提出更高要求,因此有关读写请求的固件算法遇到了前所未有的挑战。
目前,企业级的固态硬盘采用的都是数据量为4kb的数据逻辑块,当固态硬盘的前端模块接收到读请求时,该前端模块需要将读请求中的数据量划分为多个4kb,每次将其中一个4kb对应的lba发送至固态硬盘的后端模块,后端模块根据接收到的lba,从放置在双倍速率同步动态随机存储器(doubledataratesynchronousdynamicrandomaccessmemory,ddrsdram)的映射表中读取与该lba对应的物理页地址(physicalpageaddress,ppa),然后后端模块将该ppa发送到闪存nand(nandflashmemory),nand根据该ppa读取数据,并将读取的数据发送至后端模块,最后后端模块将该读取的数据发送至前端模块,前端模块再将该读取的数据发送至主机。而当固态硬盘的前端模块接收到写请求时,该前端模块需要将写请求中的数据量划分为多个4kb,每次将其中一个4kb对应的lba发送至固态硬盘的后端模块,后端模块根据接收到的lba,为该lba分配ppa,然后后端模块根据该ppa在ddrsdram中写入数据,并将该ppa保存至ddrsdram中。
然而,当主机向前端模块发送的读请求中包含的是大块数据量(例如128kb),由于前端模块中只设置有通过4kb的数据逻辑块的固件(即软件程序)用于处理读写请求,因此,导致固态硬盘处理包含有大块数据量的读写请求时速度非常慢,增大了固态硬盘中控制处理器的运行负担,这样在控制处理器比较弱的情况下,如果需要读写大块数据量,则无法提高固态硬盘的读写性能,并且限制了固态硬盘读写的带宽。
技术实现要素:
本申请实施例提供了固态硬盘的数据处理方法以及固态硬盘,能够在固态硬盘读写大块数据量时,根据预设的数据逻辑块的最大数据量同时读写请求消息中的数据量,提升了固态硬盘的读写性能。
本申请实施例提供了一种固态硬盘的数据处理方法,包括:
固态硬盘的前端模块在所述前端模块预设数据逻辑块的最大数据量;
所述前端模块接收主机发送的读请求,所述读请求包含有第一逻辑区块地址lba,所述第一lba的个数为大于等于1的整数;
所述前端模块判断所述读请求的数据量是否小于等于所述最大数据量;
若是,则所述前端模块将所述读请求发送至所述固态硬盘的后端模块;
所述后端模块根据接收到的所述第一lba,同时读取与所有所述第一lba对应的双倍速率同步动态随机存储器ddrsdram中的第一物理页地址ppa,所述第一ppa的个数为大于等于1的整数;
所述后端模块根据所述第一ppa读取闪存nand中的第一数据;
所述后端模块将所述第一数据发送至所述前端模块;
所述前端模块将所述第一数据发送至主机。
可选地,所述前端模块判断所述读请求的数据量是否小于等于所述最大数据量包括:
所述前端模块判断所述第一lba的个数是否小于等于lba个数阈值,所述lba个数阈值为所述最大数据量与单位数据逻辑块的数据量的商,所述单位数据逻辑块的数据量为4k,所述lba个数阈值为大于1的整数。
可选地,在所述前端模块判断所述第一lba的个数是否小于等于lba个数阈值之后,所述方法还包括:
若否,则所述前端模块计算所述第一lba的个数与所述lba个数阈值之间的第一倍数n,所述n为所述第一lba的个数除以所述lba个数阈值的值;
所述前端模块判断所述n之外是否有余数;
若否,则所述前端模块将所述读请求拆分为n个子读请求,每个所述子读请求包含有1份第一子lba,每份所述第一子lba的个数与所述lba个数阈值相等;
所述前端模块将所述n个子读请求分为n次发送至所述后端模块。
可选地,在所述前端模块判断所述n之外是否有余数之后,所述方法还包括:
若是,则所述前端模块将所述读请求拆分为n+1个子读请求,从第1个到第n个的每个所述子读请求中包含有1份第一子lba,第n+1个所述子读请求中包含有1份第二子lba,所述第二子lba的个数为所述余数的1/4倍。
所述前端模块将所述n+1个子读请求分为n次发送至所述后端模块。
可选地,所述方法还包括:
所述前端模块接收主机发送的写请求,所述写请求包含有第二lba,所述第二lba的个数为大于等于1的整数;
所述前端模块判断所述写请求的数据量是否小于等于所述最大数据量;
若是,则所述前端模块将所述写请求发送至所述固态硬盘的后端模块;
所述后端模块根据接收到的所有所述第二lba,为所述写请求分配第二ppa,所述第二ppa的个数为大于等于1的整数;
所述后端模块根据所述第二ppa在所述ddrsdram中写入第二数据,并将所述第二ppa同时保存至所述ddrsdram中,所述第二数据为所述写请求中包含的数据。
可选地,所述前端模块判断所述写请求的数据量是否小于等于所述最大数据量包括:
所述前端模块判断所述第二lba的个数是否小于等于所述lba个数阈值。
可选地,在所述前端模块判断所述第二lba的个数是否小于等于所述lba个数阈值之后,所述方法还包括:
若否,则所述前端模块计算所述第二lba的个数与所述lba个数阈值之间的第二倍数m,所述m为所述第二lba的个数除以所述lba个数阈值的值;
所述前端模块判断所述m之外是否有余数;
若否,则所述前端模块将所述写请求拆分为m个子写请求,每个所述子写请求包含有1份第三子lba,每份所述第三子lba的个数与所述lba个数阈值相等;
所述前端模块将所述m个子写请求分为m次发送至所述后端模块。
可选地,在所述前端模块判断所述m之外是否有余数之后,所述方法还包括:
若是,则所述前端模块将所述写请求拆分为m+1个子写请求,从第1个到第m个的每个所述子写请求中包含有1份第三子lba,第m+1个所述子写请求中包含有1份第四子lba,所述第四子lba的个数为所述余数的1/4倍。
所述前端模块将所述n+1个子读请求分为n+1次发送至所述后端模块。
本申请实施例提供了一种固态硬盘,其特征在于,包括:
预设单元,用于在所述固态硬盘的前端模块预设数据逻辑块的最大数据量;
第一接收单元,用于接收主机发送的读请求,所述读请求包含有第一逻辑区块地址lba,所述第一lba的个数为大于等于1的整数;
第一判断单元,用于判断所述读请求的数据量是否小于等于所述最大数据量;
第一发送单元,用于当确定所述读请求的数据量小于等于所述最大数据量时,将所述读请求发送至所述固态硬盘的后端模块;
读取单元,用于根据接收到的所述第一lba,同时读取与所有所述第一lba对应的双倍速率同步动态随机存储器ddrsdram中的第一物理页地址ppa,所述第一ppa的个数为大于等于1的整数;
第二发送单元,用于将所述第一ppa发送至闪存nand;
第三发送单元,用于将所述nand根据所述第一ppa读取的第一数据发送至所述前端模块;
第四发送单元,用于将所述第一数据发送至主机。
可选地,所述第一判断单元具体用于判断所述第一lba的个数是否小于等于lba个数阈值,所述lba个数阈值为所述最大数据量与单位数据逻辑块的数据量的商,所述单位数据逻辑块的数据量为4k,所述lba个数阈值为大于1的整数。
可选地,所述固态硬盘还包括:
第一计算单元,用于当确定所述第一lba的个数大于所述lba个数阈值时,计算所述第一lba的个数与所述lba个数阈值之间的第一倍数n,所述n为所述第一lba的个数除以所述lba个数阈值的值;
第二判断单元,用于判断所述n之外是否有余数;
第一拆分单元,用于当确定所述n之外没有余数时,将所述读请求拆分为n个子读请求,每个所述子读请求包含有1份第一子lba,所述第一子lba的个数为所述第一lba的个数的1/n倍;
第五发送单元,用于将所述n个子读请求分为n次发送至所述后端模块。
可选地,所述固态硬盘还包括:
第二拆分单元,用于当确定所述n之外有余数时,将所述读请求拆分为n+1个子读请求,从第1个到第n个的每个所述子读请求中包含有1份第一子lba,第n+1个所述子读请求中包含有1份第二子lba,所述第二子lba的个数为所述余数的1/4倍。
可选地,所述固态硬盘还包括:
第一接收单元,用于接收主机发送的写请求,所述写请求包含有第二lba,所述第二lba的个数为大于等于1的整数;
第三判断单元,用于判断所述写请求的数据量是否小于等于所述最大数据量;
第六发送单元,用于当确定所述写请求的数据量小于等于所述最大数据量时,将所述写请求发送至所述固态硬盘的后端模块;
分配单元,用于根据接收到的所有所述第二lba,为所述写请求分配第二ppa,所述第二ppa的个数为大于等于1的整数;
写单元,用于根据所述第二ppa在所述ddrsdram中写入第二数据;
保存单元,用于将所述第二ppa同时保存至所述ddrsdram中,所述第二数据为所述写请求中包含的数据。
可选地,所述第三判断单元具体用于判断所述第二lba的个数是否小于等于所述lba个数阈值。
可选地,所述固态硬盘还包括:
第二计算单元,用于计算所述第二lba的个数与所述lba个数阈值之间的第二倍数m,所述m为所述第二lba的个数除以所述lba个数阈值的值;
第四判断单元,用于判断所述m之外是否有余数;
第三拆分单元,用于当确定所述m之外没有余数,则将所述写请求拆分为m个子写请求,每个所述子写请求包含有1份第三子lba,所述第三子lba的个数为所述第二lba的个数的1/m倍;
第七发送单元,用于将所述m个子写请求分为m次发送至所述后端模块。
可选地,所述固态硬盘还包括:
第四拆分单元,用于当确定所述m之外没有余数时,将所述写请求拆分为m+1个子写请求,从第1个到第m个的每个所述子写请求中包含有1份第三子lba,第m+1个所述子写请求中包含有1份第四子lba,所述第四子lba的个数为所述余数的1/4倍。
本申请实施例提供了一种固态硬盘,该固态硬盘具有实现上述固态硬盘的数据处理方法中固态硬盘行为的功能。该功能可以通过硬件实现,也可以通过执行相应的软件实现。该硬件或软件包括一个或多个与上述功能相对应的模块。
本申请实施例提供了一种计算机存储介质,该计算机存储介质用于储存上述固态硬盘所用的计算机软件指令,其包括用于执行为固态硬盘所设计的程序。
本申请实施例提供了一种计算机程序产品,该计算机程序产品包括计算机软件指令,该计算机软件指令可通过处理器进行加载来实现上述数据处理方法的流程。
从以上技术方案可以看出,本申请实施例具有以下优点:由于固态硬盘的前端模块在接收到主机发送的读请求,并在确定读请求的数据量小于等于在前端模块预设的数据逻辑块的最大数据量之后,将读请求一次性发送至固态硬盘的后端模块,后端模块根据接收到的与读请求的数据量对应的第一lba,可以一次性同时读取所有第一lba对应的ddrsdram中的第一ppa,并通过第一ppa读取nand中的与读请求对应的第一数据,然后将该第一数据发送至前端模块,最后,前端模块将该第一数据发送至主机,因此,前端模块可以在读请求的数据量小于最大数据量时将读请求的所有第一lba同时发送至后端模块,后端模块可以根据所有第一lba一次性同时读取ddrsdram中映射表,因此大幅度减少了访问ddrsdram的次数,节约了访问ddrsdram的时间,提升了固态硬盘处理数据的性能,同时提升了处理数据的带宽。
附图说明
图1为本申请实施例中固态硬盘的数据处理方法的一个实施例示意图;
图2为本申请实施例中固态硬盘的数据处理方法的另一个实施例示意图;
图3为本申请实施例中固态硬盘的数据处理方法的另一个实施例示意图;
图4为本申请实施例中固态硬盘的数据处理方法的另一个实施例示意图;
图5为本申请实施例中固态硬盘的一个实施例示意图;
图6为本申请实施例中固态硬盘的另一个实施例示意图。
具体实施方式
本申请实施例提供了固态硬盘的数据处理方法以及固态硬盘,用于在固态硬盘读写大块数据量时,根据预设的数据逻辑块的最大数据量同时读写请求消息中的数据量,提升了固态硬盘的读写性能。
请参阅图1,图1为本申请实施例中固态硬盘的数据处理方法的一个实施例示意图。
本申请实施例中固态硬盘的数据处理方法的一个实施例包括:
101、固态硬盘的前端模块在该前端模块预设数据逻辑块的最大数据量;
本实施例中,固态硬盘的前端模块可以在其自身中采用静态调整的方式预设数据逻辑块的最大数据量,该静态调整的方式指的是人为设定数据逻辑块的最大数据量。
需要说明的是,前端模块预设数据逻辑块的最大数据量的方式具体不做限定。
此外,最大数据量可以为128k个字节,也可以为64个字节,具体此处不做限定。
102、前端模块接收主机发送的读请求;
本实施例中,前端模块接收的读请求中,包含有该读请求的数据量所对应的多个第一lba,每个第一lba代表一个4k字节的读请求中的数据量,第一lba的个数为大于等于1的整数。
103、前端模块判断读请求的数据量是否小于等于最大数据量;
本实施例中,前端模块在接收到主机发送的读请求之后,可以判断读请求的数据量是否小于等于最大数据量,若是,则执行步骤104。
进一步地,由于1个lba对应读请求中4k的数据量,因此可以预先知道读请求中的数据量总共对应的lba个数,本实施例中将该lba个数称为第一lba的个数,同理,也可以预先知道前端模块预设的数据逻辑块的最大数据量所对应的lba个数,本实施例中将该lba个数称为lba个数阈值,也就是说,前端模块判断读请求的数据量是否小于等于最大数据量,可以通过判断读请求中所包含的第一lba的个数是否小于等于最大数据量所对应的lba个数阈值来实现。
如果前端模块确定第一lba的个数小于等于lba个数阈值,则执行步骤104。
104、前端模块将读请求发送至固态硬盘的后端模块;
本实施例中,当前端模块确定第一lba的个数小于等于lba个数阈值时,前端模块就可以将该读请求一次性同时发送至固态硬盘的后端模块,而无需将该读请求拆分成多个4k数据量的读请求进行发送。
105、后端模块根据接收到的第一lba,同时读取与所有第一lba对应的ddrsdram中的ppa;
本实施例中,后端模块在接收到第一lba后,可以根据接收到的所有第一lba,一次性同时从ddrsdram读取与所有第一lba对应的ppa,而无需根据每一个lba按先后顺序从ddrsdram每一次只读取一个ppa。ppa放置在lba与ppa相互对应的映射表中。与第一lba对应的ppa统称为第一ppa,该第一ppa的个数为大于等于1的整数。
106、后端模块根据第一ppa读取nand中的第一数据;
本实施例中,后端模块将读取到的第一ppa发送到nand中,并根据该第一ppa读取nand中相应位置的数据,该数据为读请求所需读取的数据,本实施例中将该数据称为第一数据。
需要说明的是,由于第一ppa中的各个ppa不一定是连续的,因此在将第一ppa发送到nand中时,可以断续发送ppa到nand中。由于nand每次最多只能够接收16k字节,即4个ppa请求,因此如果有4个以下的ppa是连续的,则后端模块可以将该4个以下的ppa同时发送到nand,但是如果有超过4个的ppa是连续的,则后端模块需要将该超过4个的ppa拆分成两次或多次发送到nand。例如,有共12字节即3个ppa是连续的,则后端模块可以将该3个ppa同时发送到nand,并根据该3个ppa一次性同时读取nand中相应位置的数据。再比如,有共20个字节即5个ppa是连续的,则后端模块需要将该5个ppa分成两次发送,第一次发送前4个ppa到nand,一次性同时读取nand中的数据,第二次发送第5个ppa到nand,读取该第5个ppa对应的nand中的数据。
107、后端模块将第一数据发送至前端模块;
后端模块在读取到与第一ppa对应的第一数据后,可以将该第一数据发送至前端模块。
108、前端模块将第一数据发送至主机。
前端模块在接收到后端模块发送的第一数据后,最后可以将该第一数据发送至主机,该第一数据即为读请求需要读取的数据。
在本申请实施例中,由于固态硬盘的前端模块在接收到主机发送的读请求,并在确定读请求的数据量小于等于在前端模块预设的数据逻辑块的最大数据量之后,将读请求一次性发送至固态硬盘的后端模块,后端模块根据接收到的与读请求的数据量对应的第一lba,可以一次性同时读取所有第一lba对应的ddrsdram中的第一ppa,并通过第一ppa读取nand中的与读请求对应的第一数据,然后将该第一数据发送至前端模块,最后,前端模块将该第一数据发送至主机,因此,前端模块可以在读请求的数据量小于最大数据量时将读请求的所有第一lba同时发送至后端模块,后端模块可以根据所有第一lba一次性同时读取ddrsdram中映射表,因此大幅度减少了访问ddrsdram的次数,节约了访问ddrsdram的时间,提升了固态硬盘处理读数据的性能,同时提升了处理读数据的带宽。
以上对本申请实施例中固态硬盘的数据处理方法的一个实施例进行了详细描述,以下对本申请实施例中固态硬盘的数据处理方法的另一个实施例进行描述。参见图2,图2为本申请实施例中固态硬盘的数据处理方法的另一个实施例示意图。
本申请实施例中固态硬盘的数据处理方法的另一个实施例包括:
201、固态硬盘的前端模块在该前端模块预设数据逻辑块的最大数据量;
202、前端模块接收主机发送的读请求;
203、前端模块判断读请求中第一lba的个数是否小于等于lba个数阈值;
本实施例中,如果前端模块确定第一lba的个数小于等于lba个数阈值,则执行步骤204;如果前端模块确定第一lba的个数大于lba个数阈值,则执行步骤205。
204、前端模块将读请求发送至固态硬盘的后端模块;
本实施例中的步骤201、202和204与前述图1所述实施例的步骤101、102和104类似,此处不再赘述。
前端模块执行完步骤204之后,执行步骤211。
205、前端模块计算第一lba的个数与lba个数阈值之间的第一倍数n;
本实施例中,当前端模块确定第一lba的个数大于lba个数阈值时,可以计算第一lba的个数与lba个数阈值之间的倍数,本实施例中将该倍数称为第一倍数n,也就是说,前端模块用第一lba的个数除以lba个数阈值,得到n。
例如,读请求的数据量为256kb个字节,而预设的数据逻辑块的最大数据量为128kb个字节,则n为2。
206、前端模块判断n之外是否有余数;
本实施例中,前端模块在计算得到n时,还需要判断除了n之外是否还有余数。若否,则执行步骤207;若有,则执行步骤209。
207、前端模块将读请求拆分为n个子读请求;
本实施例中,如果前端模块确定除了n之外没有余数,则前端模块将读请求拆分为n个子读请求。例如上述步骤204计算得到n为2,则前端模块将读请求拆分为两个子读请求。每个子读请求包含有1份与该子读请求的数据量对应的lba,本实施例中将该lba称为第一子lba。每一份该第一子lba的个数为lba阈值个数的1/n倍。
同样举例说明,例如,由于预设的数据逻辑块的最大数据量为128kb,而每个单位数据块的数据量为4kb,则lba个数阈值有128kb/4kb个,即32个,另一方面,由于读请求的数据量为256kb,则读请求的数据量为预设的数据逻辑块的最大数据量128kb的两倍,因此将该读请求的数据量拆分为两份第一子读请求,每份子读请求为128kb,且每份子读请求对应有32个lab。也就是说,每份第一子lba的个数(32个)与lba个数阈值(32个)相等。也就是说,每份第一子lba的个数(32个)是第一lba的个数(共64个)的1/2倍。
208、前端模块将n个子读请求分为n次发送至后端模块;
本实施例中,当前端模块确定求得的n之外没有余数的情况下,可以将n个子读请求拆分为n次发送到后端模块。
例如,前述举例中n求得为2,则将256kb的读请求的数据量拆分为两个读请求,每份读请求中包含有128kb对应的32个lba,然后将两个读请求分为两次发送到后端模块。
本实施例在执行完步骤208之后,接着执行步骤211。
209、前端模块将读请求拆分为n+1个子读请求;
本实施例中,前端模块在确定计算求得的n之外有余数的情况下,可以将读请求拆分为n+1个子读请求,从第1个到第n个的每个子读请求中包含有1份第一子lba,第n+1个子读请求中包含有1份第二子lba,该第二子lba的个数为余数的1/4倍。
以下举例进行说明,例如,读请求的数据量为272kb,而逻辑数据块的最大数据量为128kb,则读请求的数据量除以最大数据量所得的整数n为2,并有余数16kb。即,前端模块将读请求拆分为3个子读请求,第1个和第2个的每个子读请求中各包含有1份第一子lba,每份第一子lba有32个,而第3个子读请求中包含有一份第二子lba,该第二子lba的个数为4个,即余数16的1/4倍。
210、前端模块将n+1个子读请求分为n+1次发送至后端模块;
本实施例中,当前端模块确定求得的n之外还有余数的情况下,可以将n+1个子读请求拆分为n+1次发送到后端模块。
例如,前述举例中n求得为2,余数为16,则将272kb的读请求的数据量拆分为3个读请求,第一份和第二份读请求中包含有128kb对应的32个lba,第三份读请求中包含有16kb对应的4个lba,然后将3个读请求分为3次发送到后端模块。
本实施例在执行完步骤210之后,接着执行步骤211。
211、后端模块根据接收到的第一lba,同时读取与第一lba对应的ddrsdram中的第一ppa;
本实施例中,如果前端模块确定求得的n之外没有余数的情况下,则后端模块会接收到n次第一子lba,然后可以分n次同时一次性读取与第一子lba对应的ddrsddram的映射表中的第一子ppa;如果后端模块确定读请求的数据量大于最大数据量,则后端模块会接收到n次第一子lba以及1次第二子lba,然后可以分为n次同时一次性读取与第一子lba对应的ddrsdram的映射表中的第一子ppa,另外还有1次是同时一次性读取与第二子lba对应的第二子ppa。
需要说明的是,本实施例中,第一lba可以只包含有第一子lba,也可以包含第一子lba和第二子lba;第一ppa可以只包含有第一子ppa,也可以包含第一子ppa,也可以包含第一子ppa和第二子ppa,具体此处不做限定。
212、后端模块根据第一ppa读取nand中的第一数据;
本实施例中,如果前端模块确定求得的n之外没有余数的情况下,则后端模块可以分为n次根据第一子ppa读取nand中的第一数据;如果后端模块确定读请求的数据量大于最大数据量,则后端模块可以分为n次根据第一子ppa读取nand中的第一数据,另外还有1次是根据第二子ppa读取nand中的第一数据。
213、后端模块将第一数据发送至前端模块;
本实施例中,如果后端模块确定读请求的数据量小于等于最大数据量,则后端模块可以分为n次将根据第一子ppa读取到的第一数据发送至前端模块;如果后端模块确定读请求的数据量大于最大数据量,则后端模块可以分为n次将根据第一子ppa读取到的第一数据发送至前端模块,另外还有1次是根据第二子ppa读取nand中的第一数据。
214、前端模块将第一数据发送至主机。
本实施例中,如果后端模块确定读请求的数据量小于等于最大数据量,则前端模块可以分为n次将根据第一子ppa读取到的第一数据发送至主机;如果后端模块确定读请求的数据量大于最大数据量,则前端模块可以分为n次将根据第一子ppa读取到的第一数据发送至主机,另外还有1次是根据第二子ppa读取到的第一数据发送至主机。
在本申请实施例中,当前端模块确定接收到的读请求的数据量大于预设的数据逻辑块的最大数据量,则前端模块可以将读请求拆分为n次或n+1次发送至后端模块,后端模块可以根据拆分开来的子读请求分为n次或n+1次读取nand中的数据,由于每次后端模块可以根据子读请求中的多个lba一次性同时读取映射表中的ppa,后端模块可以根据多个ppa一次性同时读取nand中的数据,因此大幅度减少了访问ddrsdram的次数,节约了访问ddrsdram的时间,提升了固态硬盘处理数据的性能,同时提升了处理数据的带宽。
以上对本申请实施例中另一个固态硬盘的数据处理方法进行了描述,以下参见图3,图3为本申请实施例中另一个固态硬盘的数据处理方法进行描述。
301、固态硬盘的前端模块在该前端模块预设数据逻辑块的最大数据量;
302、前端模块接收主机发送的写请求;
303、前端模块判断写请求的数据量是否小于等于最大数据量;
304、前端模块将写请求发送至固态硬盘的后端模块;
本实施例中的步骤301至304与前述图1所述实施例中的步骤101至104类似,仅有一点不同,步骤301至304中前端模块处理的是写请求,写请求中包含有第二lba,该第二lba对应于写请求的数据量,第二lba的个数为大于等于1的整数,具体此处不再赘述。
305、后端模块根据接收到的所有第二lba,为写请求分配第二ppa;
本实施例中,后端模块可以根据接收到的所有第二lba,为写请求分配第二ppa,该第二ppa为写请求的lba对应的ppa,第二ppa的个数为大于等于1的整数。
306、后端模块根据所述第二ppa在所述ddrsdram中写入第二数据;
本实施例中,后端模块可以根据分配的第二ppa,在ddrsdram中写入写请求对应的数据,本实施例中将该数据称为第二数据。
307、后端模块将第二ppa同时保存至ddrsdram中;
本实施例中,后端模块在分配好第二ppa后,可以将第二ppa同时一次性保存到ddrsdram中,以备下一个读请求使用。
本实施例中,由于前端模块在确定写请求的数据量小于等于预设的逻辑数据块的最大数据量后,可以将写请求一次性发送至后端模块,后端模块可以根据写请求中的所有lba一次性同时分配与该lba对应的ppa,然后根据所有ppa一次性同时向ddrsdram写入数据,并将与所有lba对应的ppa保存到ddrsdram的映射表中,因此大幅度减少了访问ddrsdram的次数,节约了访问ddrsdram的时间,提升了固态硬盘处理写数据的性能,同时提升了处理写数据的带宽。
以上对本申请实施例中另一个固态硬盘的数据处理方法进行了描述,以下参见图4,图4为本申请实施例中另一个固态硬盘的数据处理方法进行描述。
401、固态硬盘的前端模块在该前端模块预设数据逻辑块的最大数据量;
402、前端模块接收主机发送的写请求;
403、前端模块判断写请求中第二lba的个数是否小于等于lba个数阈值;
本实施例中,如果前端模块确定第二lba的个数小于等于lba个数阈值,则执行步骤404;如果前端模块确定第一lba的个数大于lba个数阈值,则执行步骤405。
404、前端模块将写请求发送至固态硬盘的后端模块;
本实施例中的步骤401、402和404与前述图1所述实施例的步骤101、102和104,以及前述图3所述实施例的步骤301、302和304类似,此处不再赘述。
405、前端模块计算第二lba的个数与lba个数阈值之间的第一倍数n;
本实施例中,当前端模块确定第二lba的个数大于lba个数阈值时,可以计算第二lba的个数与lba个数阈值之间的倍数,本实施例中将该倍数称为第二倍数n,也就是说,前端模块用第二lba的个数除以lba个数阈值,得到n。
例如,写请求的数据量为256kb个字节,而预设的数据逻辑块的最大数据量为128kb个字节,则n为2。
406、前端模块判断n之外是否有余数;
本实施例中,前端模块在计算得到n时,还需要判断除了n之外是否还有余数。若否,则执行步骤407;若有,则执行步骤409。
407、前端模块将写请求拆分为n个子写请求;
本实施例中,如果前端模块确定除了n之外没有余数,则前端模块将写请求拆分为n个子写请求。例如上述步骤404计算得到n为2,则前端模块将写请求拆分为两个子写请求。每个子写请求包含有1份与该子写请求的数据量对应的lba,本实施例中将该lba称为第三子lba。每一份该第一三子lba的个数为lba阈值个数的1/n倍。
同样举例说明,例如,由于预设的数据逻辑块的最大数据量为128kb,而每个单位数据块的数据量为4kb,则lba个数阈值有128kb/4kb个,即32个,另一方面,由于写请求的数据量为256kb,则写请求的数据量为预设的数据逻辑块的最大数据量128kb的两倍,因此将该写请求的数据量拆分为两份第一子写请求,每份子写请求为128kb,且每份子写请求对应有32个lab。也就是说,每份第三子lba的个数(32个)与lba个数阈值(32个)相等。也就是说,每份第三子lba的个数(32个)是第一lba的个数(共64个)的1/2倍。
408、前端模块将n个子写请求分为n次发送至后端模块;
本实施例中,当前端模块确定求得的n之外没有余数的情况下,可以将n个子写请求拆分为n次发送到后端模块。
例如,前述举例中n求得为2,则将256kb的写请求的数据量拆分为两个写请求,每份写请求中包含有128kb对应的32个lba,然后将两个写请求分为两次发送到后端模块。
本实施例在执行完步骤208之后,接着执行步骤211。
409、前端模块将写请求拆分为n+1个子写请求。
本实施例中,前端模块在确定计算求得的n之外有余数的情况下,可以将写请求拆分为n+1个子写请求,从第1个到第n个的每个子写请求中包含有1份第三子lba,第n+1个子写请求中包含有1份第四子lba,该第四子lba的个数为余数的1/4倍。
以下举例进行说明,例如,写请求的数据量为272kb,而逻辑数据块的最大数据量为128kb,则写请求的数据量除以最大数据量所得的整数n为2,并有余数16kb。即,前端模块将写请求拆分为3个子写请求,第1个和第2个的每个子写请求中各包含有1份第三子lba,每份第三子lba有32个,而第3个子写请求中包含有一份第四子lba,该第四子lba的个数为4个,即余数16的1/4倍。
410、前端模块将n+1个子写请求分为n+1次发送至后端模块;
本实施例中,当前端模块确定求得的n之外还有余数的情况下,可以将n+1个子写请求拆分为n+1次发送到后端模块。
例如,前述举例中n求得为2,余数为16,则将272kb的写请求的数据量拆分为3个写请求,第一份和第二份写请求中包含有128kb对应的32个lba,第三份写请求中包含有16kb对应的4个lba,然后将3个写请求分为3次发送到后端模块。
本实施例在执行完步骤410之后,接着执行步骤411。
411、后端模块根据接收到的第二lba,为写请求分配第二ppa;
本实施例中,如果前端模块确定求得的n之外没有余数的情况下,则后端模块可以根据接收到n次第三子lba,然后可以分n次为n个子写请求分配第三子ppa,后端模块在根据每一个子写请求分配第三子ppa时,可以根据每个子写请求中的第三子lba一次性同时分配第三子ppa,第三子ppa的个数为第二ppa的1/n倍;如果后端模块确定写请求的数据量大于最大数据量,则后端模块会接收到n次第三子lba以及1次第四子lba,然后可以分为n次为n个子写请求分配第三子ppa,另外还有1次是同时一次性读取与第四子lba对应的第四子ppa。
需要说明的是,本实施例中,第二lba可以只包含有第三子lba,也可以包含第三子lba和第四子lba;第二ppa可以只包含有第三子ppa,也可以包含第三子ppa和第四子lba,具体此处不做限定。
412、后端模块根据所述第二ppa在所述ddrsdram中写入第二数据;
本实施例中,如果前端模块确定求得的n之外没有余数的情况下,则后端模块会接收到n次第三子lba,然后可以分n次同时一次性在ddrsdram中写入写请求对应的第二数据;如果前端模块确定求得的n之外还有余数的情况下,则后端模块会接收到n次第三子lba以及1次第四子lba,然后可以分为n次同时一次性根据第三子lba在ddrsdram中写入第二数据,另外还有1次是同时一次性根据四子lba在ddrsdram中写入第二数据。
413、后端模块将第二ppa同时保存至ddrsdram中;
本实施例中,后端模块在分配好第二ppa后,可以将第二ppa同时一次性保存到ddrsdram中,以备下一个读请求使用。
在本申请实施例中,当前端模块确定接收到的读写请求的数据量大于预设的数据逻辑块的最大数据量,则前端模块可以将读写请求拆分为n次或n+1次发送至后端模块,后端模块可以根据拆分开来的子读请求分为n次或n+1次读取nand中的数据,也可以根据拆分开来的子写请求向ddrsdram中分为n次或n+1次写入数据,并每次根据子写请求中的lba向ddrsdram的映射表一次性写入与子写请求中lba对应的ppa,因此大幅度减少了访问ddrsdram的次数,节约了访问ddrsdram的时间,提升了固态硬盘处理数据的性能,同时提升了处理数据的带宽。
上面对本申请实施例中的固态硬盘的数据恢复方法进行了描述,下面对本申请实施例中的固态硬盘进行描述,请参阅图5,图5为本申请实施例中固态硬盘的一个实施例示意图。
本申请实施例中固态硬盘的一个实施例包括:
预设单元501,用于在所述固态硬盘的前端模块预设数据逻辑块的最大数据量;
第一接收单元502,用于接收主机发送的读请求,所述读请求包含有第一逻辑区块地址lba,所述第一lba的个数为大于等于1的整数;
第一判断单元503,用于判断所述读请求的数据量是否小于等于所述最大数据量;
第一发送单元504,用于当确定所述读请求的数据量小于等于所述最大数据量时,将所述读请求发送至所述固态硬盘的后端模块;
读取单元505,用于根据接收到的所述第一lba,同时读取与所有所述第一lba对应的双倍速率同步动态随机存储器ddrsdram中的第一物理页地址ppa,所述第一ppa的个数为大于等于1的整数;
第二发送单元506,用于将所述第一ppa发送至闪存nand;
第三发送单元507,用于将所述nand根据所述第一ppa读取的第一数据发送至所述前端模块;
第四发送单元508,用于将所述第一数据发送至主机。
本实施例中,所述第一判断单元503具体用于判断所述第一lba的个数是否小于等于lba个数阈值,所述lba个数阈值为所述最大数据量与单位数据逻辑块的数据量的商,所述单位数据逻辑块的数据量为4k,所述lba个数阈值为大于1的整数。
本实施例中,固态硬盘还包括:
第一计算单元509,用于当确定所述第一lba的个数大于所述lba个数阈值时,计算所述第一lba的个数与所述lba个数阈值之间的第一倍数n,所述n为所述第一lba的个数除以所述lba个数阈值的值;
第二判断单元510,用于判断所述n之外是否有余数;
第一拆分单元511,用于当确定所述n之外没有余数时,将所述读请求拆分为n个子读请求,每个所述子读请求包含有1份第一子lba,所述第一子lba的个数为所述第一lba的个数的1/n倍;
第五发送单元512,用于将所述n个子读请求分为n次发送至所述后端模块。
第二拆分单元513,用于当确定所述n之外有余数时,将所述读请求拆分为n+1个子读请求,从第1个到第n个的每个所述子读请求中包含有1份第一子lba,第n+1个所述子读请求中包含有1份第二子lba,所述第二子lba的个数为所述余数的1/4倍。
本实施例中,固态硬盘还包括:
第二接收单元514,用于接收主机发送的写请求,所述写请求包含有第二lba,所述第二lba的个数为大于等于1的整数;
第三判断单元515,用于判断所述写请求的数据量是否小于等于所述最大数据量;
第六发送单元516,用于当确定所述写请求的数据量小于等于所述最大数据量时,将所述写请求发送至所述固态硬盘的后端模块;
分配单元517,用于根据接收到的所有所述第二lba,为所述写请求分配第二ppa,所述第二ppa的个数为大于等于1的整数;
写单元518,用于根据所述第二ppa在所述ddrsdram中写入第二数据;
保存单元519,用于将所述第二ppa同时保存至所述ddrsdram中,所述第二数据为所述写请求中包含的数据。
本实施例中,所述第三判断单元515具体用于判断所述第二lba的个数是否小于等于所述lba个数阈值。
本实施例中,固态硬盘还包括:
第二计算单元520,用于计算所述第二lba的个数与所述lba个数阈值之间的第二倍数m,所述m为所述第二lba的个数除以所述lba个数阈值的值;
第四判断单元521,用于判断所述m之外是否有余数;
第三拆分单元522,用于当确定所述m之外没有余数,则将所述写请求拆分为m个子写请求,每个所述子写请求包含有1份第三子lba,所述第三子lba的个数为所述第二lba的个数的1/m倍;
第七发送单元523,用于将所述m个子写请求分为m次发送至所述后端模块。
第四拆分单元524,用于当确定所述m之外没有余数时,将所述写请求拆分为m+1个子写请求,从第1个到第m个的每个所述子写请求中包含有1份第三子lba,第m+1个所述子写请求中包含有1份第四子lba,所述第四子lba的个数为所述余数的1/4倍。
本申请实施例中,当第一判断单元503确定读请求的数据量小于等于预设的逻辑数据块的最大数据量时,读取单元505可以根据读请求一次性读取ddrsdram中的ppa,当第三判断单元515确定写请求的数据量小于等于预设的逻辑数据块的最大数据量时,写单元518可以根据写请求向ddrsdram中写入数据,并将写请求对应的ppa一次性保存到ddrsdram中;而当第一判断单元503确定读请求的数据量大于预设的逻辑块的最大数据量时,第一拆分单元511或第二拆分单元513可以将读请求根据预设的逻辑块的最大数据量分成多个子读请求,读取单元505根据每个子读请求一次性读取ddrsdram中的ppa,当第三判断单元515确定写请求的数据量大于预设的逻辑数据块的最大数据量时,第三拆分单元521或第四拆分单元523可以将写请求拆分为多个子写请求,写单元518根据每个子写请求向ddrsdram中写入数据,并将每次接收到的子写请求对应的ppa保存到ddrsddram中,因此大幅度减少了访问ddrsdram的次数,节约了访问ddrsdram的时间,提升了固态硬盘处理数据的性能,同时提升了处理数据的带宽。
请参阅图6,图6为本申请实施例中固态硬盘的另一个实施例示意图。
本申请实施例中的固态硬盘的另一个实施例包括:
该固态硬盘600可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上处理器(centralprocessingunits,cpu)601(例如,一个或一个以上处理器)和存储器605,该存储器605中存储有一个或一个以上的应用程序或数据。
其中,存储器605可以是易失性存储或持久存储。存储在存储器605的程序可以包括一个或一个以上模块,每个模块可以包括对服务器中的一系列指令操作。更进一步地,处理器601可以设置为与存储器605通信,在固态硬盘600上执行存储器605中的一系列指令操作。
固态硬盘600还可以包括一个或一个以上电源602,一个或一个以上有线或无线网络接口603,一个或一个以上输入输出接口604,和/或,一个或一个以上操作系统,例如windowsservertm,macosxtm,unixtm,linuxtm,freebsdtm等等。
需要说明的是,本实施例中的存储器605可以使用sata接口的存储硬盘,具体此处不做限定。此外,本实施例中的固态硬盘600可以不设置掉电保护装置,且可以只设置一个处理器601,具体此处不做限定。
本实施例中固态硬盘600中的处理器601所执行的流程与前述图1至图4所示的实施例中描述的方法流程类似,此处不再赘述。
前端模块可以在读请求的数据量小于最大数据量时将读请求的所有第一lba同时发送至后端模块,后端模块可以根据所有第一lba一次性同时读取ddrsdram中映射表,因此大幅度减少了访问ddrsdram的次数,节约了访问ddrsdram的时间,提升了固态硬盘处理数据的性能,同时提升了处理数据的带宽。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、磁碟或者光盘等各种可以存储程序代码的介质。