CN102360369A - 在用户空间文件系统上实现聚合写文件脏页的方法和装置 - Google Patents
在用户空间文件系统上实现聚合写文件脏页的方法和装置 Download PDFInfo
- Publication number
- CN102360369A CN102360369A CN2011103021487A CN201110302148A CN102360369A CN 102360369 A CN102360369 A CN 102360369A CN 2011103021487 A CN2011103021487 A CN 2011103021487A CN 201110302148 A CN201110302148 A CN 201110302148A CN 102360369 A CN102360369 A CN 102360369A
- Authority
- CN
- China
- Prior art keywords
- page
- dirty
- fuse
- array
- pages
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims abstract description 50
- 230000002776 aggregation Effects 0.000 title abstract description 8
- 238000004220 aggregation Methods 0.000 title abstract description 8
- 230000005540 biological transmission Effects 0.000 claims abstract description 11
- 238000007689 inspection Methods 0.000 claims description 3
- 230000006870 function Effects 0.000 description 19
- 238000013507 mapping Methods 0.000 description 5
- GNFTZDOKVXKIBK-UHFFFAOYSA-N 3-(2-methoxyethoxy)benzohydrazide Chemical compound COCCOC1=CC=CC(C(=O)NN)=C1 GNFTZDOKVXKIBK-UHFFFAOYSA-N 0.000 description 2
- 238000010586 diagram Methods 0.000 description 2
- FGUUSXIOTUKUDN-IBGZPJMESA-N C1(=CC=CC=C1)N1C2=C(NC([C@H](C1)NC=1OC(=NN=1)C1=CC=CC=C1)=O)C=CC=C2 Chemical compound C1(=CC=CC=C1)N1C2=C(NC([C@H](C1)NC=1OC(=NN=1)C1=CC=CC=C1)=O)C=CC=C2 FGUUSXIOTUKUDN-IBGZPJMESA-N 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 230000003993 interaction Effects 0.000 description 1
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种在用户空间文件系统(fuse)上实现聚合写文件脏页的方法,fuse获取脏页数组;检查脏页数组中连续的脏页,将连续的脏页通过一个fuse消息传递给用户态文件系统的守护进程;本发明同时还公开了一种在fuse上实现聚合写文件脏页的装置,通过本发明的方案,能够减少fuse消息数量,节省系统的CPU资源,提高传输效率。
Description
技术领域
本发明涉及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消息传递给用户态文件系统的守护进程。
以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。
Claims (9)
1.一种在用户空间文件系统(fuse)上实现聚合写文件脏页的方法,其特征在于,该方法包括:
fuse获取脏页数组;检查脏页数组中连续的脏页,将连续的脏页通过一个fuse消息传递给用户态文件系统的守护进程。
2.根据权利要求1所述的方法,其特征在于,所述fuse获取脏页数组为:
定义原型为页写函数(writepages)的函数fuse_writepages,函数fuse_writepages根据输入参数,确定文件写的起始页号和结束页号;清除文件写完成标识,调用查找函数(pagevec_lookup_tag),并输入起始页号和结束页号,将带有脏页标志PAGEE_TAG_DCACHIRTY的页,按页号从小到大的顺序组成脏页数组存储在脏页存储数组(pvec)中。
3.根据权利要求2所述的方法,其特征在于,所述检查脏页数组中连续的脏页,将连续的脏页通过一个fuse消息传递给用户态文件系统的守护进程为:fuse依次检查脏页数组中的每一页,根据脏页数组中第一个脏页的页号设置连续号变量,并在将第一个脏页的页地址加入到fuse消息的页数组中之后,通过连续号变量确定与第一个脏页连续的脏页,将确定的连续的脏页也加入到所述fuse消息的页数组中,通过所述fuse消息将所述页数组传递给用户态文件系统的守护进程。
4.根据权利要求3所述的方法,其特征在于,该方法进一步包括:预先设置最大脏页数,当fuse消息的页数组中脏页页数达到最大脏页数时,不再继续确定连续脏页,将该fuse消息传递给用户态文件系统的守护进程。
5.一种在fuse上实现聚合写文件脏页的装置,其特征在于,该装置包括:获取模块、检查模块、传递模块;其中,
获取模块,用于获取脏页数组;
检查模块,用于检查脏页数组中连续的脏页,将连续的脏页发送到传递模块;
传递模块,用于将连续的脏页通过一个fuse消息传递给用户态文件系统的守护进程。
6.根据权利要求5所述的装置,其特征在于,所述获取模块,具体用于定义原型为writepages的函数fuse_writepages,函数fuse_writepages根据输入参数wbc,确定文件写的起始页号和结束页号;清除文件写完成标识,调用pagevec_lookup_tag函数,并输入起始页号和结束页号,将带有脏页标志PAGEE_TAG_DCACHIRTY的页,按页号从小到大的顺序组成脏页数组存储在pvec中。
7.根据权利要求6所述的装置,其特征在于,所述检查模块,具体用于依次检查脏页数组中的每一页,根据脏页数组中第一个脏页的页号设置连续号变量,并将第一个脏页的页地址通知传递模块,通过连续号变量确定与第一个脏页连续的脏页,将确定的连续的脏页的页地址通知传递模块。
8.根据权利要求7所述的装置,其特征在于,所述传递模块,具体用于将所述检查模块通知的脏页的页地址加入到fuse消息的页数组中,通过所述fuse消息将所述页数组传递给用户态文件系统的守护进程。
9.根据权利要求8所述的装置,其特征在于,所述传递模块,进一步用于设置最大脏页数,当fuse消息的页数组中脏页页数达到最大脏页数时,通知检查模块不再继续确定连续脏页,将所述fuse消息传递给用户态文件系统的守护进程。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201110302148.7A CN102360369B (zh) | 2011-09-28 | 2011-09-28 | 在用户空间文件系统上实现聚合写文件脏页的方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201110302148.7A CN102360369B (zh) | 2011-09-28 | 2011-09-28 | 在用户空间文件系统上实现聚合写文件脏页的方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102360369A true CN102360369A (zh) | 2012-02-22 |
CN102360369B CN102360369B (zh) | 2014-08-13 |
Family
ID=45585698
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201110302148.7A Active CN102360369B (zh) | 2011-09-28 | 2011-09-28 | 在用户空间文件系统上实现聚合写文件脏页的方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102360369B (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103970794A (zh) * | 2013-02-01 | 2014-08-06 | 联想(北京)有限公司 | 数据访问方法和数据访问装置 |
CN107239236A (zh) * | 2017-06-27 | 2017-10-10 | 北京小米移动软件有限公司 | 数据写入方法及装置 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20090327576A1 (en) * | 2008-06-26 | 2009-12-31 | Microsoft Corporation | Direct Memory Access Filter for Virtualized Operating Systems |
CN102097128A (zh) * | 2010-11-25 | 2011-06-15 | 中国人民大学 | 一种基于闪存的自适应缓冲区置换方法 |
-
2011
- 2011-09-28 CN CN201110302148.7A patent/CN102360369B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20090327576A1 (en) * | 2008-06-26 | 2009-12-31 | Microsoft Corporation | Direct Memory Access Filter for Virtualized Operating Systems |
CN102097128A (zh) * | 2010-11-25 | 2011-06-15 | 中国人民大学 | 一种基于闪存的自适应缓冲区置换方法 |
Non-Patent Citations (2)
Title |
---|
20100829 无 使用 FUSE 开发自己的文件系统 全文 1-9 , * |
无: "使用 FUSE 开发自己的文件系统", <URL:HTTP://HI.BAIDU.COM/XUWANBEST/BLOG/ITEM/2E0B91CA0E10654EF31FE7B8.HTML> * |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103970794A (zh) * | 2013-02-01 | 2014-08-06 | 联想(北京)有限公司 | 数据访问方法和数据访问装置 |
CN103970794B (zh) * | 2013-02-01 | 2017-11-28 | 联想(北京)有限公司 | 数据访问方法和数据访问装置 |
CN107239236A (zh) * | 2017-06-27 | 2017-10-10 | 北京小米移动软件有限公司 | 数据写入方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN102360369B (zh) | 2014-08-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
EP3748510B1 (en) | Network interface for data transport in heterogeneous computing environments | |
KR101371936B1 (ko) | 메모리 장치들에 의해 호스트 메모리 액세스를 제어하기 위한 방법들 및 시스템들 | |
US9934173B1 (en) | Pseudo cut-through architecture between non-volatile memory storage and remote hosts over a fabric | |
US8850158B2 (en) | Apparatus for processing remote page fault and method thereof | |
CN101150488B (zh) | 一种零拷贝网络报文接收方法 | |
CN102541779B (zh) | 一种提高多数据缓冲区dma效率的系统和方法 | |
CN102467473B (zh) | 一种在用户空间和内核之间传输数据的方法和装置 | |
CN103647807A (zh) | 一种信息缓存方法、装置和通信设备 | |
US9411728B2 (en) | Methods and apparatus for efficient communication between caches in hierarchical caching design | |
KR20100138940A (ko) | 가상 메모리 인터페이스 | |
CN111190854B (zh) | 通信数据处理方法、装置、设备、系统和存储介质 | |
CN113760560A (zh) | 一种进程间通信方法以及进程间通信装置 | |
CN105335309B (zh) | 一种数据传输方法及计算机 | |
CN105518631B (zh) | 内存管理方法、装置和系统、以及片上网络 | |
US20140068125A1 (en) | Memory throughput improvement using address interleaving | |
US8996774B2 (en) | Performing emulated message signaled interrupt handling | |
TW201135469A (en) | Opportunistic improvement of MMIO request handling based on target reporting of space requirements | |
CN110419034A (zh) | 一种数据访问方法及装置 | |
CN109062826B (zh) | 数据传输方法及系统 | |
US20190332540A1 (en) | Storage management method, electronic device and computer readable medium | |
WO2022086791A1 (en) | Detecting infinite loops in a programmable atomic transaction | |
CN115964319A (zh) | 远程直接内存访问的数据处理方法及相关产品 | |
CN110135589A (zh) | 用于机器学习的系统和方法 | |
CN118093231B (zh) | 一种面向异构计算的数据传输方法、装置、系统和产品 | |
CN110737618B (zh) | 内嵌处理器进行快速数据通信的方法、装置及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |