用于降低硬盘功耗的数据缓冲区实现方法

文档序号:6458638阅读:125来源:国知局
专利名称:用于降低硬盘功耗的数据缓冲区实现方法
技术领域
本发明适用于计算机存储系统中,利用数据缓冲区对硬盘数据进行缓存,在 多任务环境下通过缓冲区结构的创新设计降低硬盘平均功耗。
背景技术
在计算机系统中,缓冲区(Buffer)是一个应用十分广泛的技术手段。缓冲 区指用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。因 此,传统的缓冲区是为提高性能而设计。在计算机系统中,硬盘设备的功耗较高。出于节约能量的考虑, 一般来说, 硬盘都具有多种功耗状态。当硬盘空闲时则可进入低功耗状态以节约能量。硬盘 在进出低功耗状态时会产生能量损失,因此只有当硬盘的空闲时间较长时进入低 功耗状态才能真正节约能量。利用缓冲区可以对硬盘进行数据预读(Prefetch),即每次将大量数据从硬 盘读取至缓冲区。因此,在每次预读之间硬盘都会产生较长的空闲时间,即使考 虑缓冲区本身的功耗,在这段较长的时间内使硬盘进入低功耗状态也能节约相当 可观的能量。这样一来,缓冲区技术便可被用以降低硬盘的平均功耗。利用该技术降低硬盘功耗的前提是对数据进行顺序访问。然而在多任务环境 中,实际系统的数据访问并不可能以单纯的顺序方式进行①由于任务调度的影 响,多任务的访问是交错进行的;②对单个任务而言,任务有可能对硬盘数据段 进行随机访问每次访问从数据段中某个随机的位置开始,并连续访问之后的一 段数据。由于现有缓冲区技术并不保留各任务预读的内容,因此上述因素的存在 使得缓冲区的内容将被频繁更替,造成大量的硬盘访问,从而大大縮短了空闲时 间,使硬盘的功耗无法得到降低。发明内容技术问题本发明的目的是提供一种用于降低硬盘功耗的数据缓冲区设计方 法。在多任务环境下通过对缓冲区进行分块,使各任务可以在由缓冲区块组成的 不同分组中保留各自从硬盘预读的数据内容,使从硬盘读取的预读数据不会由于 任务的切换而频繁换出,具有延长硬盘空闲时间,从而降低能耗的效果。技术方案为了在多任务环境下通过缓冲区降低硬盘的功耗,应使各任务 预读的数据能够得以重用,以避免对硬盘的频繁访问。本发明将缓冲区划分为块, 在运行时对缓冲区块进行分组,使各任务在不同的分组中保留各自的预读内容。 按照数据访问的情况对缓冲区块进行状态标记,替换算法根据此标记选择合适的 块进行替换。本发明用于降低硬盘功耗的缓冲区实现方法具体为:缓冲区包括分块的数据 缓冲区、缓冲区管理模块,分块的数据缓冲区将数据传送给缓冲区管理模块,缓 冲区管理模块通过硬件设备驱动模块将状态控制与数据访问命令传送给硬盘,硬 盘再将数据传送给分块的数据缓冲区,实现用于降低硬盘功耗的缓冲区。所述的分块的数据缓冲区为:在存储器内开辟固定大小的区域作为数据缓冲 区,大小为D字节;将数据缓冲区分为固定的块数N,每块的大小相等,为S 字节,D=SXN;初始时各块中无数据,通过链表(清华大学出版社《C程序设 计》,谭浩强著)Ll相连,链表L1的每个结构体中具有两个成员,第一个存放缓冲区块编号1 N,第二个存放下一个缓冲区块在内存中的首地址。缓冲区管理模块为设有M个任务,任务通过调用硬盘驱动提供的接口函数FD获取所需数据;缓冲区管理模块给出与硬盘驱动接口函数FD具有同名、 同参数与同返回值的函数FM,在任务代码中将硬盘接口函数FD替换为缓冲区 管理模块提供的函数FM;函数FM实现如下从任务对硬盘数据访问的请求首 地址开始,从硬盘预读出长度为SXN/M字节数据,并通过替换算法R从所有 缓冲区块中选择用于存放该数据的缓冲区块;将这些缓冲区块通过链表L2进行 连接,连接后的缓冲区块称为分组,即将属于不同任务的缓冲区块各自通过链表 L2进行连接;任务调用函数FM对硬盘进行数据读取时,若数据己存在于缓冲 区块中,缓冲区管理模块通过链表L2在各缓冲区块中査找数据并送达发起请求 的任务;当每次预读完毕后缓冲区管理模块向硬盘发出命令使其进入低功耗模 式。所述的替换算法R为为缓冲区块1 N确定不同的状态,这些状态包括缓冲区块空闲 (BLK—IDLE),缓冲区块在用(BLK—INUSE),缓冲区块已用(BLK—USED),缓冲区 块未用(BLKJJNUSE);缓冲区块空闲表示缓冲区块中尚未读入任何数据;缓冲区 块在用表示缓冲区块中的数据正在被读取;缓冲区块已用表示缓冲区块中最后一 个字节的数据已被读取;缓冲区块未用表示缓冲区块已存在于分组中但尚未被读 取;替换算法通过链表L2顺序査询各分组中缓冲区块的状态,若存在状态为缓 冲区块空闲的缓冲区块,则将数据读入该块;若不存在状态为缓冲区块空闲的缓 冲区块,则查询是否存在状态为缓冲区块已用的缓冲区块,如存在则将数据读入 该缓冲区块;若状态为缓冲区块已用的缓冲区块也不存在,则査询是否存在状态 为缓冲区块未用的缓冲区块,如存在则将数据读入该缓冲区块;若缓冲区块空闲, 缓冲区块已用,缓冲区块未用三种状态的缓冲区块都不存在,则将数据读入缓冲 区块在用的缓冲区块。若在查询过程中发现具有状态一样的多个缓冲区块,则选 择第一个査询到的。有益效果本发明对缓冲区进行逻辑分组,以使各访问硬盘的任务能拥有 各自的数据缓冲区。本发明无需增加任何硬件电路,计算与存储资源的开销极小, 在多任务环境下大幅减少了对硬盘产生的数据访问请求,并延长了硬盘的空闲时 间,使硬盘可以在更长的时间内进入低功耗状态以节约能量。实验结果表明,在 多媒体播放应用环境下,硬盘数据访问的功耗得到了大幅降低。


