首页> 中国专利> 在用户空间文件系统上实现聚合写文件脏页的方法和装置

在用户空间文件系统上实现聚合写文件脏页的方法和装置

摘要

本发明公开了一种在用户空间文件系统(fuse)上实现聚合写文件脏页的方法,fuse获取脏页数组;检查脏页数组中连续的脏页,将连续的脏页通过一个fuse消息传递给用户态文件系统的守护进程;本发明同时还公开了一种在fuse上实现聚合写文件脏页的装置,通过本发明的方案,能够减少fuse消息数量,节省系统的CPU资源,提高传输效率。

著录项

  • 公开/公告号CN102360369A

    专利类型发明专利

  • 公开/公告日2012-02-22

    原文格式PDF

  • 申请/专利权人 中兴通讯股份有限公司;

    申请/专利号CN201110302148.7

  • 发明设计人 何抗洪;程宁;朱鹏;

    申请日2011-09-28

  • 分类号G06F17/30;

  • 代理机构北京派特恩知识产权代理事务所(普通合伙);

  • 代理人张颖玲

  • 地址 518057 广东省深圳市南山区高新技术产业园科技南路中兴通讯大厦法务部

  • 入库时间 2023-12-18 04:34:25

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2014-08-13

    授权

    授权

  • 2012-04-04

    实质审查的生效 IPC(主分类):G06F17/30 申请日:20110928

    实质审查的生效

  • 2012-02-22

    公开

    公开

说明书

技术领域

本发明涉及Linux操作系统的文件访问技术,尤其涉及一种在用户空间文 件系统(fuse,filesystem in usese space)上实现聚合写文件脏页的方法和装置。

背景技术

在基于Linux操作系统实现的用户态分布式文件系统应用中,需要向用户 提供通常的标准的文件访问接口。用户不需要知道底层是本地文件系统还是分 布式文件系统,都可以通过文件系统挂载点以统一的方式访问。这通常是由用 户态文件系统模块fuse来实现的。fuse驻留在Linux内核,接收用户进程的文 件访问消息,封装成fuse消息传递给用户态文件系统的守护进程。

目前的fuse实现基本满足了一般应用的功能性需求,但难以满足企业级、 电信级分布式文件系统的性能需求,尤其在以内存映射方式(mmap)大批量写 文件数据的时候。在用内存映射方式写文件数据时,用户进程首先打开一个文 件,然后把文件空间映射到内存地址空间,接着向内存地址空间写入数据,最 后解除映射和关闭文件。写入的数据首先存储在Linux内核的页缓存里。Linux 系统会自动把更改过的数据页标记为脏页。在解除内存映射关闭文件时调用页 写(writepage)函数把每个脏页封装成一个fuse消息传送给用户态文件系统守 护进程。

在这种方式下,每一页大小的数据就会产生一个fuse消息。在Linux上, 一个页一般是4KB大小。在写几十MB以上的大文件的时候,会产生非常多的 fuse消息,增加了每次消息交互产生的附加代价,极大地消耗系统的中央处理 器(CPU)资源,传输效率极为低下。

发明内容

有鉴于此,本发明的主要目的在于提供一种在fuse上实现聚合写文件脏页 的方法和装置,减少fuse消息数量,节省系统的CPU资源,提高传输效率。

为达到上述目的,本发明的技术方案是这样实现的:

一种在用户空间文件系统(fuse)上实现聚合写文件脏页的方法,包括:fuse 获取脏页数组;检查脏页数组中连续的脏页,将连续的脏页通过一个fuse消息 传递给用户态文件系统的守护进程。

所述fuse获取脏页数组为:定义原型为页写函数(writepages)的函数 fuse_writepages,函数fuse_writepages根据输入参数,确定文件写的起始页号和 结束页号;清除文件写完成标识,调用查找函数(pagevec_lookup_tag),并输 入起始页号和结束页号,将带有脏页标志PAGEE_TAG_DCACHIRTY的页,按 页号从小到大的顺序组成脏页数组存储在脏页存储数组(pvec)中。

所述检查脏页数组中连续的脏页,将连续的脏页通过一个fuse消息传递给 用户态文件系统的守护进程为:fuse依次检查脏页数组中的每一页,根据脏页 数组中第一个脏页的页号设置连续号变量,并在将第一个脏页的页地址加入到 fuse消息的页数组中之后,通过连续号变量确定与第一个脏页连续的脏页,将 确定的连续的脏页也加入到所述fuse消息的页数组中,通过所述fuse消息将所 述页数组传递给用户态文件系统的守护进程。

