[0063] 为了使本领域技术人员更好地理解本发明的技术方案,下面将结合附图以及具体的实施方式,对本发明进行详细地介绍说明。
[0064] 为了对发明进一步详细说明,首先需要给出本发明相关概念的定义:
[0065] 缓存数据页:缓存的基本读写单位,与闪存的物理页大小一致。
[0066] 缓存数据块:由数据请求页地址对物理块大小进行除法运算,得到商一致的数据页组成的集合,该数据块的最大包含页数和底层物理块的包含物理页数一致。
[0067] 逻辑页地址:主机I/O请求P按照其文件系统的标识的逻辑地址编号(Logical Page Number,LPN)。
[0068] 逻辑块号:也是缓存数据块的编号(Block Number,BlkNum),指定请求P的BlkNum为其LPN除以数据块最大页数得到的商。
[0069] 本发明提出的一种置换和回写自适应的缓冲区管理方法,将缓存划分为三个部分:缓存块记录表,写缓冲区(Write Buffer)和读缓冲区(Read Buffer)。
[0070] 缓存块记录表用来记录同属于一个数据块的不同数据页在缓冲区的位置和状态。缓存块记录表通过记录不同数据页的位置指针,加速了请求数据页的查询,更新,回写的操作。
[0071] 如图1所示,缓存块记录表中,记录块的信息具体包括:当前的缓存块编号BlkNum,当前缓冲区中同属该记录块的数据页个数BlkSize,同属该记录块的干净页位置指针列表C-list-index,同属该记录块的脏页位置指针列表D-list-index。所述的缓存块的大小和实际底层的物理块大小一致,即包含的数据页个数相同,其大小值为BlkMaxSize。对应数据页的逻辑页地址(Logical Page Number,LPN)除BlkMaxSize,所得结果记为其所属的缓存块的编号,相应的余数为其缓存块的偏移量。
[0072] 写缓冲区用于缓存响应写请求后发生修改后的数据页(脏页),该缓冲区的数据页依据LRU原则形成队列进行管理;同时该缓冲区内的数据页又分冷热,前半部分的数据页为热页,后半部的数据页为冷页。
[0073] 读缓冲区用于缓存仅响应读请求未发生修改的数据页(干净页),该缓冲区的数据页同样采用LRU队列管理。该缓冲区中的数据页响应写请求后将被迁入写缓冲区,同样写缓冲区的热数据页发生回写也会被迁入读缓冲区中。
[0074] 如图2所示,读写缓冲区的队列结构中,两种缓冲区的队列大小会因为在置换过程中动态选择置换对象而发生变化。
[0075] 对读写缓冲区的命中情况,底层读写延迟,缓冲区回写次数,底层数据页更新写次数进行周期的统计。
[0076] 将固定观察周期内的写缓冲区的读命中统计变量记为DRH,写缓冲区的写命中统计变量记为DWH;读缓冲区的读命中统计变量记为CRH,读缓冲区的写命中统计变量记为CWH;该周期内缓存区回写次数记为Bw,该周期内闪存写操作次数记为Fw;该周期内写延迟记为WriteDelay,读延迟记为ReadDelay。
[0077] 在选择写缓冲区的数据页作为置换对象并回写入闪存时,将触发自适应聚簇回写机制。
[0078] 如图3所示,自适应聚簇回写机制中,由置换数据页确定回写缓存块,借助该缓存块记录中的D-list-index的记录信息确定回写的脏页集合同时识别保留热脏页。在聚簇回写过程中,根据当前的写入放大系数动态选择是否采用页填充。其操作流程如下:
[0079] S61,选择写缓冲区LRU位置的数据页V作为剔除对象,并查询该数据页对应的缓存记录块中D-list-index信息,之后执行S62。
[0080] S62,依次读取D-list-index的位置指针指向的数据页,并根据位于缓存队列前半部分为热数据的原则,对这些数据页进行判断,并将判别为热的数据页加入保留集合Ф,之后执行S63。
[0081] S63,计算当前回写阈值 其中, 之后执行S64。
[0082] S64,计算填补页数E=BlkMaxSize-N,N为当前记录块在写缓冲区中的数据页个数,之后比较比较E和Th的大小;若E≤Th,则执行S65;否则,执行S66。
[0083] S65,启用页填充,从底层闪存中读取E个填补页和回写的脏页组成整个数据块回写入底层闪存,之后执行S67。
[0084] S66,不启用页填充,将D-list-index中的脏页全部回写入底层闪存,执行S67。
[0085] S67,将集合Ф中的数据页全部移入到读缓冲区,同时删除原数据块的缓存块记录表中的D-list-index的位置信息,同时将转移后的新位置指针存入C-list-index,最后结束本次聚簇回写操作。
[0086] 本发明提出的管理方法中,在置换数据页时,通过比较阈值Tau(当前目标读缓冲区大小)和当前读缓冲区大小,选择置换缓冲对象。其阈值Tau会综合当前读写缓冲区的命中情况和底层的读写延迟,进行周期性的调整,阈值调整机制如图4所示,流程如下:
[0087] S81,判断当前请求是否为命中,若是,则执行S82,否则,执行S83;
[0088] S82,判断请求类型和命中区域,若读缓冲区读命中,则CRH加1;若读缓冲区写命中,则CWH加1;若写缓冲区读命中,则DRH加1;若写缓冲区写命中,则CRH加1;最后执行S83;
[0089] S83,更新当前的TCount,即TCount=TCount+1,同时更新统计值Bw和统计值Fw,之后执行S84;
[0090] S84,判断TCount是否达到阈值更新周期CycleTime,若是,则执行S85,否则,结束本次阈值更新操作;
[0091] 其中,CRH为读缓冲区的读命中统计变量,CWH为读缓冲区的写命中统计变量;DRH为写缓冲区的读命中统计变量,DWH为写缓冲区的写命中统计变量;TCount为当前请求操作计数;CycleTime为阈值更新周期;
[0092] S85,计算目标写缓冲区单位增益DR,目标读缓冲区单位增益CR:
[0093]
[0094] 其中BufSize为读写总缓冲区的大小,Tau’为更新前的阈值,
[0095] Cr,Cw为归一计算得到读写时延代价系数:
[0096]
[0097] 其中,ReadDelay和WriteDelay分别为周期内读延迟和写延迟;之后执行S86。
[0098] S86,更新阈值Tau:
[0099]
[0100] 同时更新周期缓冲区回写次数统计值Bw=0,周期闪存写操作次数统计值Fw=0,周期计数值TCount=1,最后结束阈值Tau的本次更新操作。
[0101] 如图5所示,本发明的请求处理总流程,包含如下步骤:
[0102] S1,当一个请求P到达时,根据请求P的LPN号换算找到对应的缓存块编号pBlkNum,查询缓存块记录表中是否存在该缓存块编号,若存在,则执行S2,否则,执行S4;
[0103] S2,遍历该缓存块记录表项中的位置指针,查询请求P是否存在缓冲区中,若是,则执行S3,否则,执行S5;
[0104] S3,判读请求数据页所在缓冲区位置,将命中的数据页移动至对应缓冲区的MRU位置,同时更新对应缓存块记录表项中的位置指针列表,将旧的指向该数据页的指针剔除,将指向该数据页位置的新指针存入;之后执行S8;
[0105] S4,向缓存块记录表中添加编号pBlkNum缓存块表项信息,初始化该表项的BlkNum=pBlkNum,BlkSize=0,D-list-index和C-list-index为空,之后执行S5;
[0106] S5,判断当前缓冲区是否满,若满,则执行S6,否则执行S7;
[0107] S6,比较当前的读缓冲区大小和阈值Tau的大小,若大于,则选择读缓冲区的LRU位置的数据页进行剔除;否则,选择写缓冲区的LRU位置的数据页作为置换缓冲区,并执行自适应聚簇回写机制;从C-list-index或D-list-index列表中找到指向该剔除数据页的旧位置指针并剔除,并更新对应的记录块的BlkSize=BlkSize-1;之后,执行S7;
[0108] S7,将缺失的请求数据页从闪存读入缓冲区,同时判读其请求类型;若为读请求,则将数据页加载到读缓冲区中,同时将指向该数据页的位置的指针存入缓存块记录的C-list-index中;否则将数据页加载到写缓冲区,同时将位置指针存入对应缓存块记录的D-list-index中;之后更新缓存记录表中的BlkSize=BlkSize+1,之后,执行S8;
[0109] S8,启动周期阈值Tau,对阈值Tau进行周期调整,最后,结束本次请求的处理。
[0110] 所述步骤S3中,更新对应缓存块记录表中的位置指针列表具体为:
[0111] S31,判读请求数据页所在缓冲区位置,若为写缓冲区,则执行S32;若为读缓冲区,则执行S33;
[0112] S32,将命中的数据页移动至写缓冲区的MRU位置,同时更新对应缓存块记录表项中的D-list-index,将旧的指向该数据页的指针剔除,将指向该数据页位置的新指针存入D-list-index;之后执行S8;
[0113] S33,将命中的数据页移至读缓冲区的MRU位置,同时更新相应的C-list-index,将旧的指向该数据页的指针剔除,将新的位置指针存入C-list-index;之后执行S8。
[0114] 为了对本发明的管理方法的处理流程进行进一步说明,结合具体的一组实际请求处理实例进行说明,该实例处理过程如图6所示。
[0115] 在本实例中,数据块大小为4个数据页,缓冲区的大小为10个数据页,读写延迟时延比固定为W/R=4/1,写入放大系数恒定为W=1.5,阈值更新周期为10,当前的周期计数值TCount=1,阈值Tau初始值为5.
[0116] 在本实例中,请求序列如图6中所示,由请求的逻辑地址和请求类型构成,例如(R,20),表示一个访问数据页LPN为20的读请求。
[0117] 在本实例中,针对第一个请求(R,20)的处理流程:
[0118] C1,根据LPN换算得到缓存块号pBlkNum=20/4=5,查询缓存块记录表中是否存在该缓存块号的记录信息。
[0119] C2,不存在该缓存块的信息,加载pBlkNum=5的记录表项到缓存块记录表中,同时更新表项的块编号BlkNum=5,BlkSize=0,C-list-index和D-list-index为空。
[0120] C3,加载请求页入缓冲区,发现缓冲区满,比对读缓冲区大小RL(4)和当前阈值Tau(5),选择写缓冲区LRU位置LPN=13作为置换对象。
[0121] C4,置换页(LPN=13)属于缓存块VBlkNum=13/4=3,属于该缓存块的脏页LPN=14为热需要进行保留,当前的回写阈值 取整为2,填补页为2,选择整块回写,且读缓冲区包含其余数据页,不需要额外的读取操作,直接整块回写即可。
[0122] C5,将VBlkNum=3缓存块中的D-list-index置空,将LPN=14的数据页移入读缓冲区队列的尾部,并将指向该数据页的位置指针存入C-list-index中
[0123] C6,将请求载入缓冲区,判断该请求为读类型,将LPN=20的数据页载入到读缓冲区的MRU位置,并将该位置指针存入到pBlkNum=20/4=5的C-list-index,同时更新其BlkSize=1
[0124] C7,启动周期阈值Tau更新,因为未命中请求,故周期计数值TCount累加变为2,判断TCount小于更新周期CycleTime,所以直接结束更新调整,结束本次请求的操作。
[0125] 在本实例中,针对第二个请求(W,1)的处理流程:
[0126] C8,根据LPN换算得到缓存块号pBlkNum=1/4=0,查询缓存块记录表中是否存在该缓存块号的记录信息。
[0127] C9,遍历该缓存块C-list-index发现存在LPN=1的数据页位于读缓冲区中[0128] C10,判断请求的类型为写请求,则将该数据页从读缓冲区移入到写缓冲区的MRU位置,同时清除C-list-index的位置指针,将有关该数据页新的位置指针存入该缓存块记录表的D-list-index中
[0129] C11,启动周期阈值Tau更新,因为是读缓冲区写命中,故统计值CWH累加,之后周期计数值TCount累加变为3,又未达到更新周期结束调整,结束本次请求的操作。
[0130] 以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。