一种用户态文件系统处理方法转让专利

申请号 : CN201811126703.3

文献号 : CN109445685B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 姚杰张一凡严文瑞曹强

申请人 : 华中科技大学

摘要 :

本发明公开了一种用户态文件系统请求的处理方法,包括:若为实际文件写请求,则先向内核守护进程发送数据写请求,以使得内核守护进程直接将待写入的数据写入数据文件中,并根据被访问实际文件与数据文件之间的映射关系建立映射表;然后向内核守护进程发送元数据写请求,以使得内核守护进程将所建立的映射表写入元数据文件中;若为实际文件读请求,则先向内核守护进程发送元数据读请求,以使得内核守护进程从元数据文件中读取映射表;然后向内核守护进程发送数据读请求,以使得内核守护进程根据所读取的映射表直接从数据文件中读取所请求的数据。本发明能够减少读/写数据文件过程中用户态和内核态之间的切换次数,提高数据传输性能。

权利要求 :

1.一种用户态文件系统请求的处理方法,用于处理对用户态文件系统中实际文件的读/写请求,其特征在于,包括如下步骤:(1)判断请求类型,若为实际文件写请求,则转入步骤(2);若为实际文件读请求,则转入步骤(4);

(2)向内核守护进程发送数据写请求,以使得内核守护进程直接将待写入的数据写入数据文件中,并根据被访问实际文件与数据文件之间的映射关系建立映射表;

(3)向内核守护进程发送元数据写请求,以使得内核守护进程将所建立的映射表写入元数据文件中;所述实际文件写请求处理结束;

(4)向内核守护进程发送元数据读请求,以使得内核守护进程从元数据文件中读取映射表;

(5)向内核守护进程发送数据读请求,以使得内核守护进程根据所读取的映射表直接从数据文件中读取所请求的数据;所述实际文件读请求处理结束;

其中,映射表包括一个或多个映射表项,每一个映射表项对应一个数据文件,用于记录实际文件中全部或部分数据在该数据文件中的存储位置和数据长度;所述实际文件为用户态文件系统中的文件,所述数据文件为内核态文件系统中存储被访问数据的文件,所述元数据文件为内核态文件系统中存储被访问数据的属性及存储位置的文件。

2.如权利要求1所述的用户态文件系统请求的处理方法,其特征在于,所述步骤(2)包括如下步骤:(21)判断用户态文件系统的文件映射规则,若为一个实际文件对应一个数据文件,则转入步骤(22);若为一个实际文件对应多个数据文件,则转入步骤(23);若为多个实际文件对应一个数据文件,则转入步骤(25);

(22)打开一个数据文件并写入全部待写入的数据;生成一个与该数据文件相对应的映射表项,并在其中记录数据写入位置和写入的数据长度;转入步骤(26);

(23)打开一个数据文件并写入部分待写入的数据;生成一个与该数据文件相对应的映射表项,并在其中记录数据写入位置和写入的数据长度;

(24)重复执行步骤(23),直至全部待写入的数据均写入数据文件;转入步骤(26);

(25)打开被访问文件所对应的数据文件,并从指定的文件偏移位置开始写入全部待写入的数据;生成一个与该数据文件相对应的映射表项,并在其中记录数据写入位置和写入的数据长度;转入步骤(26);

(26)建立包含所生成的映射表项的映射表。

3.如权利要求1所述的用户态文件系统请求的处理方法,其特征在于,所述步骤(3)中,使得内核守护进程将所建立的映射表写入元数据文件中,包括如下步骤:(31)由内核守护进程将所述元数据写请求和所建立的映射表均传递到用户态文件系统接口;

(32)判断内核文件系统中是否存在被访问实际文件对应的元数据文件,若是,则由用户态文件系统接口利用该映射表更新该元数据文件;否则,创建该元数据文件,并由用户态文件系统接口将该映射表写入该元数据文件中。

4.如权利要求1所述的用户态文件系统请求的处理方法,其特征在于,所述步骤(4)包括如下步骤:(41)由内核守护进程将所述元数据读请求传递到用户态文件系统接口;

(42)由用户态文件系统接口从被访问实际文件所对应的元数据文件中读取映射表;若用户态文件系统的文件对应规则为一个实际文件对应一个数据文件或者多个实际文件对应一个数据文件,则所读取的映射表中包含一个映射表项;若用户态文件系统的文件对应规则为一个实际文件对应多个数据文件,则所读取的映射表中包含多个映射表项。

