具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
实施例1
本实施例公开一种写入数据的方法,如图1所示,该方法包括如下步骤:
101,接收到上层(如计算机操作系统)发来的向存储块中写入新数据的指令。
102,在存储器的所有数据存储块中查找出需要修改的数据所在的数据存储块。
103,在存储器所有的空存储块中随机的选出一个空存储块,并将该空存储块作为选出的空存储块。
104,将数据中需要修改部分进行修改,并将修改后的新数据与数据相结合成为更新数据,并将该更新数据写入上述选出的空存储块中。
105,将101步骤中定位到的数据存储块里的数据擦除,使该数据存储块成为一个空存储块。
本实施例提供的写入数据的方法,通过采用将要写入的数据写入在随机选出的空存储块中的技术方案,取得了可实现均匀的对各个存储块执行写入操作的有益效果。进一步的,又因为每个存储块被执行的写入操作的次数可是均匀的数值,所以克服了某些个别的存储块因为被执行的写入操作的次数过多,导致的受损程度较严重,甚至无法再次使用的技术问题,同时也提高了存储块可以使用的次数。
实施例2
本实施例公开一种写入数据的装置,如图2所示,该装置包括:接收模块21,定位模块22,选出模块23,写入模块24,擦除模块25。
接收模块21用于接收写入新数据的指令;定位模块22用于定位需要修改的数据所在的数据存储块;选出模块23用于从所有的空存储块中随机选出一个空存储块;写入模块24用于将所述数据与新数据结合后为更新数据,并将所述更新数据写入所述随机选出的空存储块中;擦除模块25用于将定位到的数据存储块擦除为空存储块。
本实施例提供的写入数据的装置便于写入数据的方法的实现,同时也可提高例如:闪存等,存储块容易受损的存储器的使用寿命。
实施例3
本实施例结合对存储块中的数据进行修改时的场景,具体描述写入数据的方法,如图3所示,该方法包括如下步骤:
为了阐述方便,假设在本实施例中闪存存储区的物理地址为从0x0000000到0x00007800,设每个存储块为0x100个字节,则共有0x78个存储块。相应地,各存储块的物理块号为0x00到0x77。在每个存储块的首字节用来标记该存储块逻辑块号,文件可以看做是多个存储块的集合并且文件中的存储块是根据各个存储块的逻辑块号联结起来的。
根据存储块逻辑块号的不同,在本实施例中存储块分为了两种类型:
空存储块,指逻辑块号是0xFF的存储块。空数据区指空存储块中首字节(即逻辑块号)以外的字节所组成的区域,则如果空数据区的所有字节都是0xFF,该空存储块随时可以写入数据;否则,该空存储块为不能直接写入数据的空存储块,需对该空存储块进行擦除操作,即使该空存储块所有字节变为0xFF,则空存储块就成为随时可以写入数据的空存储块。特别地,把不能直接写入数据的空存储块称为“有记录的空存储块”。
数据存储块,指逻辑块号在0x01到0x78范围内的存储块。数据区数据指数据存储块中首字节(即逻辑块号)以外的字节所存储的数据。数据区数据被认为是有效的文件数据。
301,在存储器通电后,统计存储器中空存储块的总数,并生成一个不大于该总数的随机数。
在本实施例中具体为:在内存开辟一个变量N=0,设置指针P指向闪存存储区物理首地址,即P=0x00000000,指针P从0x00000000开始,到0x00007800结束,P的步长是0x100,即P=P+0x100,则P总是指向存储块逻辑块号。判断P所指向的存储块逻辑块号是否为0xFF。如果是0xFF,使N=N+1,当P=0x00007800时,N的值就是空存储块的总数。根据得到的空存储块的总数N生成一个随机数M。随机数的M的范围是1<=M<=N。M可以是通过相关的一个函数f(M)产生的,也可以单纯的选出1<=M<=N之间的整数。这两种方法都可以用于生成本实施例中的随机数。
302,判断空存储块的总数是否与生成的随机数相同,如果空存储快的总数与生成的随机数相同,则执行步骤303;如果空存储块的总数与生成的随机数不同,则执行步骤309。
在本实施例中具体为:判断M是否等于N,如果M等于N则执行步骤303;如果M不等于N则执行步骤309。
当存储器中空存储块的个数很少时,根据空存储块总数生成的随机数,与空存储块总数相等的可能性就会变大。在本实施例中,利用该可能性,通过采用判断空存储块的总数是否与随机数相等的方案,取得可了解到空存储块目前总数状况的技术效果。而且在本实施例的此过程中,计算机生成的随机数就相当于用户设置的一个预设数值,该预设数值相当于一个门限,可了解到当前空存储块总数是否处于很少的状况,以便采取相应的措施。
303,统计存储器中数据存储块的总数并随机生成一个不大于该数据存储块总数的随机数;同时根据301步骤中统计出的空存储块的总数,随机生成一个不大于该空存储块总数的随机数。
在本实施例中具体为:申请两个内存变量A和B。用A记录在存储器中查找到的数据存储块的总数,用B记录在存储器中查找到的空存储块的总数(在本实施例中使B=N既可),并根据A的值生成一个随机数a,a的范围是1<=a<=A;根据B的值生成一个随机数b,b的范围是1<=b<=B。
304,根据数据存储块总数生成的随机数在数据存储块中选出一个数据存储块;同时根据空存储块总数生成的随机数在空存储块中选出一个目标空存储块。
在本实施例中具体为:在内存开辟一个局部变量N4=0,设置指针T指向闪存存储区物理首地址,即T=0x00000000,指针T从0x00000000开始,到0x00007800结束,指针T的步长是0x100,即T=T+0x100,则指针T总是指向存储块逻辑块号。判断指针T当前所指向的存储块逻辑块号是否在0x01至0x78范围内。如果是,则N4=N4+1。当N4=a的时候,指针T当前所指向的数据存储块即为根据随机数a所选出的数据存储块n4,并选定该数据存储块n4。
同时,在内存开辟一个局部变量N3=0,设置指针S指向闪存存储区物理首地址,即S=0x00000000,指针S从0x00000000开始,到0x00007800结束,指针S的步长是0x100,即S=S+0x100,则指针S总是指向存储块逻辑块号。判断指针S当前所指向的存储块逻辑块号是否为0xFF。如果是0xFF,则N3=N3+1。当N3=b的时候,指针S所对应的空存储块即为根据随机数b所选出的空存储块n3,并选定该空存储块n3,即为目标空存储块n3。
本实施例303,304步骤中关于随机选出的空存储块n3的过程也可以采用下述方法实现:
本方法主要通过建立空存储块列表来实现随机查找一个空存储块的目的。
3031,遍历存储器中所有的存储块,查找到目前存储器中所有空存储块。
3041,建立一个包含有查找到的所有空存储块的地址列表或所有空存储块的物理块号列表,从所述列表中随机选出一个空存储块。
在本实施例中,具体方法可为:设置指针P指向闪存存储器中物理地址最小的存储块的首地址。那么P=P+i*(0x100)就表示指向第i+1个存储块的首地址(因为每个存储块的长度为0x100字节,所以指针P总是指向每个存储块首地址)。i的值从0到0x77,共0x78个存储块,则可以通过i的值来找到一个存储块的首地址。
在内存中开辟一个数组freeblock[78]用来记录空存储块的i的值。让i的值从0遍历到0x77,判断i值所对应的存储块是否为空存储块,如果是空存储块,则将i的值记录到freeblock中。比如当前时刻,空存储块的个数为5个,对应的i值分别是0x2,0x12,0x33,0x40,0x59,那么freeblock[0]=0x2,freeblock[1]=0x12,freeblock[2]=0x33,freeblock[3]=0x 40,freeblock[4]=0x 59,产生一个1~5之间的随机数。比如这个随机数是2,那么就可以通过找freeblock数组第2个值或者第5-2个值(即找freeblock[2-1]或者找freeblock[5-2],5是空存储块的个数),从而得到一个空存储块的i值。也可以根据i值,i*0x100就是这个空存储块的首地址。所以可以在数组freeblock中直接记录空存储块的首地址,然后从中随机选出一个空存储块。
305,判断所述随机选出的空存储块是否为有记录的空存储块,如果判断的结果为是,则执行步骤306;否则,直接执行步骤307。
在本实施例中具体为:判断空存储块n3是否为有记录的空存储块。
306,擦除该有记录的空存储块中存储的数据,使该有记录的空存储块为空存储块。
307,将选出的数据存储块里的数据写入到选出的空存储块中,然后擦除选出的数据存储块里的数据。
在本实施例中具体为:将数据存储块n4中存储的数据全部读入到内存中,然后将逻辑块号(即首字节)以外的数据写入到通过305步骤随机选出的空存储块n3中,当该数据全部写完后,再将数据存储块n4的逻辑块号写入空存储块n3中,同时擦除数据存储块n4中存储的数据。即将空存储块n3变成数据存储块n3,将数据存储块n4变成空存储块n4。
本实施例提供的方案因为考虑到了有些数据存储块可能一旦被写入了长期有效的数据,就很少被执行写入操作的情况,所以在存储器通电后,采用了可以将随机选择的数据存储块里的数据转移到随机选择的空存储块中的技术方案,那么即便是数据存储块被写入长期有效的数据,仍旧可以将该数据存储块变成空存储块,使其参与到可被执行写入数据操作的场景中,取得了可以使存储块被执行写入操作的次数得到均衡的有益效果。
308,设置计数器并使该计数器的初始计数值为零,同时等待上层(如:计算机操作系统)发出写入新数据的指令。
在本实施例中具体为:在内存中申请一个变量J,用来记录修改存储器的次数,并设置J的初始值为0,然后等待上层发出的需要修改数据的指令。
每当对存储器中的存储块执行一次写入操作时,计数器则在初始值上累计加一,以便记录存储器被执行过的写入操作的次数。
309,接收到上层发来的写入新数据的指令并查找到需要修改的数据所在的数据存储块。
在本实施例中具体为:若需要修改的数据所在的数据存储块x逻辑块号为x,设置指针P指向闪存存储区物理首地址,即P=0x00000000,指针P从0x00000000开始,到0x00007800结束,P的步长是0x100,即P=P+0x100,则P总是指向存储块逻辑块号。判断P当前所指向的存储块逻辑块号是否为X。如果是,则该数据存储块为需要修改的数据所在的数据存储块x。如果不是,则P=P+0x100继续查找。
在本实施例中,也可以通过物理块号来查找到需要修改的数据所在的数据存储块,假如该需要修改得数据存储块的物理块号为Y,则令一个指针P从0x00000000开始,到0x00007800结束,P的步长是0x100,即使P=Y*0x100,P所对应的存储块即为需要修改得数据存储块。
310,统计存储器中空存储块的总数,并生成一个不大于该空存储块总数范围内的随机数。
在本实施例中具体为:在内存开辟一个变量N 2=0,设置指针P指向闪存存储区物理首地址,即P=0x00000000,指针P从0x00000000开始,到0x00007800结束,P的步长是0x100,即P=P+0x100,则P总是指向存储块逻辑块号。判断P所指向的存储块逻辑块号是否为0xFF,如果是0xFF,则使N2=N2+1。当P=0x00007800时,N2的值就是空存储块的总数。根据得到的空存储块的总数N2生成一个随机数w。随机数w的范围是1<=w<=N2。w可以是通过相关的一个函数f(w)产生的,也可以单纯的选出1<=w<=N2之间的整数。这两种方法都可以用于生成本实施例中的随机数。
311,在存储器中查找空存储块,对查找到的每一个空存储块进行计数,当计数的值与随机数相等时,选定当前查找到的空存储块,并将该空存储块作为随机选出的空存储块。
在本实施例中具体为:在内存开辟一个局部变量N5=0,设置指针Y指向闪存存储区物理首地址,即Y=0x00000000,指针Y从0x00000000开始,到0x00007800结束,指针Y的步长是0x100,即Y=Y+0x100,则指针S总是指向存储块逻辑块号。判断指针Y当前所指向的存储块逻辑块号是否为0xFF。如果是0xFF,则N5=N5+1。当N5=w的时候,指针Y所对应的空存储块即为根据随机数w所选出的空存储块n5,并选定该空存储块n5。
本实施例310,311步骤中关于随机选出的空存储块n5的过程也可以采用通过建立空存储块列表来实现随机查找一个空存储块的方法。具体的操作方法与步骤3031和3041的方法相同,在这里不在进行赘述。
312,判断随机选出的空存储块是否为有记录的空存储块,如果是,则执行步骤313;如果否,则直接执行步骤314。
313,擦除该有记录的空存储块中存储的数据,使该有记录的空存储块成为空存储块。
314,将309步骤中查找到的数据存储块中存储的数据读入内存中,保持逻辑块号不变,同时在内存中将数据区中需要修改的数据修改完,然后先将该修改完数据与数据区数据相结合生成的更新数据(不含逻辑块号)写入通过312步骤随机选出的空存储块中,再将逻辑块号写入到该空存储块中。
在本实施例中,采用了先将更新数据写入所述空存储块,后将逻辑块号写入所述空存储块的技术方案,取得了避免在写入过程中,因为发生掉电所导致写入数据不全,使该空存储块处于“有记录的空存储块”状态的有益效果,同时也使该有记录的空存储块不会错误的成为数据存储块。
315,擦除309步骤中查找到的数据存储块中存储的数据,使该数据存储块成为空存储块。
314和315步骤在本实施例中具体为:将数据存储块x的数据读入内存中,保持逻辑块号不变的同时,在内存中将数据区中需要修改的数据修改完,先将修改后数据与数据区数据结合生成的更新数据全部写入到通过步骤311查找到的空存储块n5中,再将数据存储块x逻辑块号写入到该空存储块n5中(即把空存储块n5变成数据存储块n5),同时擦除数据存储块x中存储的数据,使数据存储块x成为空存储块(即使该数据存储块的所有字节变为0xFF)。
316,对所设置的计数器的计数值上加一。
在本实施例中具体为:使J=J+1。
317,判断计数器的计数值是否达到预定次数,如果判断的结果为达到预定次数,则执行步骤318;如果判断的结果为未达到预定次数,则本次操作结束。
在本实施例中具体为:设置预设次数为30,判断J值是否等于30,如果J值等于30,则执行步骤318;否则,执行步骤324。
318,统计存储器中数据存储块的总数并随机生成一个不大于该数据存储块总数的随机数;同时统计存储器中空存储块的总数并随机生成一个不大于该空存储块总数的随机数。
在本实施例中具体方法与303步骤中的具体实施方式相同。
319,根据数据存储块总数生成的随机数在数据存储块中选出一个数据存储块;同时根据空存储块总数生成的随机数在空存储块中选出一个目标空存储块。
在本实施例中具体方法与304步骤中的具体实施方式相同。
320,判断该随机选出的空存储块是否为有记录的空存储块,如果是,则执行步骤321;如果否,则直接执行步骤322。
在本实施例中具体方法与305步骤中的具体实施方式相同。
321,擦除该有记录的空存储块中存储的数据,使该有记录的空存储块为空存储块。
在本实施例中具体方法与306步骤中的具体实施方式相同。
322,将选出的数据存储块里的数据写入到选出的空存储块中,然后擦除选出的数据存储块里的数据,使该数据存储块成为空存储块。
在本实施例中具体方法与307步骤中的具体实施方式相同。
当计数器的值到达预定次数时,说明存储器被执行的写入操作的次数已经达到了预设的次数,此时就代表了目前存储器中存在的空储块因被执行了预定次数的写入操作而受到了一定程度上的损伤。为了降低目前存在的空存储块受损程度,本实施例采用将随机选出的数据存储块中的数据转移到随机选出的空存储块中的技术方案,在降低了目前空存储块受损程度的同时也取得了可均衡各个存储块被执行写入操作次数的有益效果。
323,将计数器的计数值清零。
在本实施例中具体为:使J=0。
324,结束流程。
本实施例提供的方案,通过采用将需要修改的数据写入随机选出的空存储块的技术方案,克服了现有技术中,因为是按顺序选出空存储块而导致的容易出现对序号排在顺序较前的空存储块频繁地执行写入操作的情况,取得了可使对存储器中各个存储块均衡的执行写入操作的技术效果,提高了存储块可使用的次数,也相当于延长存储器可使用的寿命。而且在写入数据的过程中先写数据后写入逻辑块号,因而具有良好的防掉电功能。
实施例4
本实施例具体描述了一种写入数据的装置,如图4所示,该装置包括:第二判断模块401,第二随机交换模块402,接收模块403,定位模块404,选出模块405,第一判断模块408,第一清除模块409,写入模块406,擦除模块407,累计模块410,第三判断模块411,第三随机交换模块412。
第二判断模块401用于在存储器通电后,判断当前空存储块总数是否小于预设数值;第二随机交换模块402用于当前空存储块总数小于预设数值时,将随机选出的数据存储块里的数据写入随机选出的目标空存储块中,并将所述随机选出的数据存储块擦除为空存储块;接收模块403用于接收写入新数据的指令;定位模块404用于定位需要修改的数据所在的数据存储块;选出模块405用于从所有的空存储块中随机选出一个空存储块;第一判断模块408用于判断所述随机选出的数据存储块是否为有记录的空存储块;第一清除模块409用于当判断模块判断是时,将所述有记录的空存储块擦除为空存储块;写入模块406用于将所述数据与新数据结合为更新数据,将所述更新数据写入所述随机选出的空存储块中;擦除模块407用于擦除定位到的数据存储块里的数据;累计模块410用于将每次对存储块执行的写入操作的次数累计到写入操作的总次数中;第三判断模块411用于判断所述写入操作的总次数是否大于预设次数;第三随机交换模块412用于当写入操作的总次数大于预设次数时,将随机选出的数据存储块里的数据写入随机选出的目标空存储块中,并将所述随机选出的数据存储块擦除为空存储块,同时将写入操作的总次数归零。
在本实施例中,第二随机交换模块402包括:第一选出单元4021,第二选出单元4022,第二判断单元4025,第二清除单元4026,第二写入单元4023,第二擦除单元4024。
第一选出单元4021用于从所有的数据存储块中随机选出一个数据存储块;第二选出单元4022用于从所有的空存储块中随机选出一个目标空存储块;第二判断单元4025用于判断所述目标空存储块是否为有记录的空存储块;第二清除单元4026用于当第二判断单元判断是时,将有记录的空存储块擦除为空存储块;第二写入单元4023用于将所述数据存储块里的数据写入所述目标空存储块中;第二擦除单元4024用于将随机选出的数据存储块擦除为空存储块。
其中,第一选出单元4021包括:第一统计子单元40210,第一生成子单元40211,第一定位子单元40212。
第一统计子单元40210用于统计数据存储块的个数;第一生成子单元40211用于生成一个不大于所有数据存储块总数的随机数;第一定位子单元40212,用于利用所述随机数定位一个数据存储块。
特别的,本实施例的装置中第一选出单元4021可由第二查找子单元来替换;相应地,第二选出单元4022可由第二建立子单元;相应地,第二写入单元4023可由第二选出子单元来替换。
第二查找子单元用于遍历所有的存储块查找所有空存储块;第二建立子单元用于建立一个包含有查找到的所有空存储块的地址列表或所有空存储块的物理块号列表;第二选出子单元用于从所述列表中随机选出一个目标空存储块。
在本实施例中,该第二选出单元4022包括:第二统计子单元40221,第二生成子单元40222,第二定位子单元40223。
第二统计子单元40221用于统计空存储块的个数;第二生成子单元40222用于生成一个不大于所有空存储块总数的随机数;第二定位子单元40223用于利用所述随机数定位一个目标空存储块。
在本实施例中,选出模块405包括:统计单元4051,生成单元4052,定位单元4053。
统计单元4051用于统计空存储块的个数;生成单元4052用于生成一个不大于所有空存储块总数的随机数;定位单元4053用于利用所述随机数定位一个空存储块。
特别的,本实施例装置中的选出模块405的统计单元4051,生成单元4052,定位单元4053还可以用查找单元,建立单元和选出单元来代替。其中,查找单元用于遍历所有的存储块查找到所有空存储块;建立单元用于建立一个包含有查找到的所有空存储块的地址列表或所有空存储块的物理块号列表;选出单元用于从所述列表中随机选出一个空存储块。
另外本实施例装置中的定位模块404定位的数据存储块由逻辑块号和数据区数据组成,则所述需要修改的数据为数据区数据。那么相应的,写入模块406先将数据区数据与新数据结合写入所述随机选出的空存储块中,再将所述逻辑块号写入所述随机选出的空存储块中。
在本实施例中的写入模块406包括:读取单元4061,结合单元4062,写入单元4063。
读取单元4061用于将所述数据读入到内存中;结合单元4062用于在内存中将所述数据区数据与新数据结合后生成更新数据;写入单元4063用于将所述更新数据与逻辑块号写入所述随机选出的空存储块中。
本实施例中的第三随机交换模块412包括:第三选出单元4120,第四选出单元4121,第三判断单元4125,第三清除单元4126,第三写入单元4122,第三擦除单元4123,第三归零单元4124。
第三选出单元4120用于从所有的数据存储块中随机选出一个数据存储块;第四选出单元4121用于从所有的空存储块中随机选出一个目标空存储块;第三判断单元4125用于判断所述目标空存储块是否为有记录的空存储块;第三清除单元4126用于当第二判断单元判断是时,将有记录的空存储块擦除为空存储块;第三写入单元4122用于将所述数据存储块里的数据写入所述目标空存储块中;第三擦除单元4123用于将所述随机选出的数据存储块擦除为空存储块;第三归零单元4124用于将写入操作的总次数归零。
本实施例装置中的第三选出单元4120包括:第三统计子单元41200用于统计数据存储块的个数;第三生成子单元41201用于生成一个不大于所有数据存储块总数的随机数;第三定位子单元41202用于利用所述随机数定位一个数据存储块。
本实施例装置中的第四选出单元4121包括:第四统计子单元41210,第四生成子单元41211,第四定位子单元41212。
第四统计子单元41210,用于统计空存储块的个数;第四生成子单元41211,用于生成一个不大于所有空存储块总数的随机数;第四定位子单元41212,用于利用所述随机数定位一个目标空存储块。
特别的,本实施例装置中的第四选出单元4121还可以由第四查找子单元、第四建立子单元、第四选出子单元组成,其中第四查找子单元,用于遍历所有的存储块查找所有空存储块;第四建立子单元,用于建立一个包含有查找到的所有空存储块的地址列表或所有空存储块的物理块号列表;第四选出子单元,用于从所述列表中随机选出一个目标空存储块。
本发明实施例主要用在各种存储器中,例如:闪存等以便实现提高存储块可以使用的次数,同时也可以延长存储器的使用寿命。
通过以上的实施方式的描述,所属领域的技术人员可以清楚地了解到本发明可借助软件加必需的通用硬件的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在可读取的存储介质中,如计算机的软盘,硬盘或光盘等,包括若干指令用以使得一台含有存储器的终端执行本发明各个实施例的方法。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。