一种基于文件系统缓存的自适应预读取方法

文档序号:6571015阅读:205来源:国知局
专利名称:一种基于文件系统缓存的自适应预读取方法
技术领域
本发明涉及一种对磁盘进行读写搮作的方法,尤其是一种在读写过程 中,基于文件系统緩存的预读取方法。
背景技术
无论是读操作还是写操作,磁盘驱动器存取通常比内存存取慢得多。 对于一般的设备操作,当用户需要进行读写操作时,直接对磁盘进行数据 读写,这种磁盘操作方式非常慢,因此容易阻塞应用程序,同时由于没有 优化磁头,需要频繁的移动磁头,效率也很低。文件系统緩存层就是为了解决这个问题而设计的。它的基本思想是在上层用户的磁盘操作与实际 的设备操作之间添加了 一个数据緩冲区,利用这个緩冲区来实现磁盘操作 性能的优化。文件系统緩存层的主要功能有三个保存最近使用的数据块, 减少读取块设备的次数;优化写操作,减少磁头移动次数;提供预读取功能。由于上层文件系统组织文件时尽量把同 一个文件安排在连续的空间 中,因此应用程序从块设备中读取当前扇区时,邻接扇区的内容也有很大 可能下次被使用到。使用预读取功能,可以在获取当前扇区的数据时,把 邻接的指定个数的扇区数据也获取并存放在緩存区中,以免下次需要使用 这些数据时再把硬盘磁头移动到指定位置进行获取,以减少磁头移动次 数。这个功能在緩存足够大的情况下,对于多任务访问不同的连续文件时 性能有很大提高。但是,如果预读取算法使用不当,则会对性能有一定负面影响。因为 被预读取的数据并不一定^皮使用到,此时预读取的这些无用数据反而会增 加上层应用等待从磁盘获取数据的时间。并且緩存区的大小并不是无限大 的,在緩存满的情况下,需要淘汰緩存中的其它数据来存放预取的数据,因此可能发生预取的址圾数据替换了緩存中的有用数据的情况。在嵌入式文件系统中,预取操作实现得比较简单,通常是按照预先分 配的緩存区大小来确定预读取区的大小,每次进行预取搡作时从磁盘中读 取的扇区数在初始化时就已经确定好了 。这种预取操作没有复杂的算法设 计,在读取连续文件时效率很高,但是当文件比较零散时,有可能预读取 到过多的垃圾数据。发明内容本发明的目的在于提供一种基于文件系统緩存的自适应预读取管理 用以减少预读取的垃圾扇区数。本发明的技术方案包括一种基于文件系统緩存的自适应预读取方法,包括以下步骤(1) 建立预读取扇区使用记录;(2) 每次执行预读取操作时,在所述预读取扇区使用记录中,记录 预读取的扇区数;(3) 使用预读取的扇区时,在所述预读取扇区使用记录中,记录使 用的预读取扇区数;(4) 根据以前的预读取扇区数和预读取扇区的使用数,计算出以前 预读取扇区的使用率,并才艮据该使用率来确定当前预读取操作中预读取的 扇区数。进一步,上述步骤(l)中,建立N个预读取扇区使用记录,分别记 录最接近当前预读取操作的以前N次预读取操作的预读取扇区的使用情 况。进一步,所述每个记录至少包括预读取扇区数和预读取扇区使用数两 个字段,并且所述步骤(2)中,在预读取扇区数字段中,记录某次预读 取操作预读取的扇区数量;所述步骤(3)中,在预读取扇区使用数字段 中,记录对该次预读取扇区的使用数量。进一步,所述步骤(2)包括预先设定预读取扇区数的最大值,首 次执行预读取操:作时预读取的扇区数不大于该最大值。进一步,所述步骤(2)还包括将每次预读取的扇区存放在一个緩 存块中,并在緩存块控制结构中,给每个存放预读取扇区的緩存块赋予一 个索引值,记录该緩存块存放的扇区是通过哪次预读取操作预读取的;所 述步骤(3)包括在使用存放预读取扇区的緩存块时,根据所述索引值 确定所使用的扇区是通过哪次预读取操作预读取的,并在记录该次预读取 操作预读取的扇区数的记录中,记录使用的预读取扇区数。进一步,上述方法包括所述步骤(4)中,计算出每个记录中预读 取扇区使用数和预读取扇区数的比值,作为一次预读取操作预读取的扇区 的使用率;计算出N次预读取操作预读取的扇区的平均使用率,再乘以 所述预先设定的预读取扇区数的最大值,得出当前预读取操作的预读取扇 区数。上述方法中,所述步骤(1)进一步可包括每个记录还有一个权值 字段,并为每个记录分配一个权值,权值的分配原则是离当前预读取操作 越近的记录的权值越大,并且使所有权值的和为100%。进一步,所述步骤(4)中,计算出每个记录中预读取扇区使用数和 预读取扇区数的比值,并乘以该记录对应的权值,得出每次预读取操作预 读取的扇区的加权使用率;将N次预读取的扇区的加权使用率相加,并 乘以预先设定的预读取扇区数的最大值,得出当前预读取操作的预读取扇 区数。本发明所提供的方法,由于在每次预读取时都会通过前面多次预读取 数据的使用比率来确定本次预读取数据的大小,因此相比现有技术使用一 个固定预取值的算法,减少了垃圾扇区数的读取。而且本发明记录的历史 信息内叙艮少,计算逻辑简单,比较适合嵌入式系统中文件系统緩存的管 理。附困说明图l是预读取扇区使用记录的数据结构示意图; 图2是文件系统緩存块控制结构示意图; 图3是采用本发明方法的读写搡作流程图; 图4是一种离散文件的分布示意图。
具体实施方式
以下结合附图及较佳实施例,对本发明的实施方式进行较为详细的说明。本发明的方法能对基于文件系统緩存的预读取数据大小进行自适应 调整,其包括以下基本处理步骤建立预读取扇区使用记录;每次执行预读取操作时,在所述预读取数据使用记录中,记录预读取 的扇区数;使用预读取的扇区时,在所述预读取数据使用记录中,记录使用的预 读取扇区数;根据以前的预读取扇区数和预读取扇区的使用数,计算出以前预读取 扇区的使用率,并根据该使用率来确定当前预读取操作中预读取的扇区数。本发明的预读取扇区使用记录的数据结构至少包括预读取扇区数和 预读取扇区使用数两个字段。图l是预读取扇区使用记录的数据结构示意图,其中有预读取的扇区字段。图l所示的实施例中,数据结构还包括有权值(adcPreReadPower)字段。adcPreReadBlocks表示每次执行预读取操作时预读取的扇区数, adcPreReadUsedBlocks表示adcPreReadBlocks个扇区中被使用的扇区数, adcPreReadUsedBlocks与adcPreReadBlocks的比值就是预读取扇区的使用率。本发明为了使预读取的扇区数尽可能接近实际使用的扇区数量,可记 录并统计多次以前的预读取操作的预读取扇区的使用率。