5.如权利要求1所述的用户态文件系统请求的处理方法,其特征在于,所述步骤(5)中,使得内核守护进程根据所读取的映射表直接从数据文件中读取所请求的数据,包括如下步骤:(51)判断用户态文件系统的文件映射规则,若为一个实际文件对应一个数据文件,则转入步骤(52);若为一个实际文件对应多个数据文件,则转入步骤(53);若为多个实际文件对应一个数据文件,则转入步骤(55);

(52)根据映射表中的映射表项打开数据文件,并根据映射表项所记录的存储位置和数据长度从该数据文件中读取全部被请求的数据;

(53)根据映射表项打开数据文件,并根据映射表项所记录的存储位置和数据长度从该数据文件中读取部分被请求的数据;

(54)遍历映射表,对于每一个映射表项执行步骤(53),从而得到全部被请求的数据;

(55)根据映射表中的映射表项打开数据文件,并根据映射表项所记录的存储位置和数据长度从该数据文件中读取全部被请求的数据。

6.如权利要求1-5任一项所述的用户态文件系统请求的处理方法,其特征在于,所述映射表项记录的内容包括:文件名,用于标识对应的数据文件;文件偏移值,用于记录实际文件中全部或部分数据在该数据文件中的存储位置;以及数据长度,用于记录实际文件中存储于该数据文件中的数据长度。

说明书 :

一种用户态文件系统处理方法

技术领域

[0001] 本发明属于计算机操作系统文件系统领域,更具体地,涉及一种用户态文件系统的处理方法。

背景技术

[0002] 用户态文件系统是一种区别于常规内核文件系统(诸如EXT4、NTFS等)的文件系统实现方式。用户态文件系统的代码运行在用户态,由一个内核态守护进程来实现与真正的内核接口的沟通。用户态文件系统框架便于开发、维护和移植,因此,在实验和工业界中都得到了广泛的使用。
[0003] 用户态文件系统实现的文件系统操作是堆叠在下层的内核文件系统之上,每一个文件对应下层内核态文件系统中的两个文件:数据文件和元数据文件,其中数据文件存储有被访问的数据,元数据文件存储有被访问数据的属性信息,可用于获取被访问数据在数据文件中的存储位置;处理用户态文件系统请求的过程中,涉及到这两个文件的读/写操作。相比于内核态文件系统,用户态文件系统每一次操作都会带来一次额外的用户态和内核态的切换,频繁的切换则会导致数据传输的性能降低。
[0004] 为了在处理用户态文件系统请求的过程中提高数据传输的性能,现有的解决方法包括:(1)增加每次数据传输的数据量,从而减少数据传输时的用户态与内核态的切换次数;(2)映射内核态和用户态的内存空间,减少数据传输时的内存拷贝。以上方法能够在一定程度上提高数据的传输性能,但是并没有解决本质的问题:数据传输时的用户态与内核态切换之间的频繁切换仍然存在。

发明内容

