一种内存分配方法、装置及系统的制作方法

文档序号:6370698阅读:195来源:国知局
专利名称:一种内存分配方法、装置及系统的制作方法
技术领域
本发明涉及计算机领域,尤其涉及一种内存分配方法、装置及系统。
背景技术
在计算机结构中,处理器与存储器是其中两个核心的组件。处理器主要用于运算,存储器主要用于存储数据。存储器的层次分类是一种呈金字塔结构的组织,塔尖是成本昂贵、容量较小、但是访问速度极快的硬件高速缓存存储器,中间还存在成本可控、访存速度相对较快的内存,塔基是成本低廉、容量很大、但是访问速度很慢的硬件磁盘。当前,计算机CPU的运算速度要远远高于从内存中存取数据的速度,而硬件高速缓存存储器位于CPU与内存之间,它的访存速度介于两者之间,如当前主流服务器中的LI ( 一级)高速缓存,L2 ( 二级)高速缓存,有些甚至有L3 (三级)高速缓存。一般来说,LLC (Last Level Cache,最后一级高速缓存)为当前物理CPU上的所有逻辑CPU共享使用。 当CPU处理数据时,首先在高速缓存存储器中查找所需的数据,若存在该数据,称为缓存命中,则直接返回,由CPU进行数据处理;若该数据处理不存在于高速缓存,称为缓存缺失,则访问内存查找所需数据,再返回CPU进行数据处理,并将该数据缓存在高速缓存存储器中。当新的数据需要缓存到高速缓存存储器时,必然有旧的数据需要被替换出去。被替换出来的数据有可能是用户态数据,也有可能是内核态数据。在数据替换的过程中,发明人发现在有限的资源下,操作系统和应用程序必然对高速缓存产生竞争,从而导致系统性能下降。

发明内容
本发明的实施例提供一种内存分配方法、装置及系统,用以一定程度上避免操作系统和应用程序对高速缓存的竞争,从而提高系统性能及数据处理效率。本发明的实施例采用如下技术方案一方面,本发明提供了一种内存分配方法,包括当一个线程需要分配内存时,识别所述线程的类型;所述内存包含多个物理内存页,且所述包含多个物理内存页的内存分为用户态内存区和内核态内存区,所述用户态内存区的物理内存页用于存储用户态数据和指令,所述内核态内存区的物理内存页用于存储内核态数据和指令;若所述线程为用户态线程,则从所述用户态内存区为该用户态线程分配内存;若所述线程为内核态线程,则从所述内核态内存区为该内核态线程分配内存。又一方面,本发明还提供了一种内存分配方法,包括从内核态内存区为内核代码分配内存,并将内核代码复制到分配的内存中;从用户态内存区为全局数据分配内存,并将全局数据复制到分配的内存中;所述内存包含多个物理内存页,且所述包含多个物理内存页的内存分为用户态内存区和内核态内存区,所述用户态内存区的物理内存页用于存储用户态数据和指令,所述内核态内存区的物理内存页用于存储内核态数据和指令;静态修改关于内核代码和全局数据的虚拟内存与物理内存的映射关系。又一方面,本发明还提供了一种内存分配装置,包括第一识别单元,用于当一个线程需要分配内存时,识别所述线程的类型,并在识别出所述线程为用户态线程的情况下,触发第一分配单元,在识别出所述线程为内核态线程的情况下,触发第二分配单元;所述内存包含多个物理内存页,且所述包含多个物理内存页的内存分为用户态内存区和内核态内存区,所述用户态内存区的物理内存页用于存储用户态数据和指令,所述内核态内存区的物理内存页用于存储内核态数据和指令;所述第一分配单元,用于从所述用户态内存区为该用户态线程分配内存;所述第二分配单元,用于从所述内核态内存区为该内核态线程分配内存。
又一方面,本发明还提供了一种内存分配装置,包括第一分配单元,用于从内核态内存区为内核代码分配内存,并将内核代码复制到分配的内存中;第二分配单元,用于从用户态内存区为全局数据分配内存,并将全局数据复制到分配的内存中;修改映射单元,用于静态修改关于内核代码和全局数据的虚拟内存与物理内存的映射关系;其中,所述内存包含多个物理内存页,且所述包含多个物理内存页的内存分为用户态内存区和内核态内存区,所述用户态内存区的物理内存页用于存储用户态数据和指令,所述内核态内存区的物理内存页用于存储内核态数据和指令。一方面,本发明还提供了一种内存,所述内存包含多个物理内存页,且所述包含多个物理内存页的内存分为用户态内存区和内核态内存区,所述用户态内存区的物理内存页用于存储用户态数据和指令,所述内核态内存区的物理内存页用于存储内核态数据和指令。一方面,本发明还提供了一种计算机系统,包括总线;与所述总线相连的处理器;与所述总线相连的内存;其中,所述处理器中包括上述任一种内存分配装置;所述内存为上述的内存;所述缓存与所述内存之间存在映射关系。另一方面,本发明还提供了一种计算机系统,包括总线;与所述总线相连的处理器;与所述总线相连的内存;其中,所述内存包含多个物理内存页,且所述包含多个物理内存页的内存分为用户态内存区和内核态内存区,所述用户态内存区的物理内存页用于存储用户态数据和指令,所述内核态内存区的物理内存页用于存储内核态数据和指令;所述处理器通过所述总线,调用所述内存中存储的代码,以用于当一个线程需要分配内存时,识别所述线程的类型;若所述线程为用户态线程,则从所述用户态内存区为该用户态线程分配内存;若所述线程为内核态线程,则从所述内核态内存区为该内核态线程分配内存。本发明提供的内存分配方法、装置及系统,通过将内存划分为用户态内存区和内核态内存区,并从用户态内存区为用户态线程分配内存,从内核态内存区为内核态线程分配内存;由于内存与缓存之间存在固定的映射关系,这样就相应的将高速缓存分成分别用于存储用户态数据和内核态数据的两部分,从而在一定程度上避免操作系统和应用程序对高速缓存的竞争,从而提高系统性能及数据处理效率。


