本发明属于软件存储技术领域,特别是涉及一种读写过程中减少内存拷贝的方法和装置。
背景技术:
现在高性能的存储卡应用越来越广泛,各种高带宽、低延迟的产品层出不穷,这些高性能产品逐渐应用到了存储系统中。目前流行的思路是让硬件的DMA来处理搬数据的工作,释放CPU资源,从而提升效率,但是由于用户态读写的内存是不连续内存,不能简单的进行dma搬运。在linux操作系统下,用户层提供文件读写的接口,经由虚拟文件系统接口、文件系统接口、页缓存块、通用块层创建bio、io调度层进行排序后,最终落到存储设备的驱动侧,从而把数据写入存储设备。其中,在页缓存块这一层,会找当前地址有没有被映射,如果被映射,就访问被映射的页,如果没有,就分配一个内存页,进行访问,把用户空间的数据拷贝到当前的内存页,或者从当前的内存页拷贝到映射成用户空间的这块地址来。这里的拷贝工作是由CPU来完成的,因为CPU需要拿出一部分性能来做简单的搬运工作,消耗太多资源,损失掉一部分在其他方面的性能。
技术实现要素:
为解决上述问题,本发明提供了一种读写过程中减少内存拷贝的方法和装置,能够有效利用CPU资源,提升IO效率。
本发明提供的一种读写过程中减少内存拷贝的方法,包括:
建立用户空间内存区域与内核态缓存页之间的对应关系;
将所述对应关系写入映射表,并将所述映射表关联文件描述符;
读写所述文件之前,利用所述文件描述符确定对应的映射表;
利用所述映射表,对所述用户空间内存区域进行读写的同时,对对应的所述内核态缓存页进行读写。
优选的,在上述读写过程中减少内存拷贝的方法中,
在所述对对应的内核态缓存页进行读写之后,还包括:
将所述内核态缓存页对应的磁盘位置信息发送给驱动层进行读写处理。
优选的,在上述读写过程中减少内存拷贝的方法中,
还包括:
利用链表串联所述内核态缓存页,并处理大于单个所述内核态缓存页的处理极限的数据。
优选的,在上述读写过程中减少内存拷贝的方法中,还包括:
当所述映射表中的内核态缓存页用尽时,从页缓存池中获取内核态缓存页并放入所述映射表中。
优选的,在上述读写过程中减少内存拷贝的方法中,
还包括:
当读写完毕,释放所述映射表及其中的内核态缓存页。
本发明提供的一种读写过程中减少内存拷贝的装置,包括:
建立单元,用于建立用户空间内存区域与内核态缓存页之间的对应关系;
写入和关联单元,用于将所述对应关系写入映射表,并将所述映射表关联文件描述符;
确定单元,用于读写所述文件之前,利用所述文件描述符确定对应的映射表;
读写单元,用于利用所述映射表,对所述用户空间内存区域进行读写的同时,对对应的所述内核态缓存页进行读写。
优选的,在上述读写过程中减少内存拷贝的装置中,
还包括:
发送单元,用于将所述内核态缓存页对应的磁盘位置信息发送给驱动层进行读写处理。
优选的,在上述读写过程中减少内存拷贝的装置中,还包括:
串联单元,用于利用链表串联所述内核态缓存页,并处理大于单个所述内核态缓存页的处理极限的数据。
优选的,在上述读写过程中减少内存拷贝的装置中,还包括:
获取单元,用于当所述映射表中的内核态缓存页用尽时,从页缓存池中获取内核态缓存页并放入所述映射表中。
优选的,在上述读写过程中减少内存拷贝的装置中,还包括:
释放单元,用于当读写完毕,释放所述映射表及其中的内核态缓存页。
通过上述描述可知,本发明提供的读写过程中减少内存拷贝的方法和装置,由于该方法包括:建立用户空间内存区域与内核态缓存页之间的对应关系;将所述对应关系写入映射表,并将所述映射表关联文件描述符;读写所述文件之前,利用所述文件描述符确定对应的映射表;利用所述映射表,对所述用户空间内存区域进行读写的同时,对对应的所述内核态缓存页进行读写,因此能够有效利用CPU资源,提升IO效率。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为本申请实施例提供的第一种读写过程中减少内存拷贝的方法的示意图;
图2为本申请实施例提供的第一种读写过程中减少内存拷贝的装置的示意图。
具体实施方式
本发明的核心思想在于提供一种读写过程中减少内存拷贝的方法和装置,能够有效利用CPU资源,提升IO效率。
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本申请实施例提供的第一种读写过程中减少内存拷贝的方法如图1所示,图1为本申请实施例提供的第一种读写过程中减少内存拷贝的方法的示意图,该方法包括如下步骤:
S1:建立用户空间内存区域与内核态缓存页之间的对应关系;
具体而言,就是系统初始化时,在内核空间分配足够的页数作为页缓存池,例如可以分配出指定个数的4k buffer,把这些页映射给用户空间。
S2:将所述对应关系写入映射表,并将所述映射表关联文件描述符;
需要说明的是,对文件进行读写操作时,通过文件描述符找到该对应的映射表,从而找到映射表中的页。例如,fd是文件描述符,访问一个普通文本文件,首先会执行open,返回一个fd,通过fd来访问该文件。
S3:读写所述文件之前,利用所述文件描述符确定对应的映射表;
S4:利用所述映射表,对所述用户空间内存区域进行读写的同时,对对应的所述内核态缓存页进行读写。
需要说明的是,对应用层来说,之前是创建一块buffer(用户空间的内存区域),写操作是先对这块buffer进行写,然后这块buffer的值copy到内核,内核再把这块值送给驱动。本实施例中,则是这个缓存对应到了文件系统里面的内核态缓存页,对缓存读写就是对内核态缓存页读写,省去了从缓存拷贝到内核态缓存页的过程。
通过上述描述可知,本申请实施例提供的上述第一种读写过程中减少内存拷贝的方法,由于包括:建立用户空间内存区域与内核态缓存页之间的对应关系;将所述对应关系写入映射表,并将所述映射表关联文件描述符;读写所述文件之前,利用所述文件描述符确定对应的映射表;利用所述映射表,对所述用户空间内存区域进行读写的同时,对对应的所述内核态缓存页进行读写,因此能够有效利用CPU资源,提升IO效率。
本申请实施例提供的第二种读写过程中减少内存拷贝的方法,是在上述第一种读写过程中减少内存拷贝的方法的基础上,还包括如下技术特征:
在所述对对应的内核态缓存页进行读写之后,还包括:
将所述内核态缓存页对应的磁盘位置信息发送给驱动层进行读写处理。
具体的,内核层实现为接收到write的系统调用后,便触发刷缓存页操作把映射表里面的页和文件系统里该页对应的磁盘位置信息交给文件系统,再交给bio处理,其中,bio是linux内核中用来传送读写信息的,传送给驱动层。
本申请实施例提供的第三种读写过程中减少内存拷贝的方法,是在上述第二种读写过程中减少内存拷贝的方法的基础上,还包括如下技术特征:
利用链表串联所述内核态缓存页,并处理大于单个所述内核态缓存页的处理极限的数据。
需要说明的是,因为页的大小是4k,所以读写的单位是4k,针对处理大于4k的数据,就需要用链表把映射表里的页串联起来。
本申请实施例提供的第四种读写过程中减少内存拷贝的方法,是在上述第三种读写过程中减少内存拷贝的方法的基础上,还包括如下技术特征:
当所述映射表中的内核态缓存页用尽时,从页缓存池中获取内核态缓存页并放入所述映射表中。
在这种情况下,就能够及时的处理缓存页用尽的状况,避免对于数据读写造成不利影响。
本申请实施例提供的第五种读写过程中减少内存拷贝的方法,是在上述第四种读写过程中减少内存拷贝的方法的基础上,还包括如下技术特征:
当读写完毕,释放所述映射表及其中的内核态缓存页。
综上所述,现有技术中,正常情况下访问硬盘上一个文件,都是通过间接访问的方式:用户空间的地址和内核空间的地址交换数据,然后内核地址再和硬盘的dma交换数据,内核空间的地址起了桥梁的作用,内核空间不论读写都要跟它来一次数据交换,这个数据交换是通过CPU实现的。而本申请中,是让用户空间和内核空间的地址成为一体,省去了CPU做内存拷贝的操作,从而在一定程度上提高了系统的性能。
本申请实施例提供的第一种读写过程中减少内存拷贝的装置如图2所示,图2为本申请实施例提供的第一种读写过程中减少内存拷贝的装置的示意图,该装置包括:
建立单元201,用于建立用户空间内存区域与内核态缓存页之间的对应关系,具体而言,就是系统初始化时,在内核空间分配足够的页数作为页缓存池,例如可以分配出指定个数4k buffer,把这些页映射给用户空间;
写入和关联单元202,用于将所述对应关系写入映射表,并将所述映射表关联文件描述符,需要说明的是,对文件进行读写操作时,通过文件描述符找到该对应的映射表,从而找到映射表中的页。例如,fd是文件描述符,访问一个普通文本文件,首先会执行open,返回一个fd,通过fd来访问该文件;
确定单元203,用于读写所述文件之前,利用所述文件描述符确定对应的映射表;
读写单元204,用于利用所述映射表,对所述用户空间内存区域进行读写的同时,对对应的所述内核态缓存页进行读写,需要说明的是,对应用层来说,之前是创建一块buffer(用户空间的内存区域),写操作是先对这块buffer进行写,然后这块buffer的值copy到内核,内核再把这块值送给驱动。本实施例中,则是这个缓存对应到了文件系统里面的内核态缓存页,对缓存读写就是对内核态缓存页读写,省去了从缓存拷贝到内核态缓存页的过程。
通过上述描述可知,本申请实施例提供的上述第一种读写过程中减少内存拷贝的装置能够有效利用CPU资源,提升IO效率。
本申请实施例提供的第二种读写过程中减少内存拷贝的装置,是在上述第一种读写过程中减少内存拷贝的装置的基础上,还包括如下技术特征:
发送单元,用于将所述内核态缓存页对应的磁盘位置信息发送给驱动层进行读写处理,具体的,内核层实现为接收到write的系统调用后,便触发刷缓存页操作把映射表里面的页和文件系统里该页对应的磁盘位置信息交给文件系统,再交给bio处理,其中,bio是linux内核中用来传送读写信息的,传送给驱动层。
本申请实施例提供的第三种读写过程中减少内存拷贝的装置,是在上述第二种读写过程中减少内存拷贝的装置的基础上,还包括如下技术特征:串联单元,用于利用链表串联所述内核态缓存页,并处理大于单个所述内核态缓存页的处理极限的数据。需要说明的是,因为页的大小是4k,所以读写的单位是4k,针对处理大于4k的数据,就需要用链表把映射表里的页串联起来。
本申请实施例提供的第四种读写过程中减少内存拷贝的装置,是在上述第三种读写过程中减少内存拷贝的装置的基础上,还包括如下技术特征:获取单元,用于当所述映射表中的内核态缓存页用尽时,从页缓存池中获取内核态缓存页并放入所述映射表中。在这种情况下,就能够及时的处理缓存页用尽的状况,避免对于数据读写造成不利影响。
本申请实施例提供的第五种读写过程中减少内存拷贝的装置,是在上述第四种读写过程中减少内存拷贝的装置的基础上,还包括如下技术特征:释放单元,用于当读写完毕,释放所述映射表及其中的内核态缓存页。
综上所述,现有技术中,正常情况下访问硬盘上一个文件,都是通过间接访问的方式:用户空间的地址和内核空间的地址交换数据,然后内核地址再和硬盘的dma交换数据,内核空间的地址起了桥梁的作用,内核空间不论读写都要跟它来一次数据交换,这个数据交换是通过CPU实现的。而本申请中,是让用户空间和内核空间的地址成为一体,省去了CPU做内存拷贝的操作,从而在一定程度上提高了系统的性能。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。