所述方法进一步包括:预先设置最大脏页数,当fuse消息的页数组中脏页 页数达到最大脏页数时,不再继续确定连续脏页,将该fuse消息传递给用户态 文件系统的守护进程。

一种在fuse上实现聚合写文件脏页的装置,包括:获取模块、检查模块、 传递模块;其中,

获取模块,用于获取脏页数组;

检查模块,用于检查脏页数组中连续的脏页,将连续的脏页发送到传递模 块;

传递模块,用于将连续的脏页通过一个fuse消息传递给用户态文件系统的 守护进程。

所述获取模块,具体用于定义原型为writepages的函数fuse_writepages,函 数fuse_writepages根据输入参数wbc,确定文件写的起始页号和结束页号;清 除文件写完成标识,调用pagevec_lookup_tag函数,并输入起始页号和结束页 号,将带有脏页标志PAGEE_TAG_DCACHIRTY的页,按页号从小到大的顺序 组成脏页数组存储在pvec中。

所述检查模块,具体用于依次检查脏页数组中的每一页,根据脏页数组中 第一个脏页的页号设置连续号变量,并将第一个脏页的页地址通知传递模块, 通过连续号变量确定与第一个脏页连续的脏页,将确定的连续的脏页的页地址 通知传递模块。

所述传递模块,具体用于将所述检查模块通知的脏页的页地址加入到fuse 消息的页数组中,通过所述fuse消息将所述页数组传递给用户态文件系统的守 护进程。

所述传递模块,进一步用于设置最大脏页数,当fuse消息的页数组中脏页 页数达到最大脏页数时,通知检查模块不再继续确定连续脏页,将所述fuse消 息传递给用户态文件系统的守护进程。

本发明提供了一种在fuse上实现聚合写文件脏页的方法和装置,fuse获取 脏页数组;检查脏页数组中连续的脏页,将连续的脏页通过一个fuse消息传递 给用户态文件系统的守护进程;如此,能够减少fuse消息数量,节省系统的CPU 资源,提高传输效率。

附图说明

图1为本发明在fuse上实现聚合写文件脏页的方法的流程示意图;

图2为本发明在fuse上实现聚合写文件脏页的方法中,步骤102的实例示 意图;

图3为本发明在fuse上实现聚合写文件脏页的装置的结构示意图。

具体实施方式

本发明的基本思想是:fuse获取脏页数组;检查脏页数组中连续的脏页, 将连续的脏页通过一个fuse消息传递给用户态文件系统的守护进程。

下面通过附图及具体实施例对本发明做进一步的详细说明。

本发明实现一种在fuse上实现聚合写文件脏页的方法,如图1所示,该方 法包括以下几个步骤:

步骤101:fuse获取脏页数组;

具体的,在类型为address_space_operations的结构体fuse_file_aops添加成 员赋值语句:.writepages=fuse_writepages;

定义原型为writepages的函数fuse_writepages,其输入参数为:

mapping:要操作的文件的地址空间结构address_space;

wbc:写回控制结构writeback_control;

函数fuse_writepages根据输入参数wbc,确定文件写的起始页号index和 结束页号end;清除文件写完成标识,调用查找函数(pagevec_lookup_tag),并 输入起始页号index和结束页号end,将带有脏页标志 PAGEE_TAG_DCACHIRTY的页,按页号从小到大的顺序组成脏页数组存储在 脏页存储数组(pvec,dirty page vector)中。

步骤102:fuse检查脏页数组中连续的脏页,将连续的脏页通过一个fuse 消息传递给用户态文件系统的守护进程;

具体的,fuse根据脏页数组中第一个脏页的页号设置连续号变量,并在将 第一个脏页的页地址加入到fuse消息的页数组中之后,通过连续号变量确定与 第一个脏页连续的脏页,将确定的连续的脏页也加入到fuse消息的页数组中, 通过所述fuse消息将所述页数组传递给用户态文件系统的守护进程;

下面对本步骤的流程进行详细描述:

fuse调用fuse_get_req函数申请一个req消息对象,设置其属性 in.argpages=1,page_offset=0;设置连续号变量seq为pvec.pages[0]->indexf-1, 其中indexf为脏页数组中的第一个脏页的页号,脏页数组中最后一页的页号用 endf表示;从pvec.pages[0]开始依次检查pvec中脏页数组的每一页,对检查的 当前页做下列操作:

a、判断页号是否大于endf,如果大于endf,则设置文件写完成标识,执行 步骤h;否则执行步骤b;

b、调用lock_page锁住当前页,根据是否有脏页标志 PAGEE_TAG_DCACHIRTY判断当前页是否已不是脏页,如果已不是脏页,解 除锁定当前页并执行步骤h;否则执行步骤c;

c、判断当前页指向的地址空间是否是当前地址空间,如果不是,则解除锁 定当前页并执行步骤h;否则执行步骤d;

d、判断当前页是否处于写回状态,如果是,则解除锁定当前页并执行步骤 h;否则执行步骤e;

e、判断当前页的页号是否等于连续号变量seq+1,如果不等于,则解除锁 定当前页并执行步骤h;否则执行步骤f;

f、调用clear_page_dirty_for_io函数清除当前页的脏页标志 PAGEE_TAG_DCACHIRTY;如果清除失败,则解除锁定当前页并执行步骤h; 否则执行步骤g;

g、调用page_cache_get增加当前页的缓存计数,调用set_page_writeback 函数为当前页设置页写回状态,并填写页地址到req的页数组,增加req的页数, 获取脏页数组中的下一页,执行步骤a;

h、判断req的页数是否大于0,如果大于0,则调用fuse_send_writepages 函数将req的页数组中的脏页通过req消息传递给用户态文件系统的守护进程, 执行步骤i;否则直接执行步骤i;

步骤h中,在req的页数大于1时,说明req的页数组中的一个以上脏页是 连续的,这样就能够通过一个req消息传递多个脏页。

i、调用pagevec_releasse函数释放pvec,调用cond_resched函数,重新执 行步骤101。

步骤102中,进一步包括:预先设置最大脏页数,用于限制一个fuse消息 传递的连续脏页的数量,即当fuse消息的页数组中脏页页数达到最大脏页数时, 不再继续确定连续脏页,将该fuse消息传递给用户态文件系统的守护进程,如: 在步骤g中所述增加req的页数之后,判断req的页数是否等于最大脏页数,如 果的等于,则执行步骤h,如果不等于,再获取脏页数组中的下一页,执行步 骤a。

下面通过一个具体实例来说明本步骤。

如图2所示,文件的地址空间(addressspace)的当前脏页数组中有6个脏 页,页号分别为1、2、3、6、9、10。如果用现有的方法,当写回该文件时, 会对每个脏页生成一个req消息,共6个req消息。

应用步骤102的方法,能够确定出页号为1、2、3的脏页连续,可以生成 一个req消息Req1,将页号为1、2、3的脏页的页地址加入到Req1的页数组 中;通过获取脏页数组后,脏页数组中有3个脏页,页号分别为6、9、10,确 定出页号为6的脏页没有连续的脏页,生成一个req消息Req2,将页号为6的 脏页的页地址加入到Req2的页数组中;通过获取脏页数组后,脏页数组中有2 个脏页,页号分别为9、10,确定出页号为9和10的脏页连续,生成一个req 消息Req3,将页号为9、10的脏页的页地址加入到Req3的页数组中,这样, 一共只需生成3个req消息,消息数可以减少一半。

为了实现上述方法,本发明还提供一种在fuse上实现聚合写文件脏页的装 置,如图3所示,该装置包括:获取模块31、检查模块32、传递模块33;其 中,

获取模块31,用于获取脏页数组;

检查模块32,用于检查脏页数组中连续的脏页,将连续的脏页发送到传递 模块33;

传递模块33,用于将连续的脏页通过一个fuse消息传递给用户态文件系统 的守护进程;

所述获取模块31,具体用于定义原型为writepages的函数fuse_writepages, 函数fuse_writepages根据输入参数wbc,确定文件写的起始页号index和结束 页号end;清除文件写完成标识,调用pagevec_lookup_tag函数,并输入起始页 号index和结束页号end,将带有脏页标志PAGEE_TAG_DCACHIRTY的页, 按页号从小到大的顺序组成脏页数组存储在pvec中;

所述检查模块32,具体用于依次检查脏页数组中的每一页,根据脏页数组 中第一个脏页的页号设置连续号变量,并将第一个脏页的页地址通知传递模块 33,通过连续号变量确定与第一个脏页连续的脏页,将确定的连续的脏页的页 地址通知传递模块33;

所述传递模块33,具体用于将所述检查模块32通知的脏页的页地址加入 到fuse消息的页数组中,通过所述fuse消息将所述页数组传递给用户态文件系 统的守护进程;

所述传递模块33,进一步用于设置最大脏页数,当fuse消息的页数组中脏 页页数达到最大脏页数时,通知检查模块32不再继续确定连续脏页,将所述fuse 消息传递给用户态文件系统的守护进程。

以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范 围。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号