图1是本发明基于缓冲区动态分组的硬盘低功耗方案设计架构的基本结构 图。图中实线箭头表示数据请求与控制命令,虚线箭头表示数据。缓冲区管理模 块接收任务对硬盘产生的数据访问请求,通过硬盘设备驱动从硬盘将数据预读进 缓冲区,并将任务所需数据提交给发起请求的任务;当每次预读结束后,缓冲区 管理模块对数据缓冲区分组数据结构进行更新并通过硬盘设备驱动将硬盘置于 低功耗状态。图2是用于连接无数据的缓冲区块的链表Ll的结构。链表Ll的每个结构 体中具有两个成员,第一个存放缓冲区块编号1 N,第二个存放下一个缓冲区 块在内存中的首地址。该链表通过下一个缓冲区的首地址寻找下一个缓冲区块。图3说明了用于连接缓冲区分组的链表L2。实线框代表缓冲区块(Block),其中的数字为Block编号虚线框表示缓冲区组(Group),其中的各Block存储 着地址连续的硬盘数据,每个组的数据属于同一个任务。各组中的缓冲区块通过 与链表LI相同的链表结构相连,各组间通过链表L2相连。链表L2的每个结构 体中具有两个成员,第一个存放组编号,第二个存放下个组中的第一个缓冲区块
的首地址。
图4为缓冲区管理模块的实现流程图。缓冲区管理模块为本发明的核心模 块,图4描述了该模块的详细工作流程。
具体实施例方式
该缓冲区包括分块的数据缓冲区、缓冲区管理模块,分块的数据缓冲区将数 据传送给缓冲区管理模块,缓冲区管理模块通过硬件设备驱动模块将状态控制与 数据访问命令传送给硬盘,硬盘再将数据传送给分块的数据缓冲区,实现用于降 低硬盘功耗的缓冲区。
缓冲区按照图3所示结构进行组织。缓冲区的块大小可根据系统实际情况确 定,总块数M为各任务每次预读块数之和(各任务预读块数可根据任务情况确 定)。如图3所示,实线箭头表示缓冲区的组结构通过链表实现,该链表为二级 链表。各缓冲区组中第一个块的首地址通过第一级链表相连,每个组内的各块首 地址通过第二级链表相连。
缓冲区管理模块在应用层与驱动层之间实现。该模块向任务提供硬盘数据访 问的接口函数,以屏蔽下层实现。通过该接口,任务告知缓冲区管理模块要访问 数据的起始地址与长度,任务每次调用数据访问接口即产生数据请求。此时,缓 冲区管理模块按照图4的流程运行。该模块通过调用硬盘设备驱动的接口函数完 成数据操作与状态控制。该模块对数据块的查找通过遍历图3所示的二级链表完 成。
所述的分块的数据缓冲区为:在存储器内开辟固定大小的区域作为数据缓冲 区,大小为D字节;将数据缓冲区分为固定的块数N,每块的大小相等,为S 字节,D=SXN;初始时各块中无数据,通过链表L1相连,链表L1的每个结构 体中具有两个成员,第一个存放缓冲区块编号1 N,第二个存放下一个缓冲区 块在内存中的首地址。
所述的缓冲区管理模块为设有M个任务,任务通过调用硬盘驱动提供的接口函数FD获取所需数据;缓冲区管理模块给出与硬盘驱动接口函数FD具有 同名、同参数与同返回值的函数FM,在任务代码中将硬盘接口函数FD替换为 缓冲区管理模块提供的函数FM;函数FM实现如下从任务对硬盘数据访问的 请求首地址开始,从硬盘预读出长度为SXN/M字节数据,并通过替换算法R 从所有缓冲区块中选择用于存放该数据的缓冲区块;将这些缓冲区块通过链表 L2进行连接,连接后的缓冲区块称为分组,即将属于不同任务的缓冲区块各自 通过链表L2进行连接;任务调用函数FM对硬盘进行数据读取时,若数据已存 在于缓冲区块中,缓冲区管理模块通过链表L2在各缓冲区块中查找数据并送达 发起请求的任务;当每次预读完毕后缓冲区管理模块向硬盘发出命令使其进入低 功耗模式。
在替换算法中,将Block划分为不同的状态,这些状态包括BLK一IDLE, BLK—INUSE, BLK—USED, BLK—UNUSE。 BLK—IDLE表示Block中尚未读入任何数据; BLK—INUSE表示Block中的数据正在被使用,BLK—USED表示Block中最后一个字 节的数据已被访问(表征对该Block访问完毕),二者关系密切任何访问Block 的任务都会将该Block状态设为BLK一INUSE并将SHARE一NUM值加1 (SHARE_NUM 表示访问该Block的任务数,初始值为0),当该任务访问完Block中的最后一 个数据时将SHARE—NUM值减1并査看该值,若不为0 (表明仍有任务在访问该 Block)则维持BLK—INUSE状态不变,为0 (表明之前访问该Block的任务都已 访问完毕)则设置Block状态为BLK—USED;BLKJ)NUSE表示Block已存在于Group 中但尚未被任务访问。替换算法通过图3中的二级链表结构顺序査询各Group 中Block的属性,按照BLKjDLE, BLK一USED, BLK一UNUSE, BLK_INUSE的优先级 (由高到低)选择Block用于替换,若多个Block状态一样则选择第一个搜索到 的。由对状态含义的分析可知,状态为BLK—USED, BLK—UNUSE, BLK—INUSE的Block 将来被使用的概率依次升高,因此该替换算法可以带来较少的Block更新次数。
权利要求
1.一种用于降低硬盘功耗的缓冲区实现方法,其特征在于该缓冲区包括分块的数据缓冲区、缓冲区管理模块,分块的数据缓冲区将数据传送给缓冲区管理模块,缓冲区管理模块通过硬件设备驱动模块将状态控制与数据访问命令传送给硬盘,硬盘再将数据传送给分块的数据缓冲区,实现用于降低硬盘功耗的缓冲区。
2. 根据权利要求1所述的用于降低硬盘功耗的缓冲区实现方法,其特征为 所述的分块的数据缓冲区为在存储器内开辟固定大小的区域作为数据缓冲区, 大小为D字节;将数据缓冲区分为固定的块数N,每块的大小相等,为S字节,D-SXN;初始时各块中无数据,通过链表L1相连,链表L1的每个结构体中具 有两个成员,第一个存放缓冲区块编号1 N,第二个存放下一个缓冲区块在内存中的首地址。
3. 根据权利要求1所述的用于降低硬盘功耗的缓冲区实现方法,其特征为 所述的缓冲区管理模块为设有M个任务,任务通过调用硬盘驱动提供的接口 函数FD获取所需数据;缓冲区管理模块给出与硬盘驱动接口函数FD具有同名、 同参数与同返回值的函数FM,在任务代码中将硬盘接口函数FD替换为缓冲区 管理模块提供的函数FM;函数FM实现如下从任务对硬盘数据访问的请求首 地址开始,从硬盘预读出长度为SXN/M字节数据,并通过替换算法R从所有 缓冲区块中选择用于存放该数据的缓冲区块;将这些缓冲区块通过链表L2进行 连接,连接后的缓冲区块称为分组,即将属于不同任务的缓冲区块各自通过链表 L2进行连接;任务调用函数FM对硬盘进行数据读取时,若数据已存在于缓冲 区块中,缓冲区管理模块通过链表L2在各缓冲区块中査找数据并送达发起请求 的任务;当每次预读完毕后缓冲区管理模块向硬盘发出命令使其进入低功耗模式。
4. 根据权利要求1所述的用于降低硬盘功耗的缓冲区实现方法,其特征为所述的替换算法R为为缓冲区块1 N确定不同的状态,这些状态包括缓冲区块空闲,缓冲区 块在用,缓冲区块已用,缓冲区块未用;缓冲区块空闲表示缓冲区块中尚未读入 任何数据;缓冲区块在用表示缓冲区块中的数据正在被读取;缓冲区块已用表示缓冲区块中最后一个字节的数据已被读取;缓冲区块未用表示缓冲区块己存在于 分组中但尚未被读取;替换算法通过链表L2顺序査询各分组中缓冲区块的状态, 若存在状态为缓冲区块空闲的缓冲区块,则将数据读入该块;若不存在状态为缓 冲区块空闲的缓冲区块,则查询是否存在状态为缓冲区块已用的缓冲区块,如存 在则将数据读入该缓冲区块;若状态为缓冲区块已用的缓冲区块也不存在,则查 询是否存在状态为缓冲区块未用的缓冲区块,如存在则将数据读入该缓冲区块; 若缓冲区块空闲,缓冲区块已用,缓冲区块未用三种状态的缓冲区块都不存在, 则将数据读入缓冲区块在用的缓冲区块。若在査询过程中发现具有状态一样的多 个缓冲区块,则选择第一个査询到的。
全文摘要
用于降低硬盘功耗的数据缓冲区实现方法适用于计算机存储系统中,利用数据缓冲区对硬盘数据进行缓存,在多任务环境下通过缓冲区结构的创新设计降低硬盘平均功耗。该缓冲区包括分块的数据缓冲区、缓冲区管理模块,分块的数据缓冲区将数据传送给缓冲区管理模块,缓冲区管理模块通过硬件设备驱动模块将状态控制与数据访问命令传送给硬盘,硬盘再将数据传送给分块的数据缓冲区,实现用于降低硬盘功耗的缓冲区。一方面根据多任务的数据访问速率提出带来功耗最优的缓冲区分组大小的确定方法,另一方面提出考虑任务数据访问情况的数据块替换算法,进一步延长硬盘访问的空闲时间。
文档编号G06F1/32GK101221465SQ20081001934
公开日2008年7月16日 申请日期2008年1月4日 优先权日2008年1月4日
发明者戚隆宁, 晨 胡, 黄少珉 申请人:东南大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1