[0005] 针对现有技术的缺陷和改进需求,本发明提供了一种用户态文件系统请求的处理方法,其目的在于,在处理用户态文件系统请求时减少读/写数据文件过程中用户态和内核态之间的切换次数,从而提高数据传输性能。
[0006] 为实现上述目的,本发明提供了一种用户态文件系统请求的处理方法,用于处理对用户态文件系统中实际文件的读/写请求,包括如下步骤:
[0007] (1)判断请求类型,若为实际文件写请求,则转入步骤(2);若为实际文件读请求,则转入步骤(4);
[0008] (2)向内核守护进程发送数据写请求,以使得内核守护进程直接将待写入的数据写入数据文件中,并根据被访问实际文件与数据文件之间的映射关系建立映射表;
[0009] (3)向内核守护进程发送元数据写请求,以使得内核守护进程将所建立的映射表写入元数据文件中;实际文件写请求处理结束;
[0010] (4)向内核守护进程发送元数据读请求,以使得内核守护进程从元数据文件中读取映射表;
[0011] (5)向内核守护进程发送数据读请求,以使得内核守护进程根据所读取的映射表直接从数据文件中读取所请求的数据;实际文件读请求处理结束;
[0012] 其中,映射表包括一个或多个映射表项,每一个映射表项对应一个数据文件,用于记录实际文件中全部或部分数据在该数据文件中的存储位置和数据长度。
[0013] 进一步地,步骤(2)包括如下步骤:
[0014] (21)判断用户态文件系统的文件映射规则,若为一个实际文件对应一个数据文件,则转入步骤(22);若为一个实际文件对应多个数据文件,则转入步骤(23);若为多个实际文件对应一个数据文件,则转入步骤(25);
[0015] (22)打开一个数据文件并写入全部待写入的数据;生成一个与该数据文件相对应的映射表项,并在其中记录数据写入位置和写入的数据长度;转入步骤(26);
[0016] (23)打开一个数据文件并写入部分待写入的数据;生成一个与该数据文件相对应的映射表项,并在其中记录数据写入位置和写入的数据长度;
[0017] (24)重复执行步骤(23),直至全部待写入的数据均写入数据文件;转入步骤(26);
[0018] (25)打开被访问文件所对应的数据文件,并从指定的文件偏移位置开始写入全部待写入的数据;生成一个与该数据文件相对应的映射表项,并在其中记录数据写入位置和写入的数据长度;转入步骤(26);
[0019] (26)建立包含所生成的映射表项的映射表。
[0020] 进一步地,步骤(3)中,使得内核守护进程将所建立的映射表写入元数据文件中,包括如下步骤:
[0021] (31)由内核守护进程将元数据写请求和所建立的映射表均传递到用户态文件系统接口;
[0022] (32)判断内核文件系统中是否存在被访问实际文件对应的元数据文件,若是,则由用户态文件系统接口利用该映射表更新该元数据文件;否则,创建该元数据文件,并由用户态文件系统接口将该映射表写入该元数据文件中。
[0023] 进一步地,步骤(4)包括如下步骤:
[0024] (41)由内核守护进程将元数据读请求传递到用户态文件系统接口;
[0025] (42)由用户态文件系统接口从被访问实际文件所对应的元数据文件中读取映射表;若用户态文件系统的文件对应规则为一个实际文件对应一个数据文件或者多个实际文件对应一个数据文件,则所读取的映射表中包含一个映射表项;若用户态文件系统的文件对应规则为一个实际文件对应多个数据文件,则所读取的映射表中包含多个映射表项。
[0026] 进一步地,步骤(5)中,使得内核守护进程根据所读取的映射表直接从数据文件中读取所请求的数据,包括如下步骤:
[0027] (51)判断用户态文件系统的文件映射规则,若为一个实际文件对应一个数据文件,则转入步骤(52);若为一个实际文件对应多个数据文件,则转入步骤(53);若为多个实际文件对应一个数据文件,则转入步骤(55);
[0028] (52)根据映射表中的映射表项打开数据文件,并根据映射表项所记录的存储位置和数据长度从该数据文件中读取全部被请求的数据;
[0029] (53)根据映射表项打开数据文件,并根据映射表项所记录的存储位置和数据长度从该数据文件中读取部分被请求的数据;
[0030] (54)遍历映射表,对于每一个映射表项执行步骤(53),从而得到全部被请求的数据;
[0031] (55)根据映射表中的映射表项打开数据文件,并根据映射表项所记录的存储位置和数据长度从该数据文件中读取全部被请求的数据。
[0032] 进一步地,映射表项记录的内容包括:文件名,用于标识对应的数据文件;文件偏移值,用于记录实际文件中全部或部分数据在该数据文件中的存储位置;以及数据长度,用于记录实际文件中存储于该数据文件中的数据长度。
[0033] 总体而言,通过本发明所构思的以上技术方案,能够取得以下有益效果:
[0034] (1)本发明所提供的用户态文件系统请求的处理方法,通过映射表来记录被访问实际文件与数据文件之间的映射关系,并将映射表保存在元数据文件中,在处理数据写请求或数据读请求时,由内核守护进程直接通过访问数据文件完成,由于读/写数据文件时均不通过用户态文件系统接口,因此能够减少一次用户态与内核态的来回切换,从而提升文件系统的IO带宽,加速文件系统访问速度,提高了数据传输的整体性能。
[0035] (2)本发明所提供的用户态文件系统请求的处理方法,在其优选方案中,内核守护进程访问元数据文件以完成数据读/写时,均使用标准的用户态文件系统接口,即保留了原有的元数据文件的访问接口,由此保证了对上层用户态程序具有良好的兼容性。

附图说明

[0036] 图1为现有的用户态文件系统元数据访问的示意图;
[0037] 图2为本发明实施例提供的用户态文件系统请求的处理方法流程图;
[0038] 图3为本发明实施例提供的处理数据写请求的方法流程图;
[0039] 图4为本发明实施例提供的处理数据读请求的方法流程图;
[0040] 图5为本发明实施例提供的用户态文件系统数据访问的示意图。

具体实施方式