图1所示的实施例中,设定预读取扇区使用记录的个数共有N个,分别记录最接近当前 预读取操作的以前N次预读取操作的预读取扇区的使用情况。上层用户创建块设备时,对块设备的控制结构进行初始化,同时对预 读取扇区使用记录的数据结构进行初始化。当有N个记录时,首先对N 个记录的数据结构进行初始化。预读取扇区4吏用记录初始化时,将adcPreReadBlocks和 adcPrcReadUsedBlocks的值都i殳置为1,即历史的预读取扇区使用率为 100%。可以为每个记录分配一个权值来表示其在总的使用率中占的比重, 权值的分配原则是离当前预取操作越近的记录的权值越大,并且N个权 值的和应为100%。如图l所示,权值共有N个,从权值l、权值2到权 值N按递减的顺序排列,指针l总是指向权值l,表示最近一次预读取操 作预读取的扇区的使用率的权值。根据文件系统緩存区的大小,设定一个 预读取的最大值MAX—READ AHEAD,首次预读取扇区的数量不大于 MAX_READAHEAD。图1中,指针2总是指向最近一次预读取扇区使用记录所在的位置。 指针2的值在0到N-1之间循环递增,达到N-1后,重新从O开始。 从磁盘中预读取块后,把预读取的扇区数填入指针2当前值加1的位置上 的记录的adcPreReadBlocks字段中,并把该记录的adcPreReadUsedBlocks 字段设置为O,然后指针2的当前值加1,使指针2继续指向最近一次预 读取数据使用记录所在的位置。在文件系统緩存的控制结构中有一个总的索引值globallndex,该值初 始化时为0,每次执行预读取操作后该值就递增1。图2是文件系统緩存块控制结构示意图,每个緩存块控制结构中都有 一个索引值index,及一个预读取属性字段bPreRead。当把该緩存块用来 存储预读取的扇区时,把globallndex赋给该緩存块控制结构的index,标 记该緩存块是在哪次预读取操作时获取的,并且把该緩存块控制结构中的预读取属性字段.bPreRead i殳为TRUE,表示该緩存块是通过预读取获取 的。图3是本发明的读写操作流程图。对于读緩存块搡作,首先判断所读 的緩存块的控制结构的bPreRead字段是否为TRUE,如果不为TRUE,表 示该緩存块不是通过预读取方式获取的,不用把该緩存块使用信息记录到 预读取扇区使用记录中;如果bPreRead字段为TRUE,还要继续判断 globallndex与緩存块控制结构中的index差值是否小于等于N,如杲大于 N,则这个緩存块的使用信息不在统计的范围之内;如果小于等于N,则 把index模上N,就可以得到该緩存块使用信息记录的位置。把该位置上 的adcPreReadUse犯locks字段加1,并把该緩存块控制结构的bPreRead 字段设为FALSE,表示该缓存块的使用信息已记录到预读取扇区使用记 录中,下次使用时不再记录。对于写緩存块操作,首先判断是否按扇区方式来写。如果是按字节方 式写,则该緩存块的使用信息与上述的读操作一样记录在预读取扇区使用 记录中;如果是按扇区边界对齐写,则该预读取的緩存块是属于预读取的 垃圾数据,把该緩存块控制结构中的bPreRead字段设为FALSE。在发起预读取搮作时,要计算本次预读取扇区的数量。 首先要计算以前预读取扇区的使用率,将该使用率乘以预先设定的预读取扇区数的最大值MAX—READ AHEAD,即得出本次预读取扇区的数量。当有N个记录时,可以计算出N个记录的预读取扇区的平均使用率 将该平均使用率乘以预先设定的预读取扇区数的最大值,即得出本次预读 取扇区的数量。为了使预读取的扇区数尽可能接近实际使用的扇区数,还可以计算出 N个记录的加权使用率adcUseRate,计算公式如下所示adcUseRate=adcPreReadUsedBlocks(i)/adcPreReadBlocks(i)* adcPreReadPower(j)其中i是从图1所示的指针2作为起始值,每次递减该值,当递减到O后再从N - 1开始递减;j是从指针1作为起始值,每次递增该值,当递 增到N - 1后再从0开始递增。按上迷公式计算N次,可得到N个使用率,N个使用率的和便是预 读取数据的加权使用率。把加权使用率乘上预先设定的预读取扇区数的最 大值MAX—READ AHEAD,就得到本次预读取的扇区数。图4所示为硬盘一段连续的空间,其中白色部分是某文件占用的空 间,上面的数字是文件的逻辑扇区号,灰色部分不属于该文件空间。图4 中的文件属于占用空间不连续的文件。采用现有技术的固定值预读取方 法,如果把预读取大小固定设为16,则每次预读取时都会读取12个扇区 的垃圾数据;采用本发明的方法,如果把MAX一READAHEAD设为16, 使用上述的自适应算法,则会慢慢收敛到合适的预读取大小,减少了垃圾 数据的读取。可见,采用本发明的自适应预读取方法,在文件内容分布离散的情况 下,可以显著减少垃圾数据的读取。而且由于计算方法简单,即使在文件 内容连续的情况下,相比使用固定预读取大小的方法,性能也不会下降。应当说明的是,上述具体实施例仅仅是为阐述本发明的方法而列举的 较佳实施方式,不应理解为对本发明的专利保护范围的限制,本发明的专 利保护范围应以所附权利要求为准。
权利要求
1. 一种基于文件系统缓存的自适应预读取方法,包括以下步骤(1)建立预读取扇区使用记录;(2)每次执行预读取操作时,在所述预读取扇区使用记录中,记录预读取的扇区数;(3)使用预读取的扇区时,在所述预读取扇区使用记录中,记录使用的预读取扇区数;(4)根据以前的预读取扇区数和预读取扇区的使用数,计算出以前预读取扇区的使用率,并根据该使用率来确定当前预读取操作中预读取的扇区数。
2. 如权利要求l所述的方法,其特征在于所述步骤(l)中,建立 N个预读取扇区使用记录,分别记录最接近当前预读取操作的以前N次 预读取操作的预读取扇区的使用情况。
3. 如权利要求2所述的方法,其特征在于所述每个记录至少包括 预读取扇区数和预读取扇区使用数两个字段。
4. 如权利要求3所述的方法,其特征在于所述步骤(2)中,在预 读取扇区数字段中,记录某次预读取操作预读取的扇区数量;所述步骤(3 ) 中,在预读取扇区使用数字段中,记录对该次预读取扇区的使用数量。
5. 如权利要求4所述的方法,其特征在于所述步骤(2)进一步包 括,预先设定预读取扇区数的最大值,首次执行预读取操作时预读取的扇 区数不大于该最大值。
6. 如权利要求4所述的方法,其特征在于所述步骤(2)进一步包 括,将每次预读取的扇区存放在一个緩存块中,并在緩存块控制结构中, 给每个存放预读取扇区的緩存块赋予一个索引值,记录该緩存块存放的扇 区是通过哪次预读取操作预读取的。
7. 如权利要求6所述的方法,其特征在于所述步骤(3)中,在使 用某个緩存块中存放的预读取扇区时,根据该緩存块的索引值确定所使用的扇区是通过哪次预读取操作预读取的,并在记录该次预读取操作预读取 的扇区数的记录中,记录使用的预读取扇区数。
8. 如权利要求7所述的方法,其特征在于所述步骤(4)中,计算 出每个记录中预读取扇区使用数和预读取扇区数的比值,作为 一次预读取 操作预读取的扇区的使用率;计算出N次预读取操作预读取的扇区的平 均使用率,再乘以所述预先设定的预读取扇区数的最大值,得出当前预读 取操作的预读取扇区数。
9. 如权利要求7所述的方法,其特征在于所述步骤(1)进一步包 括,每个记录还包括一个权值字段,并为每个记录分配一个权值,权值的 分配原则是离当前预读取操作越近的记录的权值越大,并且使所有权值的 和为100%。
10. 如权利要求9所述的方法,其特征在于所述步骤(4)中,计 算出每个记录中预读取扇区使用数和预读取扇区数的比值,并乘以该记录 对应的权值,得出每次预读取操作预读取的扇区的加权使用率;将N次 预读取的扇区的加权使用率相加,并乘以预先设定的预读取扇区数的最大 值,得出当前预读取操作的预读取扇区数。
全文摘要
一种基于文件系统缓存的自适应预读取方法,包括以下步骤(1)建立预读取扇区使用记录;(2)每次执行预读取操作时,在所述预读取扇区使用记录中,记录预读取的扇区数;(3)使用预读取的扇区时,在所述预读取扇区使用记录中,记录使用的预读取扇区数;(4)根据以前的预读取扇区数和预读取扇区的使用数,计算出以前预读取扇区的使用率,并根据该使用率来确定当前预读取操作中预读取的扇区数。
文档编号G06F17/30GK101231637SQ200710002448
公开日2008年7月30日 申请日期2007年1月22日 优先权日2007年1月22日
发明者周立超, 童小九, 陆小飞, 黄文伟 申请人:中兴通讯股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1