具体实施方式
本发明实施例提供了一种闪存数据处理方法及装置,用于提高数据随机写入的性能。
请参阅图1,本发明实施例中闪存数据处理方法第一实施例包括:
101、根据获取到的目标数据查询待更新的源数据;
本实施例中,当需要对闪存数据块中某一页的数据进行更新时,首先会获取新的数据,即目标数据,之后再根据该目标数据所需存储的位置查询待更新的源数据。
例如,当用户在操作***中需要替换一个文件时(具体可以为用户粘贴了一个文件名相同的文件,并选择了“覆盖”),则操作***可以从用户粘贴的位置获知该文件在闪存中对应的位置,并且读取原先存储于闪存中该位置的数据,即可获得待更新的源数据。
102、将所述目标数据写入预置空白数据块的第一数据页中,将所述源数据所在的数据页标注为无效页;
当确定了待更新的源数据之后,在预置的空白数据块组中获取一个空白数据块,将目标数据写入该空白数据块的某一个数据页中,记录为第一数据页。
并将源数据所在的数据页标注为无效页,具体的标注方式可以为:在该数据页的标签或属性字段中***无效标志,该无效标志用于指示该数据页无效,即暂时不会对该数据页进行读写操作,需要说明的是,在实际应用中,具体标注无效页的方式还可以有很多种,此处不作限定。
103、将预置的页级逻辑映射表中的所述无效页的表项替换为所述第一数据页的表项。
由于步骤102中将源数据所在的数据页标注为无效页,为保证原先与该数据页有关联的数据页中的数据保持完整,则可以在预置的页级逻辑映射表中将该无效页的表项替换为第一数据页的表项。
本实施例中的页级逻辑映射表中记录有各存储有数据的数据页的逻辑地址,物理地址,以及各数据页之间的关联关系。
本实施例中,将页级逻辑映射表中的无效页的表项替换为第一数据页的表项,即可使得第一数据页中的数据代替无效页中的数据,且原先各数据页之间的关联关系保持不变,即实现了数据的更新。
本实施例中,获取到目标数据之后,将目标数据写入预置空白数据块的第一数据页中,并将源数据所在的数据页标注为无效页,同时还将预置的页级逻辑映射表中的无效页的表项替换为第一数据页的表项,因此,在数据更新的过程中,无需对无效页所在的数据块进行擦除,而直接采用空白数据块中的第一数据页替代该无效页进行数据存储,因此节省了数据更新的操作,从而提高了数据随机写入的性能。
请参阅图2(a),本发明实施例中闪存数据处理方法第二实施例包括:
201、搜索空白数据块,建立页级逻辑映射表;
本实施例中,当***上电时,对各物理数据块进行遍历,查询未记录数据的物理数据块以及已被擦除的物理数据块,将所述未记录数据的物理数据块以及已被擦除的物理数据块作为预置空白数据块。
假设共有3个数据块,分别为X,Y以及Z,其中X中原先已记录有数据且未被擦除,Y和Z中未记录数据,则通过遍历可以查询到Y和Z为空白数据块。
需要说明的是,本实施例中,还可以预先建立页级逻辑映射表,该页级逻辑映射表中记录有各存储有数据的数据页的逻辑地址,物理地址,以及各数据页之间的关联关系,本实施例中的页级逻辑映射表可以采用二叉树,或B+树等数据存储方式以记录数据。
本实施例中以二叉树为例对页级逻辑映射表进行说明,可以理解的是,同样可以为其他类型的数据存储方式:
请参阅图2(b),图中的共包含6个节点,分别为A,B,C,D,E,F,其中每个节点代表一个数据页,每个节点由四部分内容组成,从左到右分别是“左节点标识”,“逻辑地址”,“物理地址”以及“右节点标识”,本实施例中的每个节点可以由16个字节组成,四个部分中每部分占用4个字节。
图2(b)中,若某节点的“左节点标识”或“右节点标识”为“NULL”,则表示该节点没有左节点,或没有右节点。
202、根据获取到的目标数据查询待更新的源数据;
本实施例中,当需要对闪存数据块中某一页的数据进行更新时,首先会获取新的数据,即目标数据,之后再根据该目标数据所需存储的位置查询待更新的源数据。
假设用户希望用目标数据“500”替换源数据“300”,则可确定目标数据为“500”,源数据为“300”。
203、将所述目标数据写入预置空白数据块的第一数据页中,将所述源数据所在的数据页标注为无效页;
当确定了待更新的源数据之后,在预置的空白数据块组中获取一个空白数据块,将目标数据写入该空白数据块的某一个数据页中,记录为第一数据页。
并将源数据所在的数据页标注为无效页,具体的标注方式可以为:在该数据页的标签或属性字段中***无效标志,该无效标志用于指示该数据页无效,即暂时不会对该数据页进行读写操作,需要说明的是,在实际应用中,具体标注无效页的方式还可以有很多种,此处不作限定。
假设源数据“300”存储于数据页由节点E表示(如图2(b)所示),则可知该数据页的逻辑地址为70,物理地址为8,左节点为D,右节点为F,由于该数据页内的源数据“300”已经失效,则将该数据页标注为无效页。
当前的空白数据块为Y和Z,可任意选取一个,例如选取Y为空白数据块以写入数据,则可以将目标数据“500”写入空白数据块Y中的某一个数据页(即第一数据页)内,假设该第一数据页的物理地址为9。
204、将预置的页级逻辑映射表中的所述无效页的表项替换为所述第一数据页的表项;
由于步骤203中将源数据所在的数据页标注为无效页,为保证原先与该数据页有关联的数据页中的数据保持完整,则可以在预置的页级逻辑映射表中将该无效页的表项替换为第一数据页的表项。
具体的替换的方式可以为:查询所述无效页所在的表项,将表项中的物理地址修改为第一数据页的物理地址,保留表项原有的关联信息,该关联信息用于表示该表项与其他表项之间的关联关系。
即,无效页所在的表项为节点E,获取第一数据页的物理地址9,将节点E中的物理地址由8修改为9,并且保持该节点E原先的“左节点标识”以及“右节点标识”,则实现了第一数据页对无效页的替换。
205、判断是否满足预置的更新条件,若是,则执行步骤206,若否,则持续进行判断;
本实施例中,由于步骤203中会将数据块中的某些数据页标注为无效页,则这些无效页暂时不能进行读写操作,为提高存储资源的利用率,在某些情况下需要对这些数据块中的数据进行更新,以消除无效页,具体情况可以包括:
(1)、某一数据块中的无效页的数目达到预置数值:
当某一数据块内的无效页的数目达到某一门限值(该门限值可以根据用户需求进行设定,一般设置为一个大于或等于2的数字)时,可能会使得存储空间减少,则在此情况下可以根据第一数据页中的目标数据对无效页所在的数据块进行更新。
(2)、***处于空闲状态:
当***未进行读写操作,即处于空闲状态时,同样可以利用这段空闲时间根据第一数据页中的目标数据对无效页所在的数据块进行更新。
需要说明的是,上述仅以两个例子对预置的更新条件进行了说明,可以理解的是,在实际应用中,同样可以为其他的预置更新条件,此处不作限定。
206、根据第一数据页中的目标数据对无效页所在的数据块进行更新。
本实施例中,具体的更新过程可以为:
将数据块中除无效页外的其他数据页中的数据保存到缓存;
对数据块进行擦除;
获取第一数据页中的目标数据;
将所述目标数据写入原先的无效页中得到修改页;
将包含目标数据的修改页以及缓存中保存的数据内容写入擦除之后的数据块中;
将预置的页级逻辑映射表中的第一数据页的表项替换为所述修改页的表项。
上述更新流程中,由于闪存的特性,因此最小擦除单位为数据块,为将目标数据重新写入原先的数据页中,则可以先将数据块中其他数据页的内容拷贝至缓存,再重新写入新的数据,从而实现数据块的更新,该数据块更新的过程与现有技术中数据更新的过程类似,此处不再赘述。
当数据更新完之后,修改页(即写入了目标数据的原先的无效页)中即保存有目标数据,此时可以再对页级逻辑映射表进行调整,用修改页的表项替换原先的第一数据页的表项,具体的替换过程与前述替换过程类似,此处不再赘述,替换完成之后,则节点E中的物理地址再次被修改为8。
需要说明的是,由于本实施例中设置了页级逻辑映射表,则可能会占用一定的***资源,为减少资源占用,当***空闲时,或该页级逻辑映射表占用的资源达到预置的门限值时,可以对该页级逻辑映射表进行整理,具体的整理方式可以为:
首先获取属于同一个数据块的待整理的数据页,将该数据块内的有效数据和待整理的数据页中的数据进行合并,具体的合并可以通过COPY_BACK操作实现,可以理解的是,在实际应用中同样可以采用其他类似的操作实现数据合并,此处不作限定。
合并完成后,将合并后的数据拷贝至空白块中,同时在页级逻辑映射表中删除待整理的数据页的表项。
通过上述的整理操作,可以对数据页中的数据以及该数据页所属数据块中的数据进行合并,从而减少了数据页的数量,即减少了页级逻辑映射表中的内容。
需要说明的是,上述的整理方式仅为整理页级逻辑映射表的一个例子,在实际应用中,同样还可以采用其他的整理方式,此处不作限定。
本实施例中,由于在满足预置的更新条件之后,才对无效页所在的数据块进行更新,则能够保证无需在每次数据更新时都对数据块进行擦除,从而节省了数据更新的流程,提高了数据随机写入的性能;
其次,由于本实施例中采用二叉树作为页级逻辑映射表的存储方式,因此能够有效地提高页级逻辑映射表的查询效率;
再次,由于本实施例中可以对页级逻辑映射表进行整理,因此能够有效地减少***资源的占用。
综上所述,本实施例中,由于存在预置的页级逻辑映射表,且该页级逻辑映射表中包含有各数据页的物理地址,逻辑地址,以及各数据页之间的关联关系,所以在对某一数据页的内容进行更新时,只需要在该页级逻辑映射表中对该数据页的物理地址进行替换即可实现数据的更新,而无需擦除该数据页所在的整个数据块,因此本实施例可以利用该页级逻辑映射表以提高数据随机写入的性能。
下面介绍本发明实施例中闪存数据处理方法的另一实施例:
首先,需要说明的是,在现有技术中的闪存数据存储过程中,最小的存储单位为数据页,同样还可以以数据块为单位进行存储,但是现有技术中只建立有数据块之间的逻辑关系表,即块级逻辑映射表,当用户需要多次存储少量数据时,可能会使得每次存储均占用一个数据块,而该数据块的大部分空间可能仍然是空白的,因此会浪费大量的存储空间。
本发明实施例中提供了一种闪存数据处理方法,用以解决上述缺陷,具体请参阅图3,本发明实施例中闪存数据处理方法第三实施例包括:
301、获取待写入数据的长度信息;
当用户需要写入数据时,首先获取待写入数据的长度,该长度的单位可以以扇区为单位,假设一个数据块内包含64个数据页,每个数据页内包含4个扇区。
302、根据长度信息以及一个数据块所包含的扇区的数目将待写入数据拆分为块级数据以及页级数据;
本实施例中,将待写入数据的长度信息转换为对应所需占用的扇区数目L(若待写入数据原先即以扇区为单位计算长度,则无需转换),具体的转换方式此处不作限定;
获取一个数据块所包含的扇区的数目N;
将L与N进行取整运算,根据取整运算的结果B确定块级数据;
将L与N进行取余运算,根据取余运算的结果确定页级数据。
假设上述的L=260,N=64*4=256,则L div N=1,L mod N=4,则B=1,则块级数据为一个完整的空白数据块所能存储的数据,页级数据为4个扇区(即一个数据页)所能存储的数据。
303、按照块写入方式写入块级数据,按照页写入方式写入页级数据并对预置的页级逻辑映射表进行更新。
为便于理解,下面首先介绍本实施例中的预先设置流程:
首先可以建立四张数据表,分别为:
块级逻辑映射表:用于记录数据块的逻辑映射关系,逻辑地址与物理地址一一对应关系;
页级逻辑映射表:用于记录数据页的逻辑映射关系,采用二叉树的方式记录,包括数据页的逻辑地址,物理地址以及各数据页之间的关联关系;
块擦除次数列表:用于记录各数据块的擦除次数;
未擦除块列表:用于记录未被擦除的数据块。
需要说明的是,具体的块级逻辑映射表可以如下表所示:
表1
块级映射表项 |
对应的逻辑地址 |
对应的物理地址 |
0 |
0*n |
0x00000000 |
1 |
1*n |
0x00000005 |
2 |
2*n |
0x80000010 |
... |
... |
... |
N |
N*n |
0xFFFFFFFF |
N+1 |
(N+1)*n |
0xFFFFFFFF |
... |
... |
... |
上述表1中的每一项由4个字节实现,每一项都标识一个数据块的逻辑地址与物理地址之间的对应关系。
完成上述设置后即可进行数据的写入操作,下面对块级数据写入以及页级数据写入分别进行说明:
(1)块级数据写入,具体如图4所示:
a、从预置的空白数据块中选取B个空白数据块;
***上电时,对各数据块进行遍历即可查询到未写入数据的空白数据块,或者还可以对未擦除块列表中的数据块进行擦除得到空白数据块。
需要说明的是,在对未擦除块列表中的数据块进行擦除之前还可以先通过块擦除次数列表查询每一个数据块被擦除的次数,优先选择被擦除次数少的数据块进行擦除,以使得各数据块被擦除的次数大致相当,从而提高闪存的整体寿命。
b、将块级数据写入B个空白数据块中;
上述确定了需要一个空白数据块以存储数据,则可按顺序读取一部分数据,使得这部分数据刚好可以填充满一个数据块,并将这部分数据存储该数据块中。
c、将B个空白数据块的逻辑地址以及物理地址填入预置的块级逻辑映射表;
当数据填充完成后,该数据块即保存有数据,则将该数据块的逻辑地址以及物理地址填入块级逻辑映射表中,用于指示该数据块中已存有数据。
d、根据B个空白数据块的逻辑地址获取逻辑地址范围;
每个数据块对应一段逻辑地址,则此步骤获取该数据块对应的逻辑地址范围。
e、在预置的页级逻辑映射表中删除逻辑地址在该逻辑地址范围内的表项。
由于该数据块中已存满数据,则无法继续在该数据块所包含的数据页中存储数据,则可以从页级逻辑映射表中删除逻辑地址在该逻辑地址范围内的表项。
(2)块级数据写入,具体如图5所示:
a、从预置的空白数据块中选取一个空白数据块;
***上电时,对各数据块进行遍历即可查询到未写入数据的空白数据块,或者还可以对未擦除块列表中的数据块进行擦除得到空白数据块。
需要说明的是,在对未擦除块列表中的数据块进行擦除之前还可以先通过块擦除次数列表查询每一个数据块被擦除的次数,优先选择被擦除次数少的数据块进行擦除,以使得各数据块被擦除的次数大致相当,从而提高闪存的整体寿命。
b、将页级数据按顺序写入该空白数据块中的数据页;
由上述步骤302可知,写入页级数据共需要4个扇区(即一个数据页)的空间,具体写入页级数据的过程与现有技术中按照数据页为单位写入数据的过程一致,此处不作限定。
c、在预置的页级逻辑映射表中写入该空白数据块中存有该页级数据的数据页的逻辑地址,物理地址以及该数据页与其他数据页之间的关联关系;
当页级数据写入完成后,则该数据页即存有数据,则可以在页级逻辑映射表中新增一个节点,用于表示该数据页,具体新增的过程可以为:获取该数据页的逻辑地址以及物理地址,并根据该数据页中存储的数据与其他数据之间的关系确定该数据页的左节点以及右节点,之后形成新的节点***页级逻辑映射表中。
d、在预置的块级逻辑映射表中修改空白数据块的标志,用于指示该空白数据块中存在页级逻辑映射表。
本实施例中,在某一空白数据块中的某数据页内写入数据之后,则仅通过块级逻辑映射表已无法完整读取该数据块的内容,则还需读取该数据块的页级逻辑映射表才能够完整读取该数据块的内容,因此,需要在块级逻辑映射表中对该数据块的物理地址进行调整,具体可以将该数据块的对应的物理地址的最高位修改为1以作标识。
例如表1中表项“2”所示的数据块的物理地址为0x80000010,转化为二进制数为:1000 0000 0000 0000 0000 0000 0000 0001 0000,则其最高位为1,表示该数据块包含有页级逻辑映射表,在读取该数据块的内容时,需要同时读取页级逻辑映射表才能够完整地获取该数据块的内容。
本实施例中,由于设置了页级逻辑映射表,则可能会占用一定的***资源,为减少资源占用,当***空闲时,或该页级逻辑映射表占用的资源达到预置的门限值时,可以对该页级逻辑映射表进行整理,具体的整理方式与前述实施例中的整理方式一致,此处不再赘述。
本实施例中,由于待写入的数据可以被拆分为块级数据以及页级数据,因此能够在一次写入过程中同时分配数据块以及数据页进行数据写入,避免了少量数据占用一个完整数据块的情况,从而节约了存储空间;
其次,本实施例中,可以记录每个数据块被擦除的次数,并优先选择被擦除次数少的数据块进行擦除,以使得各数据块被擦除的次数大致相当,从而提高闪存的整体寿命;
再次,由于本实施例中可以对页级逻辑映射表进行整理,因此能够有效地减少***资源的占用。
综上所述,本实施例中,由于存在预置的页级逻辑映射表,且该页级逻辑映射表中包含有各数据页的物理地址,逻辑地址,以及各数据页之间的关联关系,所以在向空白数据块写入页级数据时,可以在该空白数据块的页级逻辑映射表中相应增加对应的表项,从而使得该空白数据块中可以存储若干个数据页的页级数据,而不会出现每个数据页的数据都需要独立占用一个数据块的情况,因此能够有效地节约存储空间。
上述实施例中介绍了两种闪存数据处理方法均是基于预置的页级逻辑映射表对页级数据(包括闪存中存储的页级数据以及向闪存写入的页级数据)进行管理,因此能够有效地提高闪存数据处理的性能。
下面对本发明实施例中的闪存数据处理装置进行介绍:
请参阅图6,本发明实施例中闪存数据处理装置第一实施例包括:
源数据查询单元601,用于根据获取到的目标数据查询待更新的源数据;
写入单元602,用于将所述目标数据写入预置空白数据块的第一数据页中;
标注单元603,用于所述源数据所在的数据页标注为无效页;
替换单元604,用于将预置的页级逻辑映射表中的所述无效页的表项替换为所述第一数据页的表项。
本实施例中的闪存数据处理装置还可以进一步包括:
更新触发单元605,用于判断是否满足预置的更新条件,若是,则触发更新单元执行相应操作;
更新单元606,用于在所述更新触发单元的触发下,根据所述第一数据页中的目标数据对所述无效页所在的数据块进行更新。
本实施例中的更新触发单元605包括:
第一触发单元6051,用于判断数据块内无效页的数目是否达到预置数值,若是,则触发更新单元执行相应操作;
或,
第二触发单元6052,用于判断当前是否处于空闲状态,若是,则触发更新单元执行相应操作。
本实施例中的更新单元606包括:
数据更新单元6061,用于将所述数据块中除无效页外的其他数据页中的数据保存到缓存,对所述数据块进行擦除,获取所述第一数据页中的目标数据,将包含所述目标数据的修改页以及缓存中保存的数据内容写入所述擦除之后的数据块中;
映射表更新单元6062,用于将预置的页级逻辑映射表中的所述第一数据页的表项替换为所述修改页的表项。
本实施例中的闪存数据处理装置还可以进一步包括:
空白数据块搜索单元607,用于当***上电时,对各物理数据块进行遍历,查询未记录数据的物理数据块以及已被擦除的物理数据块,将所述未记录数据的物理数据块以及已被擦除的物理数据块作为预置空白数据块。
本实施例中的闪存数据处理装置还可以进一步包括:
映射表生成单元608,用于建立页级逻辑映射表,所述页级逻辑映射表中包含各存有数据的数据页的逻辑地址,物理地址以及该数据页与其他数据页之间的关联关系。
本实施例中的闪存数据处理装置还可以进一步包括:
映射表整理单元609,用于对所述页级逻辑映射表进行整理。
本实施例中,写入单元602将目标数据写入预置空白数据块的第一数据页中,标注单元603将源数据所在的数据页标注为无效页,替换单元604将预置的页级逻辑映射表中的无效页的表项替换为第一数据页的表项,因此,在数据更新的过程中,无需对无效页所在的数据块进行擦除,而直接采用空白数据块中的第一数据页替代该无效页进行数据存储,因此节省了数据更新的操作,从而提高了数据随机写入的性能。
请参阅图7,本发明实施例中闪存数据处理装置第二实施例包括:
长度信息获取单元701,用于获取待写入数据的长度信息;
数据拆分单元702,用于根据所述长度信息以及一个数据块所包含的扇区的数目将所述待写入数据拆分为块级数据以及页级数据;
数据写入单元703,用于按照块写入方式写入所述块级数据,按照页写入方式写入所述页级数据。
本实施例中的数据写入单元703包括:
块写入单元7031,用于从预置的空白数据块中选取B个空白数据块,将所述块级数据写入所述B个空白数据块中,将所述B个空白数据块的逻辑地址以及物理地址填入预置的块级逻辑映射表,根据所述B个空白数据块的逻辑地址获取逻辑地址范围,在预置的页级逻辑映射表中删除逻辑地址在所述逻辑地址范围内的表项;
页写入单元7032,用于从预置的空白数据块中选取一个空白数据块M,将所述页级数据按顺序写入所述空白数据块M中的数据页,在预置的页级逻辑映射表中写入所述存有数据的数据页的逻辑地址,物理地址以及该数据页与其他数据页之间的关联关系,在预置的块级逻辑映射表中修改所述空白数据块M的标志,用于指示所述空白数据块M中存在页级逻辑映射表。
本实施例中,由于待写入的数据可以被数据拆分单元702拆分为块级数据以及页级数据,并且由数据写入单元703中的块写入单元7031以及页写入单元7032分别进行写入,因此能够在一次写入过程中同时分配数据块以及数据页进行数据写入,避免了少量数据占用一个完整数据块的情况,从而节约了存储空间。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,该程序在执行时,包括如下步骤:
根据获取到的目标数据查询待更新的源数据;
将所述目标数据写入预置空白数据块的第一数据页中,将所述源数据所在的数据页标注为无效页;
将预置的页级逻辑映射表中的所述无效页的表项替换为所述预置空白数据块的第一数据页的表项。
上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上对本发明所提供的一种闪存数据处理方法及装置进行了详细介绍,对于本领域的一般技术人员,依据本发明实施例的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。