[0041] 为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
[0042] 在详细解释本发明的技术方案之前,先对本发明中相关术语的含义进行简单说明:
[0043] 实际文件:用户态文件系统中的文件,用户态程序所访问的直接对象,一个实际文件与一个元数据文件以及一个或多个数据文件相对应;
[0044] 数据文件:用户态文件系统中的文件,其中存储有被访问的数据;
[0045] 元数据文件:用户态文件系统中的文件,存储有被访问数据的属性信息,可用于获取被访问数据在数据文件中的存储位置;
[0046] 用户态文件系统请求:对用户态文件系统中实际文件的读/写请求,由用户态程序发出;一个用户态文件系统请求的处理会涉及到被访问实际文件所对应的数据文件及元数据文件的读/写操作;
[0047] 数据写请求:用于将数据写入数据文件;
[0048] 元数据写请求:用于写入或更新元数据文件;
[0049] 元数据读请求:用于读取元数据文件;
[0050] 数据读请求:用于从元数据文件中读取数据。
[0051] 传统的用户态文件系统请求的处理方法中,元数据访问及数据访问的过程均包含“用户态”→“内核态”→“用户态”→“内核态”→“用户态”的切换过程,共两次来回切换。以元数据写请求为例,如图1所示,用户态程序发出用户态文件系统写请求后,在用户态向内核态发送元数据写请求,此为第一次切换;元数据写请求经由内核态的虚拟文件系统(VFS)传递至内核守护进程后,由内核守护进程将元数据写请求传递至用户态文件系统接口,此为第二次切换;通过用户态文件系统接口将实际文件的属性信息写入内核态文件系统中的元数据文件,此为第三次切换;元数据写入完成后,内核态文件系统将写入结果返回给内核守护进程,并进一步通过VFS将写入结果返回给用户态文件系统,此为第四次切换;其中,从“用户态”切换到“内核态”,再从“内核态”切换回“用户态”,称为一次来回切换。元数据读请求与元数据写请求的过程类似,只是对元数据文件所执行的操作为读操作;数据写请求和数据读请求分别与元数据写请求和元数据读请求的过程类似,只是所操作的对象为内核态文件系统的数据文件,在此不再赘述。
[0052] 本发明所提供的用户态文件系统请求的处理方法,其整体思路在于:在读/写数据文件时均不通过用户态文件系统接口,而是由内核守护进程直接通过访问数据文件完成,以减少一次用户态与内核态的来回切换,从而提升文件系统的IO带宽,加速文件系统访问速度,提高数据传输的整体性能。
[0053] 本发明所提供的用户态文件系统请求的处理方法,如图2所示,包括如下步骤:
[0054] (1)判断请求类型,若为实际文件写请求,则转入步骤(2);若为实际文件读请求,则转入步骤(4);
[0055] (2)向内核守护进程发送数据写请求,以使得内核守护进程直接将待写入的数据写入数据文件中,并根据被访问实际文件与数据文件之间的映射关系建立映射表;
[0056] 在一个可选的实施方式中,如图3所示,步骤(2)具体包括如下步骤:
[0057] (21)判断用户态文件系统的文件映射规则,若为一个实际文件对应一个数据文件,则转入步骤(22);若为一个实际文件对应多个数据文件,则转入步骤(23);若为多个实际文件对应一个数据文件,则转入步骤(25);
[0058] (22)打开一个数据文件并写入全部待写入的数据;生成一个与该数据文件相对应的映射表项,并在其中记录数据写入位置和写入的数据长度;转入步骤(26);
[0059] (23)打开一个数据文件并写入部分待写入的数据;生成一个与该数据文件相对应的映射表项,并在其中记录数据写入位置和写入的数据长度;
[0060] (24)重复执行步骤(23),直至全部待写入的数据均写入数据文件;转入步骤(26);
[0061] (25)打开被访问文件所对应的数据文件,并从指定的文件偏移位置开始写入全部待写入的数据;生成一个与该数据文件相对应的映射表项,并在其中记录数据写入位置和写入的数据长度;转入步骤(26);
[0062] (26)建立包含所生成的映射表项的映射表;
[0063] (3)向内核守护进程发送元数据写请求,以使得内核守护进程将所建立的映射表写入元数据文件中;实际文件写请求处理结束;
[0064] 在一个可选的实施方式中,步骤(3)中,使得内核守护进程将所建立的映射表写入元数据文件中,包括如下步骤:
[0065] (31)由内核守护进程将元数据写请求和所建立的映射表均传递到用户态文件系统接口;
[0066] (32)判断内核文件系统中是否存在被访问实际文件对应的元数据文件,若是,则由用户态文件系统接口利用该映射表更新该元数据文件;否则,创建该元数据文件,并由用户态文件系统接口将该映射表写入该元数据文件中;
[0067] (4)向内核守护进程发送元数据读请求,以使得内核守护进程从元数据文件中读取映射表;
[0068] 在一个可选的实施方式中,步骤(4)具体包括如下步骤:
[0069] (41)由内核守护进程将元数据读请求传递到用户态文件系统接口;
[0070] (42)由用户态文件系统接口从被访问实际文件所对应的元数据文件中读取映射表;若用户态文件系统的文件对应规则为一个实际文件对应一个数据文件或者多个实际文件对应一个数据文件,则所读取的映射表中包含一个映射表项;若用户态文件系统的文件对应规则为一个实际文件对应多个数据文件,则所读取的映射表中包含多个映射表项;
[0071] (5)向内核守护进程发送数据读请求,以使得内核守护进程根据所读取的映射表直接从数据文件中读取所请求的数据;实际文件读请求处理结束;
[0072] 在一个可选的实施方式中,如图4所示,步骤(5)中,使得内核守护进程根据所读取的映射表直接从数据文件中读取所请求的数据,包括如下步骤:
[0073] (51)判断用户态文件系统的文件映射规则,若为一个实际文件对应一个数据文件,则转入步骤(52);若为一个实际文件对应多个数据文件,则转入步骤(53);若为多个实际文件对应一个数据文件,则转入步骤(55);
[0074] (52)根据映射表中的映射表项打开数据文件,并根据映射表项所记录的存储位置和数据长度从该数据文件中读取全部被请求的数据;
[0075] (53)根据映射表项打开数据文件,并根据映射表项所记录的存储位置和数据长度从该数据文件中读取部分被请求的数据;
[0076] (54)遍历映射表,对于每一个映射表项执行步骤(53),从而得到全部被请求的数据;
[0077] (55)根据映射表中的映射表项打开数据文件,并根据映射表项所记录的存储位置和数据长度从该数据文件中读取全部被请求的数据;
[0078] 其中,映射表包括一个或多个映射表项,每一个映射表项对应一个数据文件,用于记录实际文件中全部或部分数据在该数据文件中的存储位置和数据长度;在本发明实施例中,所设计的映射表结构如表1所示,其中每个映射表项记录的内容包括:文件名,用于标识对应的数据文件;文件偏移值,用于记录实际文件中全部或部分数据在该数据文件中的存储位置;以及数据长度,用于记录实际文件中存储于该数据文件中的数据长度。
[0079] 表1映射表结构
[0080]文件名 文件偏移 长度
FileA 0 4096
FileB 0 8192
…… …… ……
[0081] 在本发明所提供的用户态文件系统请求的处理方法,在读/写数据文件时均不通过用户态文件系统接口,而是由内核守护进程直接通过访问数据文件完成,由此能够减少一次用户态与内核态的来回切换;以数据写请求为例,如图5所示,包含“用户态”→“内核态”→“用户态”的切换过程,共一次来回切换;具体地,用户态程序发出用户态文件系统写请求后,在用户态向内核态发送数据写请求,此为第一次切换;数据写请求经由VFS传递至内核守护进程后,由内核守护进程直接将待写入的数据写入内核态的数据文件,并在数据写入完成后,内核态文件系统将写入结果返回给内核守护进程,并进一步通过VFS将写入结果返回给用户态文件系统,此为第二次切换。数据读请求与数据写请求的过程类似,只是对数据文件所执行的操作为读操作,在此不再赘述。
[0082] 采用6个固态盘组成的RAID-0阵列作为测试环境,将标准的用户态文件系统FUSE(File system in User Space)作为基准文件系统,将采用本发明所提供的用户态文件系统请求的处理方法的文件系统作为目标文件系统,采用标准测试工具Filebench分别测试基准文件系统和目标文件系统的读写性能,测试结果如表2所示:
[0083] 表2文件系统读写速度
[0084]文件系统 平均读速度 平均写速度
基准文件系统 293MB/s 298MB/s
目标文件系统 798MB/s 595MB/s
[0085] 根据表2所示的测试结果可知,采用本发明所提供的用户态文件系统请求的处理方法后,写速度提升了2.67倍,读速度提升了2倍,也即是说,本发明所提供的用户态文件系统请求的处理方法,由于减少了一次用户态与内核态的来回切换,明显加快了文件系统访问速度,提高了数据传输的整体性能。
[0086] 本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。