为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图I为本发明实施例提供的一种内存分配方法流程图;图2为内存物理地址和缓存地址的映射关系;图3为本发明实施例提供的另一种内存分配方法流程图;图4为本发明实施例提供的又一种内存分配方法流程图;图5为链表示意图;图6为本发明实施例提供的再一种内存分配方法流程图;图7为本发明实施例提供的一种内存分配装置示意图;图8为本发明实施例提供的另一种内存分配装置示意图;图9为本发明实施例提供的一种计算机系统的示意图;图10为本发明实施例提供的另一种计算机系统的示意图。
具体实施例方式下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。如图I所示,本发明实施例提供了一种内存分配方法,包括S101、当一个线程需要分配内存时,识别所述线程的类型。其中,线程的类型包括用户态线程和内核态线程;通常情况下,用户态线程是用户应用程序提供服务时创建的线程,主要是在用户态空间运行,而内核态线程,是操作系统内核提供服务时创建的线程。另外,所述内存包含多个物理内存页,且所述包含多个物理内存页的内存分为用户态内存区和内核态内存区,所述用户态内存区的物理内存页用于存储用户态数据和指令,所述内核态内存区的物理内存页用于存储内核态数据和指令。优选的,所述包含多个物理内存页的内存分为用户态内存区和内核态内存区包括通过物理地址的页着色位将所述多个物理内存页划分为至少两个内存组,且所述至少两个内存组分为用户态内存区和内核态内存区;其中,同一内存组内的所有物理内存页的各物理地址的页着色位相同。下面参考图2所示的内存的物理地址和缓存地址的映射关系,简要介绍页着色位。内存的物理地址包括物理内存页编号和页内偏移量;其中,物理内存页编号用于索引当前物理地址属于哪个物理内存页,页内偏移量用于标记当前物理地址在当前物理内存页中的偏移量。缓存地址包括缓存标签、缓存组编号和组内偏移量;其中,缓存组编号用于索引当前缓存地址属于哪个缓存组,组内偏移量用于标记当前缓存地址在当前缓存组中的偏移量。由于硬件决定了物理内存与缓存之间存在固有的映射关系,因此数据在内存中的物理地址就决定了数据在缓存中缓存组编号和组内偏移量。页内偏移量的高位与缓存组编号的低位有部分重叠的位,为软件不可控制位;物理内存页编号的低位与缓存组编号的高位有部分重叠的位,为软件可控制位,称为页着色位。那么具有相同页着色位的物理内存页共享同一个缓存组集合,该缓存组集合包含至少一个缓存组。这样依据页着色位将内存划分为多个内存组,并且同一个内存组的内存页与缓存中的同一个缓存组集合对应。

上述优选方案中,通过物理地址的页着色位将所述多个物理内存页划分为至少两个内存组,且所述至少两个内存组分为用户态内存区和内核态内存区;另由上述内存的物理地址和缓存地址的映射关系可知,实质上缓存也相应分为两类,可以称为用户态缓存区和内核态缓存区,且两类缓存区中均包含有多个缓存组集合;其中,用户态缓存区供用户态使用,内核态缓存区供内核态使用。可选的,在所述识别所述线程的类型之前还可以包括当所述线程需要分配内存时,若操作系统发生缺页异常,则为所述线程的内存分配行为设置用户内存分配行为修饰符,具体的可以在所述线程所需调用函数中设置用户内存分配行为修饰符;所述用户内存分配行为修饰符用于标记当前内存分配行为由用户态线程触发。此时,SlOl中的识别所述线程的类型具体为识别所述线程的内存分配行为是否设置有用户内存分配行为修饰符;若所述线程的内存分配行为设置有用户内存分配行为修饰符,则确定所述线程为用户态线程;若所述线程的内存分配行为未设置有用户内存分配行为修饰符,则确定所述线程为内核态线程。其中,上述内存分配行为是计算机领域的常用熟语,所谓内存分配行为是指由处理器为线程分配内存的行为,内存分配行为可以由用户态线程触发,或者,可以由内核态线程触发。若SlOl中识别出所述线程为用户态线程,则进行S102 ;若SlOl中识别出所述线程为内核态线程,贝1J进行S103。进一步的,在执行S102或S103之前还可以利用以下方法中的任一种或以下方法的任意组合,以得到用户态内存区和内核态内存区的范围方法一、在操作系统启动时,获取所述操作系统启动参数中所设置的所述用户态内存区和/或内核态内存区的内存组的组数。其中,由于所有内存组的组数总和是一定的,故而若获取到用户态内存区所包含的内存组的组数,就相应的可以获取内核态内存区所包含的内存组的组数;同样若获取到内核态内存区所包含的内存组的组数,就相应的可以获取用户态内存区所包含的内存组的组数;当然,分别获取两个内存区所包含的内存组的组数也是可以的。如果采用这种方法,那么在操作系统运行中最好不要再做更改。方法二、在操作系统运行过程中,获取通过所述操作系统的内核交互接口设置的所述用户态内存区和/或内核态内存区的内存组的组数。示例的,在Iinux操作系统下,操作系统的内核交互接口可以是procfs接口或sysfs接口,用户在操作系统运行过程中可以修改至少一个内存区所包含的内存组的组数。方法三、在操作系统运行过程中,获取通过所述操作系统提供的系统调用接口设置的所述用户态内存区和/或内核态内存区的内存组的组数。如采用这种方法,用户在操作系统运行过程中可以修改至少一个内存区所包含的内存组的组数。 S102、从所述用户态内存区为该用户态线程分配内存。可选的,根据用户态内存区所包含的内存组的组数,从用户态内存区的范围内为用户态线程分配内存。S103、从所述内核态内存区为该内核态线程分配内存。可选的,根据内核态内存区所包含的内存组的组数,从内核态内存区的范围内为内核态线程分配内存。本发明提供的内存分配方法,通过将内存划分为用户态内存区和内核态内存区,并从用户态内存区为用户态线程分配内存,从内核态内存区为内核态线程分配内存;由于内存与缓存之间存在固定的映射关系,这样就相应的将高速缓存分成分别用于存储用户态数据和内核态数据的两部分,从而能够在一定程度上避免操作系统和应用程序对高速缓存的竞争,从而提高系统性能及数据处理效率。基于上述任一种内存分配方法的实施方式,如图3所示,当一个线程需要分配内存时,还可以进一步的包括S100、判断是否能够按照内存的划分为所述线程分配内存;若否,即若判断结果为不能按照内存的划分为所述线程分配内存,则进行步骤S104 ;若是,即若判断结果为能够按照内存的划分为所述线程分配内存,则按照内存的划分为所述线程分配内存,即转向SlOl以完成内存的分配。S104、按照操作系统默认的内存分配方法为所述线程分配内存;示例的,操作系统默认的内存分配方法可以是伙伴算法内存分配方法。本发明实施例还提供了一种基于每CPU链表的内存分配方法,如图4所示,所述方法包括S401、当一个线程需要从每CPU链表分配内存时,识别所述线程的类型。首先介绍一下链表的结构,示例的如图5所示,链表包括多个节点,每个节点中存储有一段内存存储空间的起始地址、该内存存储空间的大小(或者该内存存储空间的终止地址)以及下一个节点的入口地址。在本发明实施例中,所述每CPU链表分为用户链表和内核链表;其中,用户链表和内核链表的结构均可以参照图5中的结构。所述用户链表的各个节点指向的所述用户态内存区的物理内存页,所述用户链表的各个节点指向的所述内核态内存区的物理内存页。内存的划分仍可以参照上述实施例,在此不加赘述。与SlOl类似,可选的,在所述识别所述线程的类型之前还可以包括当所述线程需要分配内存时,若操作系统发生缺页异常,则为所述线程的内存分配行为设置用户内存分配行为修饰符;所述用户内存分配行为修饰符用于标记当前内存分配行为由用户态线程触发。此时,S401中识别线程的类型的过程可以采用与S401中相同的方式识别所述线程的内存分配行为是否设置有用户内存分配行为修饰符;若所述线程的内存分配行为设置有用户内存分配行为修饰符,则确定所述线程为用户态线程;若所述线程的内存分配行为未设置有用户内存分配行为修饰符,则确定所述线程为内核态线程。在S401中识别出所述线程为用户态线程的情况下,执行S402 ;在S401识别出所述线程为内核态线程的情况下,执行S405。S402、判断用户链表是否存在空闲的物理内存页; 若用户链表存在空闲的物理内存页,则进行步骤S403 ;若所述用户链表不存在空闲的物理内存页,则进行步骤S404。S403、从所述用户链表为所述线程分配内存。具体的,从所述用户链表中节点所指向的处于用户态内存区的空闲物理内存页,为所述线程分配内存。S404、从所述用户态内存区为所述用户链表分配预定数目的物理内存页,再从所述用户链表为所述用户态线程分配内存; S405、判断内核链表是否存在空闲的物理内存页。若所述内核链表存在空闲的物理内存页,此时进行步骤S406 ;若所述内核链表不存在空闲的物理内存页,此时进行步骤S407。S406、从所述内核链表为所述线程分配内存。具体的,从所述内核链表中节点所指向的处于内核态内存区的空闲物理内存页,为所述线程分配内存。S407、从所述内核态内存区为所述内核链表分配预定数目的物理内存页,再从所述内核链表为所述内核态线程分配内存。进一步的,上述S404中,在从所述用户态内存区为所述用户链表分配预定数目的物理内存页之后,还可以包括在为所述用户链表分配的物理内存页的页描述符中设置第一标记,用于标识当前物理内存页用于用户态线程;示例的,在当前物理内存页的页描述符结构的成员变量flag中设置第一标记;同样的,上述S407中,在从所述内核态内存区为所述内核链表分配预定数目的物理内存页之后,还可以包括在为所述内核链表分配的物理内存页的页描述符中设置第二标记,用于标识当前物理内存页用于内核态线程;示例的,在当前物理内存页的页描述符结构的成员变量flag中设置第二标记。更进一步的,上述内存分配方法还可以包括当物理内存页释放时,清除所述物理内存页的页描述符中所设置的标记(第一标记或第二标记),并将该物理内存页加入到操作系统默认内存分配方法的空闲页链表中。具体如下,当物理内存页释放时,判断页描述符中是否设置了与标记,如果设置了标记则清除该标记,并将清除标记的物理内存页加入到操作系统默认内存分配方法的空闲页链表中。其中,操作系统默认内存分配方法示例的,可以是伙伴算法内存分配方法;操作系统默认内存分配方法的空闲页链表,示例的,可以是伙伴算法空闲页链表。这样可以使得计算机系统实现本发明实施例提供的内存分配方法的同时,也能够很好的支持到现有内存分配方法,兼容性较好。进一步的,在S401识别所述线程的类型之前,还包括判断是否能够按照内存的划分为所述线程分配内存;若判断结果为否,即若不能按照内存的划分为所述线程分配内存,则按照操作系统默认的内存分配方法为所述线程分配内存;若判断结果为是,即若能够按照内存的划分为所述线程分配内存,则从S401开始执行,以按照内存的划分为所述线程分配内存。本发明实施例基于每CPU链表的设置完成用户态线程和内核态线程在不同内存 区的分配,从而能够在一定程度上避免操作系统和应用程序对高速缓存的竞争,从而提高系统性能及数据处理效率。基于上述内存的划分,即所述内存包含多个物理内存页,且所述包含多个物理内存页的内存分为用户态内存区和内核态内存区,所述用户态内存区的物理内存页用于存储用户态数据和指令,所述内核态内存区的物理内存页用于存储内核态数据和指令,为了降低内核代码和全局数据对于缓存的竞争,如图6所示,本发明实施例还提供了一种内存分配方法,包括S601、从内核态内存区为内核代码分配内存,并将内核代码复制到分配的内存中;S602、从用户态内存区为全局数据分配内存,并将全局数据复制到分配的内存中;需要说明的是,上述S601和S602之间无顺序关系。S603、静态修改关于内核代码和全局数据的虚拟内存与物理内存的映射关系。这样就使得虚拟内存地址可以通过修改后的映射关系,获取到内核代码或全局数据的物理内存地址。本发明提供的内存分配方法,通过将内存划分为用户态内存区和内核态内存区,并将内核代码复制到内核态内存区且将全局数据复制到用户态内存区;由于内存与缓存之间存在固定的映射关系,这样可以在一定程度上降低内核代码和全局数据对缓存的竞争。下面本发明实施例还提供了与上述内存分配方法相对应的内存分配装置,对内存分配装置中的各个单元的说明,可以参照上述方法各步骤中的描述,在以下装置实施例中将不加赘述。如图7所示,本发明实施例提供的内存分配装置,包括识别单元71,用于当一个线程需要分配内存时,识别所述线程的类型,并在识别出所述线程为用户态线程的情况下,触发第一分配单元72,在识别出所述线程为内核态线程的情况下,触发第二分配单元73 ;所述内存包含多个物理内存页,且所述包含多个物理内存页的内存分为用户态内存区和内核态内存区,所述用户态内存区的物理内存页用于存储用户态数据和指令,所述内核态内存区的物理内存页用于存储内核态数据和指令;所述第一分配单元72,用于从所述用户态内存区为该用户态线程分配内存;
所述第二分配单元73,用于从所述内核态内存区为该内核态线程分配内存。进一步的,如图7所示,还包括设置修饰符单元74,用于在所述线程需要分配内存时,若操作系统发生缺页异常,则为所述线程的内存分配行为设置用户内存分配行为修饰符;所述用户内存分配行为修饰符用于标记当前内存分配行为由用户态线程触发;所述识别单元71,具体用于识别所述线程的内存分配行为是否设置有用户内存分配行为修饰符;若所述线程的内存分配行为设置有用户内存分配行为修饰符,则确定所述线程为用户态线程;若所述线程的内存分配行为未设置有用户内存分配行为修饰符,则确定所述线程为内核态线程。优选的,用户态内存区和所述内核态内存区可以按照以下方式进行划分所述用户态内存区和所述内核态内存区分别包含至少一个内存组,且同一个内存组只属于其中一个内存区;其中,同一内存组内的所有物理内存页的各物理地址的页着色位相同; 这样,如图7所示,上述内存分配装置还包括获取单元75,用于在操作系统启动时,获取所述操作系统启动参数中所设置的所述用户态内存区和/或内核态内存区的内存组的组数;和/或,在操作系统运行过程中,获取通过所述操作系统的内核交互接口设置的所述用户态内存区和/或内核态内存区的内存组的组数;和/或,在操作系统运行过程中,获取通过所述操作系统提供的系统调用接口设置的所述用户态内存区和/或内核态内存区的内存组的组数。这样使得第一分配单元72和第二分配单元73可以通过获取单元75所获取的组数,在不同的内存区为不同的类型的线程分配内存。在上述内存分配装置的基础上,还可以进一步的包括判断单元76和系统默认分配单元77 ;所述系统默认分配单元77,用于按照操作系统默认的内存分配方法为所述线程分配内存;所述判断单元76用于当一个线程需要分配内存时,判断是否能够按照内存的划分为所述线程分配内存;若所述判断单元76的判断结果为不能按照内存的划分为所述线程分配内存,则触发所述系统默认分配单元77,若判断结果为能够按照内存的划分为所述线程分配内存,则触发所述识别单元71。进一步的,基于每CPU链表的分配方案,上述提供了任一内存分配装置中,所述识别单元71,具体用于当一个线程需要从CPU链表分配内存时,识别所述线程的类型;所述CPU链表分为用户链表和内核链表,所述用户链表的各个节点指向的所述用户态内存区的物理内存页,所述用户链表的各个节点指向的所述内核态内存区的物理内存页;所述第一分配单元72,具体用于在所述用户链表存在空闲的物理内存页的情况下,从所述用户链表为所述用户态线程分配内存;在所述用户链表为不存在空闲的物理内存页的情况下,从所述用户态内存区为所述用户链表分配预定数目的物理内存页,再从所述用户链表为所述用户态线程分配内存;所述第二分配单元73,具体用于在所述内核链表存在空闲的物理内存页的情况下,从所述内核链表为所述内核态线程分配内存;在所述内核链表不存在空闲的物理内存页的情况下,从所述内核态内存区为所述内核链表分配预定数目的物理内存页,再从所述内核链表为所述内核态线程分配内存。进一步的,所述第一分配单元72还用于,在为所述用户链表分配的物理内存页的页描述符中设置第一标记,用于标识当前物理内存页用于用户态线程;所述第二分配单元73还用于,在为所述内核链表分配的物理内存页的页描述符中设置第二标记,用于标识当前物理内存页用于内核态线程。更进一步的,所述装置还包括清除标记单元78和加入链表单元79 ;所述清除标识单元78,用于当物理内存页释放时,清除所述物理内存页的页描述符中所设置的标记;所述加入链表单元79,用于将清除标记后的物理内存页加入到操作系统默认内存分配方法的空闲页链表中。 上述内存分配装置基于内存的划分,就相应的将高速缓存分成分别用于存储用户态数据和内核态数据的两部分,从而可以在一定程度上避免操作系统和应用程序对高速缓
存的竞争。如图8所示,本发明提供了一种内存分配装置,包括第一分配单元81,用于从内核态内存区为内核代码分配内存,并将内核代码复制到分配的内存中;第二分配单元82,用于从用户态内存区为全局数据分配内存,并将全局数据复制到分配的内存中;修改映射单元83,用于静态修改关于内核代码和全局数据的虚拟内存与物理内存的映射关系;其中,所述内存包含多个物理内存页,且所述包含多个物理内存页的内存分为用户态内存区和内核态内存区,所述用户态内存区的物理内存页用于存储用户态数据和指令,所述内核态内存区的物理内存页用于存储内核态数据和指令。这样基于内存的划分,可以一定程度上避免内核代码和全局数据对缓存的竞争。本发明实施例还提供了一种内存,所述内存包含多个物理内存页,且所述包含多个物理内存页的内存分为用户态内存区和内核态内存区,所述用户态内存区的物理内存页用于存储用户态数据和指令,所述内核态内存区的物理内存页用于存储内核态数据和指令。优选的,所述包含多个物理内存页的内存分为用户态内存区和内核态内存区包括通过物理地址的页着色位将所述多个物理内存页划分为至少两个内存组,且所述至少两个内存组分为用户态内存区和内核态内存区;其中,同一内存组内的所有物理内存页的各物理地址的页着色位相同。本发明实施例还提供了一种计算机系统,包括总线91;与所述总线91相连的处理器92 ;与所述总线91相连的内存93 ;其中,所述处理器中包括上述任一内存分配装置;所述内存为上述任一内存。上述计算机系统还可以进一步包括与总线91相连接的用户接口 94。
本发明实施例还提供了一种计算机系统,包括总线101 ;与所述总线101相连的处理器102 ;与所述总线101相连的内存103 ;其中,所述内存103包含多个物理内存页,且所述包含多个物理内存页的内存分为用户态内存区和内核态内存区,所述用户态内存区的物理内存页用于存储用户态数据和指令,所述内核态内存区的物理内存页用于存储内核态数据和指令;所述处理器102通过所述总线,调用所述内存中存储的代码,以用于当一个线程需要分配内存时,识别所述线程的类型;若所述线程为用户态线程,则从所述用户态内存区为该用户态线程分配内存;若所述线程为内核态线程,则从所述内核态内存区为该内核态线程分配内存。上述计算机系统还可以进一步包括与总线101相连接的用户接口 104。 可选的,所述处理器102还用于当所述线程需要分配内存时,若操作系统发生缺页异常,则为所述线程的内存分配行为设置用户内存分配行为修饰符;所述用户内存分配行为修饰符用于标记当前内存分配行为由用户态线程触发。此时上述处理器102识别所述线程的类型的功能,可以为识别所述线程的内存分配行为是否设置有用户内存分配行为修饰符;若所述线程的内存分配行为设置有用户内存分配行为修饰符,则确定所述线程为用户态线程;若所述线程的内存分配行为未设置有用户内存分配行为修饰符,则确定所述线程为内核态线程。可选的,所述包含多个物理内存页的内存分为用户态内存区和内核态内存区包括通过物理地址的页着色位将所述多个物理内存页划分为至少两个内存组,且所述至少两个内存组分为用户态内存区和内核态内存区;其中,同一内存组内的所有物理内存页的各物理地址的页着色位相同。此时,所述处理器102还用于在操作系统启动时,获取所述操作系统启动参数中所设置的所述用户态内存区和/或内核态内存区的内存组的组数;和/或,在操作系统运行过程中,获取通过所述操作系统的内核交互接口设置的所述用户态内存区和/或内核态内存区的内存组的组数;和/或,在操作系统运行过程中,获取通过所述操作系统提供的系统调用接口设置的所述用户态内存区和/或内核态内存区的内存组的组数。可选的,所述处理器102还用于当一个线程需要分配内存时,判断是否能够按照内存的划分为所述线程分配内存;若判断结果为不能按照内存的划分为所述线程分配内存,则按照操作系统默认的内存分配方法为所述线程分配内存;若判断结果为能够按照内存的划分为所述线程分配内存,则按照内存的划分为所述线程分配内存。可选的,所述处理器102分配内存为从每CPU链表分配内存;其中,所述每CPU链表分为用户链表和内核链表,所述用户链表的各个节点指向的所述用户态内存区的物理内存页,所述用户链表的各个节点指向的所述内核态内存区的物理内存页;此时,所述处理器102用于在所述线程为用户态线程的情况下,若所述用户链表存在空闲的物理内存页,则从所述用户链表为所述用户态线程分配内存;若所述用户链表为不存在空闲的物理内存页,则从所述用户态内存区为所述用户链表分配预定数目的物理内存页,再从所述用户链表为所述用户态线程分配内存;在所述线程为内核态线程的情况下,若所述内核链表存在空闲的物理内存页,则从所述内核链表为所述内核态线程分配内存;若所述内核链表不存在空闲的物理内存页,则从所述内核态内存区为所述内核链表分配预定数目的物理内存页,再从所述内核链表为所述内核态线程分配内存。进一步可选的,所述处理器102还用于在从所述用户态内存区为所述用户链表分配预定数目的物理内存页之后,在为所述用户链表分配的物理内存页的页描述符中设置第一标记,用于标识当前物理内存页用于用户态线程;在从所述内核态内存区为所述内核链表分配预定数目的物理内存页之后,在为所述内核链表分配的物理内存页的页描述符中设置第二标记,用于标识当前物理内存页用于内核态线程。更进一步,可选的,所述处理器102还用于当物理内存页释放时,清除所述物理 内存页的页描述符中所设置的标记,并将该物理内存页加入到操作系统默认内存分配方法的空闲页链表中。上述任一计算机系统还可以包括缓存,该缓存可以设置在处理器中,作为该处理器中多个处理器核的共享缓存。需要说明的是,本发明实施例中的缓存通常可以是硬件高速缓存,但不限于最后一级高速缓存,而可以是任何一个被多个处理器核共享的缓存。上述计算机系统不限于多核计算机系统,而可以是任何由多个处理器核共享同一缓存的系统。本发明提供的内存分配装置、内存及计算机系统,通过将内存划分为用户态内存区和内核态内存区,并在用户态内存区为用户态线程分配内存,在内核态内存区为内核态线程分配内存;由于内存与缓存之间存在固定的映射关系,这样就相应的将高速缓存分成分别用于存储用户态数据和内核态数据的两部分,从而避免操作系统和应用程序对高速缓存的竞争;另外,基于上述内存的划分,还可以一定程度上避免内核代码和全局数据对高速缓存的竞争,从而提高系统性能及数据处理效率。本领域普通技术人员可以理解实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括R0M、RAM、磁碟或者光盘等各种可以存储程序代码的介质。以上所述,仅为本发明的具体实施方式
,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。
权利要求
1.一种内存分配方法,其特征在于,包括 当一个线程需要分配内存时,识别所述线程的类型;所述内存包含多个物理内存页,且所述包含多个物理内存页的内存分为用户态内存区和内核态内存区,所述用户态内存区的物理内存页用于存储用户态数据和指令,所述内核态内存区的物理内存页用于存储内核态数据和指令; 若所述线程为用户态线程,则从所述用户态内存区为该用户态线程分配内存; 若所述线程为内核态线程,则从所述内核态内存区为该内核态线程分配内存。
2.根据权利要求I所述的内存分配方法,其特征在于,在所述识别所述线程的类型之前还包括 当所述线程需要分配内存时,若操作系统发生缺页异常,则为所述线程的内存分配行为设置用户内存分配行为修饰符;所述用户内存分配行为修饰符用于标记当前内存分配行为由用户态线程触发; 所述识别所述线程的类型包括 识别所述线程的内存分配行为是否设置有用户内存分配行为修饰符; 若所述线程的内存分配行为设置有用户内存分配行为修饰符,则确定所述线程为用户态线程;若所述线程的内存分配行为未设置有用户内存分配行为修饰符,则确定所述线程为内核态线程。
3.根据权利要求I或2所述的内存分配方法,其特征在于,所述包含多个物理内存页的内存分为用户态内存区和内核态内存区包括 通过物理地址的页着色位将所述多个物理内存页划分为至少两个内存组,且所述至少两个内存组分为用户态内存区和内核态内存区;其中,同一内存组内的所有物理内存页的各物理地址的页着色位相同; 所述方法还包括 在操作系统启动时,获取所述操作系统启动参数中所设置的所述用户态内存区和/或内核态内存区的内存组的组数;和/或, 在操作系统运行过程中,获取通过所述操作系统的内核交互接口设置的所述用户态内存区和/或内核态内存区的内存组的组数;和/或, 在操作系统运行过程中,获取通过所述操作系统提供的系统调用接口设置的所述用户态内存区和/或内核态内存区的内存组的组数。
4.根据权利要求1-3任一项所述的内存分配方法,其特征在于,在识别所述线程的类型之前,所述方法还包括 当一个线程需要分配内存时,判断是否能够按照内存的划分为所述线程分配内存;若判断结果为不能按照内存的划分为所述线程分配内存,则按照操作系统默认的内存分配方法为所述线程分配内存; 若判断结果为能够按照内存的划分为所述线程分配内存,则按照内存的划分为所述线程分配内存。
5.根据权利要求1-4任一项所述的内存分配方法,其特征在于,所述分配内存为从每CPU链表分配内存;其中,所述每CPU链表分为用户链表和内核链表,所述用户链表的各个节点指向的所述用户态内存区的物理内存页,所述用户链表的各个节点指向的所述内核态内存区的物理内存页; 所述若所述线程为用户态线程,则从所述用户态内存区为该用户态线程分配内存包括 在所述线程为用户态线程的情况下,若所述用户链表存在空闲的物理内存页,则从所述用户链表为所述用户态线程分配内存;若所述用户链表为不存在空闲的物理内存页,则从所述用户态内存区为所述用户链表分配预定数目的物理内存页,再从所述用户链表为所述用户态线程分配内存; 所述若所述线程为内核态线程,则从所述内核态内存区为该内核态线程分配内存包括 在所述线程为内核态线程的情况下,若所述内核链表存在空闲的物理内存页,则从所述内核链表为所述内核态线程分配内存;若所述内核链表不存在空闲的物理内存页,则从所述内核态内存区为所述内核链表分配预定数目的物理内存页,再从所述内核链表为所述内核态线程分配内存。
6.根据权利要求5所述的内存分配方法,其特征在于,在从所述用户态内存区为所述用户链表分配预定数目的物理内存页之后,还包括在为所述用户链表分配的物理内存页的页描述符中设置第一标记,用于标识当前物理内存页用于用户态线程; 在从所述内核态内存区为所述内核链表分配预定数目的物理内存页之后,还包括在为所述内核链表分配的物理内存页的页描述符中设置第二标记,用于标识当前物理内存页用于内核态线程。
7.根据权利要求6所述的内存分配方法,其特征在于,还包括当物理内存页释放时,清除所述物理内存页的页描述符中所设置的标记,并将该物理内存页加入到操作系统默认内存分配方法的空闲页链表中。
8.—种内存分配方法,其特征在于,包括 从内核态内存区为内核代码分配内存,并将内核代码复制到分配的内存中;从用户态内存区为全局数据分配内存,并将全局数据复制到分配的内存中;所述内存包含多个物理内存页,且所述包含多个物理内存页的内存分为用户态内存区和内核态内存区,所述用户态内存区的物理内存页用于存储用户态数据和指令,所述内核态内存区的物理内存页用于存储内核态数据和指令; 静态修改关于内核代码和全局数据的虚拟内存与物理内存的映射关系。
9.一种内存分配装置,其特征在于,包括 识别单元,用于当一个线程需要分配内存时,识别所述线程的类型,并在识别出所述线程为用户态线程的情况下,触发第一分配单元,在识别出所述线程为内核态线程的情况下,触发第二分配单元;所述内存包含多个物理内存页,且所述包含多个物理内存页的内存分为用户态内存区和内核态内存区,所述用户态内存区的物理内存页用于存储用户态数据和指令,所述内核态内存区的物理内存页用于存储内核态数据和指令; 所述第一分配单元,用于从所述用户态内存区为该用户态线程分配内存; 所述第二分配单元,用于从所述内核态内存区为该内核态线程分配内存。
10.根据权利要求9所述的内存分配装置,其特征在于,还包括设置修饰符单元,用于在所述线程需要分配内存时,若操作系统发生缺页异常,则为所述线程的内存分配行为设置用户内存分配行为修饰符;所述用户内存分配行为修饰符用于标记当前内存分配行为由用户态线程触发; 所述识别单元,具体用于识别所述线程的内存分配行为是否设置有用户内存分配行为修饰符;若所述线程的内存分配行为设置有用户内存分配行为修饰符,则确定所述线程为用户态线程;若所述线程的内存分配行为未设置有用户内存分配行为修饰符,则确定所述线程为内核态线程。
11.根据权利要求9或10所述的内存分配装置,其特征在于,所述用户态内存区和所述内核态内存区分别包含至少一个内存组,且同一个内存组只属于其中一个内存区;其中,同一内存组内的所有物理内存页的各物理地址的页着色位相同; 所述装置还包括 获取单元,用于在操作系统启动时,获取所述操作系统启动参数中所设置的所述用户态内存区和/或内核态内存区的内存组的组数;和/或, 在操作系统运行过程中,获取通过所述操作系统的内核交互接口设置的所述用户态内存区和/或内核态内存区的内存组的组数;和/或, 在操作系统运行过程中,获取通过所述操作系统提供的系统调用接口设置的所述用户态内存区和/或内核态内存区的内存组的组数。
12.根据权利要求9-11任一项所述的内存分配装置,其特征在于,还包括判断单元和系统默认分配单元; 所述系统默认分配单元,用于按照操作系统默认的内存分配方法为所述线程分配内存; 所述判断单元用于当一个线程需要分配内存时,判断是否能够按照内存的划分为所述线程分配内存;若所述判断单元的判断结果为不能按照内存的划分为所述线程分配内存,则触发所述系统默认分配单元,若判断结果为能够按照内存的划分为所述线程分配内存,则触发所述识别单元。
13.根据权利要求9-12任一项所述的内存分配装置,其特征在于, 所述识别单元,用于当一个线程需要从每CPU链表分配内存时,识别所述线程的类型;所述每CPU链表分为用户链表和内核链表,所述用户链表的各个节点指向的所述用户态内存区的物理内存页,所述用户链表的各个节点指向的所述内核态内存区的物理内存页; 所述第一分配单元,用于在所述用户链表存在空闲的物理内存页的情况下,从所述用户链表为所述用户态线程分配内存;在所述用户链表为不存在空闲的物理内存页的情况下,从所述用户态内存区为所述用户链表分配预定数目的物理内存页,再从所述用户链表为所述用户态线程分配内存; 所述第二分配单元,用于在所述内核链表存在空闲的物理内存页的情况下,从所述内核链表为所述内核态线程分配内存;在所述内核链表不存在空闲的物理内存页的情况下,从所述内核态内存区为所述内核链表分配预定数目的物理内存页,再从所述内核链表为所述内核态线程分配内存。
14.根据权利要求13所述的装置,其特征在于,所述第一分配单元还用于,在为所述用户链表分配的物理内存页的页描述符中设置第一标记,用于标识当前物理内存页用于用户态线程;所述第二分配单元还用于,在为所述内核链表分配的物理内存页的页描述符中设置第二标记,用于标识当前物理内存页用于内核态线程。
15.根据权利要求14所述的装置,其特征在于,所述装置还包括清除标记单元和加入链表单元; 所述清除标识单元,用于当物理内存页释放时,清除所述物理内存页的页描述符中所设置的标记; 所述加入链表单元,用于将清除标记后的物理内存页加入到操作系统默认内存分配方法的空闲页链表中。
16.一种内存分配装置,其特征在于,包括 第一分配单元,用于从内核态内存区为内核代码分配内存,并将内核代码复制到分配的内存中; 第二分配单元,用于从用户态内存区为全局数据分配内存,并将全局数据复制到分配的内存中; 修改映射单元,用于静态修改关于内核代码和全局数据的虚拟内存与物理内存的映射关系;其中, 所述内存包含多个物理内存页,且所述包含多个物理内存页的内存分为用户态内存区和内核态内存区,所述用户态内存区的物理内存页用于存储用户态数据和指令,所述内核态内存区的物理内存页用于存储内核态数据和指令。
17.—种内存,其特征在于,所述内存包含多个物理内存页,且所述包含多个物理内存页的内存分为用户态内存区和内核态内存区,所述用户态内存区的物理内存页用于存储用户态数据和指令,所述内核态内存区的物理内存页用于存储内核态数据和指令。
18.根据权利要求17所述的内存,其特征在于,所述包含多个物理内存页的内存分为用户态内存区和内核态内存区包括 通过物理地址的页着色位将所述多个物理内存页划分为至少两个内存组,且所述至少两个内存组分为用户态内存区和内核态内存区;其中,同一内存组内的所有物理内存页的各物理地址的页着色位相同。
19.一种计算机系统,其特征在于,包括 总线; 与所述总线相连的处理器; 与所述总线相连的内存; 其中,所述处理器中包括如权利要求9至权利要求16任一项所述的内存分配装置;所述内存为权利要求17或18所述的内存。
20.一种计算机系统,其特征在于,包括 总线; 与所述总线相连的处理器; 与所述总线相连的内存; 其中,所述内存包含多个物理内存页,且所述包含多个物理内存页的内存分为用户态内存区和内核态内存区,所述用户态内存区的物理内存页用于存储用户态数据和指令,所述内核态内存区的物理内存页用于存储内核态数据和指令;所述处理器通过所述总线,调用所述内存中存储的代码,以用于当一个线程需要分配内存时,识别所述线程的类型;若所述线程为用户态线程,则从所述用户态内存区为该用户态线程分配内存;若所述线程为内核态线程,则从所述内核态内存区为该内核态线程分配内存。
21.根据权利要求20所述的计算机系统,其特征在于,所述处理器还用于当所述线程需要分配内存时,若操作系统发生缺页异常,则为所述线程的内存分配行为设置用户内存分配行为修饰符;所述用户内存分配行为修饰符用于标记当前内存分配行为由用户态线程触发。
22.根据权利要求20或21所述的计算机系统,其特征在于,所述处理器还用于当所述线程需要分配内存时,在识别所述线程的类型之前,判断是否能够按照内存的划分为所述线程分配内存; 若判断结果为不能按照内存的划分为所述线程分配内存,则按照操作系统默认的内存分配方法为所述线程分配内存; 若判断结果为能够按照内存的划分为所述线程分配内存,则按照内存的划分为所述线程分配内存。
23.根据权利要求20-22任一项所述的计算机系统,其特征在于,所述分配内存为从每CPU链表分配内存;其中,所述每CPU链表分为用户链表和内核链表,所述用户链表的各个节点指向的所述用户态内存区的物理内存页,所述用户链表的各个节点指向的所述内核态内存区的物理内存页; 所述处理器用于在所述线程为用户态线程的情况下,若所述用户链表存在空闲的物理内存页,则从所述用户链表为所述用户态线程分配内存;若所述用户链表为不存在空闲的物理内存页,则从所述用户态内存区为所述用户链表分配预定数目的物理内存页,再从所述用户链表为所述用户态线程分配内存; 在所述线程为内核态线程的情况下,若所述内核链表存在空闲的物理内存页,则从所述内核链表为所述内核态线程分配内存;若所述内核链表不存在空闲的物理内存页,则从所述内核态内存区为所述内核链表分配预定数目的物理内存页,再从所述内核链表为所述内核态线程分配内存。
全文摘要
本发明公开了一种内存分配方法、装置及系统,涉及计算机领域,用以一定程度上避免操作系统和应用程序对高速缓存的竞争,从而提高系统性能及数据处理效率。所述内存分配方法包括当一个线程需要分配内存时,识别所述线程的类型;所述内存包含多个物理内存页,且所述包含多个物理内存页的内存分为用户态内存区和内核态内存区,所述用户态内存区的物理内存页用于存储用户态数据和指令,所述内核态内存区的物理内存页用于存储内核态数据和指令;若所述线程为用户态线程,则从所述用户态内存区为该用户态线程分配内存;若所述线程为内核态线程,则从所述内核态内存区为该内核态线程分配内存。
文档编号G06F12/08GK102819497SQ20121017690
公开日2012年12月12日 申请日期2012年5月31日 优先权日2012年5月31日
发明者刘仪阳, 张知皦, 方帆, 陈渝, 崔岩 申请人:华为技术有限公司, 清华大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1