高并行的实时内存资源管理调度方法

文档序号:6436949阅读:141来源:国知局
专利名称:高并行的实时内存资源管理调度方法
技术领域
本发明涉及一种内存资源管理调度方法,具体来说涉及一种高并行的实时内存资源管理调度方法。
背景技术
由于大多数大型的实时/历史数据库系统都开发于20世纪80年代,当时多线程技术刚刚处于探讨研发阶段、多核并行技术和大容量物理内存技术也尚未萌芽。从而导致目前主流的实时/历史数据库系统并未能充分适应现代硬件多核和高内存容量工业级服务器,也就是通常不能期望通过新增硬件资源来或者线性的可扩展性。然而到如今,从计算机硬软件到编程技术领域都在飞速发展,计算机领域的多核技术、多节点高速物理内存技术都已经成为成熟稳定的并行技术支撑。受传统单处理器和低容量物理内存开发模型的影响,目前主流的实时/历史数据库软件并未最大限度地发挥现代工业级服务器的设备优势。主要体现在a、大部分软件系统还采用多个物理处理器串行共享一个全局物理内存资源的分配回收模型;b、大部分软件系统虽然采用了内存池等技术,但是还存在着“假共享” 而导致性能不高,而“假共享”的分析和定位往往具有非常高的复杂度;C、大部分软件系统并未对线程的调度策略做可预见性优化,因此导致现成上下文切换过于频繁而影响了处理器层级的代码执行优化策略;一个典型的传统实时/历史数据库系统的内存资源管理调度模型如附图1所示,从图中可以看出传统的模型中多线程可以很好地运行起来,但是当运行在多核处理器上面多个线程同时提出并发的内存资源请求时,他们又必须被串行化,加锁互斥以达到多线程安全性。无论物理的内存和处理器资源升级或者发展到什么程度,这都将成为高性能并发实时应用系统的缺陷和障碍。现有技术的缺点主要体现在A.内存分配是串行的,无法充分发挥现代多核处理器服务器的并行优势;B.现有技术容易造成“假共享”,也就是说表面上看数据是共享于多个物理处理器之间,但是实际上引入了非常严重的数据同步开销,得不偿失;如附图2所示,现在主流的内存管理模型中,一般都存在着这样的问题当三个独立的线程来申请内存,由于真正执行的动作是串行化的,因此“地址一”、“地址二”和“地址三”将分别被分派给三个不同的线程。但是由于这三个地址和数据内容都位于CPU(处理器)的同一个Cache Line范围内, 后续当任何一个线程对其所得到的地址空间内进行数据操作时,操作系统和CPU的缓存协议都会强制性地发起一次数据同步操作,即这个Cache Line地址范围内的所有数据同步到其它CPU的缓存地址空间。即使当前线程只修改或者操作了自己地址空间内的数据内容, 操作系统和CPU的缓存协议都会做数据同步的操作,因此带来了额外的负担,而这种数据同步将极大地占用CPU内部的数据总线。从这个微观的角度讲,在现行的内存管理调度模型下,如果应用系统中存在着频繁的细粒度内存申请和释放,系统的CPU扩展得越多,反而会导致内存的使用性能降低;C.容易造成“内存碎片”;
D.互斥的粒度很大,造成分配的效率低下。

发明内容
本发明的目的在于提供一种高并行的实时内存资源管理调度方法,该方法解决了在现代多核高端商务服务器上并发内存资源调度瓶颈的问题,使得传统应用系统在无需任何代码改变的前提下,充分发掘现代计算机的硬件资源潜力,大幅提升软件系统的实时运行效率。本发明的目的可通过以下的技术措施来实现一种高并行的实时内存资源管理调度方法,包括初始化步骤,内存管理模块分配指定数量的内存作为管理堆,并将这些内存划分成多个内存块,再以双向链表的方式将这些内存块组织起来,作为空闲内存块链表;同时, 配置一个空的双向链表,作为已分配内存块链表;内存管理模块建立一个映射模块用于管理局部堆与线程之间的对应关系;内存管理步骤,当一个有动态内存管理需求的线程加入到内存管理模块后,映射模块负责为当前线程创建一个局部堆并维护这个局部堆和当前线程的对应关系;这个局部堆创建成功以后,从管理堆的空闲内存块链表中申请一定数量的内存块作为局部堆的内存,将这些内存块从空闲内存块链表中移出的同时加入到已分配内存块链表中;所述局部堆用于在线程的生命周期内负责处理当前线程的所有动态内存请求;动态内存分配步骤,如果局部堆中的内存足以满足当前线程申请的需求内存时, 直接在该局部堆内处理该线程的业务逻辑;否则,局部堆将从管理堆的空闲内存块链表中申请一定数量的内存块并追加到当前局部堆中,在将这些内存块从空闲内存块链表中移出的同时加入到已分配内存块链表中,再继续处理该线程的业务逻辑;归还动态内存步骤,处理完当前线程的业务逻辑后,归还当前线程的内存并结束当前线程。所述作为管理堆的内存的具体数量由内存管理模块根据应用程序的总内存需求进行相应配置。所述的每个内存块的大小为默认的系统页面大小。所述默认的系统页面大小为4096字节或者以每一个不同的操作系统的API接口
查询获得。所述映射模块为哈希表形式的映射表,并采用以树为内部数据结构的图(map)来管理维护该映射关系。所述动态内存请求包括分配、释放和动态扩充。所述动态内存请求还包括需求量超过一个线程栈的当前容量的内存请求。所述归还当前线程的内存的过程是判断当前线程是否有归还动态内存的需求, 如果无,则不进行任何操作;否则,根据配置再判断是否需要回收局部堆,如果是,则首先归还内存到局部堆,最后再将该局部堆对应的内存块回收到管理堆的空闲内存块链表中,以备其它局部堆申请内存块时重复利用这些内存块;否则,首先归还当前局部堆的全部内存到管理堆的空闲内存块链表中,然后销毁该局部堆。本发明对比现有技术,有如下优点
1、本发明将不仅彻底解决上述传统应用模型的局限性,而且还将新模型和调度策略有机地结合起来,达到硬件平台资源利用调度最优化。相比传统的应用模型,在同样的硬件环境中软件的处理能力将提供3-5倍以上。彻底解决了现代高端商务服务器应用中内存资源管理中分配释放速度、扩展性、并行效率和利用率等四个方面的问题。从而提高现代高端商务服务器应用中内存资源管理中分配释放速度、扩展性、并行效率和利用率等四个方面性能。2、本发明首先将串行化的分配行为转化为并行化处理模型,这样极大地提升了多个处理器同时申请内存资源时的性能。其实是巧妙地引入了“管理堆”和“局部堆”以及物理层的三层架构设计,在设计上将“假共享”的概率降到了最低甚至彻底避免了 “假共享”。 再者本发明在“局部堆”中创新性地加入了各个粒度级别的“环形缓冲队列”,使得分配的针对性得到了进一步的加强,因此客观上很好地避免了 “内存碎片”问题。最后,由于后续的分配操作大多数情况下都在“局部堆”完成,将现有技术中全局互斥的重粒度锁转换为无锁操作,大大地提升了分配效率。3、本发明不仅仅从架构设计上最大限度地现在多核高端商务服务器应用中的内存分配调度瓶颈,让多个并发运行的线程对内存的申请和释放最大限度的并行化。更重要的是,在全局堆的设计中,我们将对局部堆中所管理的内存作进一步的优化和调度管理,最大限度都杜绝了 “假共享”所带来的性能问题。正是因为本发明很好地将一个串行的粗粒度锁模型巧妙地转化为接近于无锁的实时并行模型,在性能上将得到非常大的提升。应用系统在进行硬件资源扩展时,基本可以得到和资源成正比的性能提升,因此系统的可扩展性变得十分强大,具体的各个细节设计的有点将在下面各个环节的阐述中仔细说明。4、本发明方法可应用于任何有动态内存管理需求同时硬件环境为多核的软件系统中,应用范围广泛。


图1是本发明的高并行的实时内存资源管理调度方法的系统调度示意图;图2是图1所示高并行的实时内存资源管理调度方法中局部堆的结构示意图;图3是图1所示高并行的实时内存资源管理调度方法的流程图。
具体实施例方式图1示出了本发明的高并行的实时内存资源管理调度方法的总体逻辑架构为三层架构物理内存、管理堆和局部堆。直接构设于物理内存上面的是管理堆(全局堆),它负责直接和操作系统的物理存储之间交互分配、释放和调整。如图1所示,本发明的实时内存资源管理调度模型技术主要由三部分组成线程模块(100)、内存管理模块000),其中包含管理堆(210)和映射模块020),映射模块 (220)主要是维护线程编号到每一个线程的局部堆的对应关系,所以其中包含一个或者多个局部堆(221),具体包含多少个局部堆取决于实际运行的线程数目,最后一个是物理内存模块(300)。客户端线程(100)也可以有一个或者多个,具体的数目也是取决于实际的应用情况。本方法的处理过程如下
步骤一初始化步骤初始化步骤,内存管理模块(200)根据配置的参数从操作系统中申请获得所需的物理内存作为管理堆,指定管理堆的基本的配置参数,例如管理堆管理内存的总量、最大的线程数目、每一个局部堆可以管理的最大内存数目、每一个局部堆归还内存的阀值等一系列的参数。并将管理堆的这些内存划分成多个内存块,再以双向链表的方式将这些内存块组织起来,作为空闲内存块链表;同时,配置一个空的双向链表作为已分配内存块链表;内存管理模块建立一个映射模块用于管理线程与后面处理过程中生成的局部堆之间的对应关系;所述的每个内存块的大小为默认的系统页面大小4096字节或者以每一个不同的操作系统的API接口查询获得。管理堆的内存的具体数量由内存管理模块根据应用程序的总内存需求进行相应配置。映射模块为哈希表形式的映射表,并采用以树为内部数据结构的图(map)来管理维护该映射关系。初始化步骤中将所有的内存块组织起来的双向链表为空闲内存块链表,同时管理堆还将建立一个已分配内存块链表,用于管理已经能够分配给局部堆的内存块,初始化的时候这个已分配内存块链表为空。在管理堆初始化完成后,内存管理模块(200)将建立一个映射模块(220)用于管理局部堆与线程之间的对应关系,映射模块(220)还随着线程的不断加入而产生变化;这里的双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点,上述的内存块就是这个双向链表中的节点。步骤二 内存管理步骤应用程序启动,创建一个或者多个工作线程(100)。因此,接下来如图3所示,对一个线程进行内存实时调度的过程首先,判断当前线程是否有动态内存管理的需求,如果没有则不在本发明考虑范围,直接结束动态调度过程。当一个有动态内存管理需求的线程加入到内存管理模块后,映射模块负责为当前线程创建一个局部堆并维护这个局部堆和当前线程的对应关系;这个局部堆创建成功以后,从管理堆的空闲内存块链表中申请一定数量的内存块作为局部堆的内存,将这些内存块从空闲内存块链表中移出的同时加入到已分配内存块链表中;局部堆用于在线程的生命周期内负责处理当前线程的所有动态内存请求;动态内存请求包括分配、释放、动态扩充, 以及,需求量超过一个线程栈的当前容量的内存请求。对于有动态内存管理需求的每一个线程在运行起来以后,第一次向内存资源管理调度模型的实例申请内存的时候,内存管理模块(200)模块会为当前线程(100)创建一个局部堆,并建立当前线程编号到该线程对应的局部堆的映射关系。通常这个映射关系是一个哈希表,实际实施的过程中,也可以选择以树为内部数据结构的map来管理维护这个映射关系。步骤三动态内存分配步骤动态内存分配步骤,如果局部堆中的内存足以满足当前线程申请的需求内存时, 直接在该局部堆内处理该线程的业务逻辑;否则,局部堆将从管理堆的空闲内存块链表中申请一定数量的内存块并追加到当前局部堆中,在将这些内存块从空闲内存块链表中移出
6的同时加入到已分配内存块链表中,再继续处理该线程的业务逻辑;当局部堆内可用的内存不足以满足当前线程申请的需求内存的时候,则线程再从管理堆申请一个管理块添加到当前局部堆中,再继续处理该线程的业务逻辑;否则直接在该局部堆内处理该线程的业务逻辑;该局部堆(221)为当前线程(100)提供内存服务,所谓的提供内存服务包含三个细分的步骤a、判断局部堆021)内是否有足够的内存可以满足内存申请的需求,如果有足够的空闲内存空间,则直接返回给申请端;b、如果局部堆(221) 空闲的内存不足以满足请求,局部堆(221)会从管理堆(210)去申请额外的内存块来满足申请的需求;C、最后以满足申请需求的结果结束此次内存服务动作。接着,处理该线程(100)的业务逻辑,不同的线程的业务逻辑是不同的,在实时/ 历史数据库系统中,主要包含网络处理线程、实时数据处理线程、历史数据处理线程、压缩线程等几个种类。步骤四归还动态内存步骤归还动态内存步骤,处理完当前线程的业务逻辑后,归还当前线程的内存并结束当前线程。归还当前线程的内存的过程是判断当前线程是否有归还动态内存的需求,如果无,则不进行任何操作;否则,根据配置再判断是否需要回收局部堆,如果是,则首先归还内存到局部堆,最后再将该局部堆对应的内存块回收到管理堆的空闲内存块链表中,以备其它局部堆申请内存块时重复利用这些内存块;否则,首先归还当前局部堆的全部内存到管理堆的空闲内存块链表中,然后销毁该局部堆。因为这里所述的内存是从局部堆申请得到的,这里的归还是和申请对应的,从局部堆申请得到的内存在使用完成后,需要先归还给局部堆,再将局部堆归还给管理堆。处理完当前线程的业务逻辑后,归还当前线程的内存并结束当前线程,具体操作过程是 在处理完业务逻辑之后,判断当前线程是否有归还动态内存的需求,如果无,则直接结束本线程。 如果有内存归还的需求而且管理堆O01)配置回收局部堆021),那么就会首先归还内存到局部堆021),最后再回收局部堆到全局堆的管理中。 如果有内存归还的需求而管理堆(210)不回收局部堆021),那么管理堆(201) 会首先归还该局部堆021)的全部内存到管理堆010),然后删除该局部堆的实例。 当前工作线程(100)结束。如图2所示,在管理堆(210)中设计了基于Cache Line大小对齐的“管理块内存”, 每一个局部堆(221)对应其中一个或者多个“管理块内存”,杜绝了“假共享”导致的性能影响,即充分发掘了 CPU的缓存优势又带来了灵活的可扩展性,很好地避免了不必要的数据同步带来的数据总线浪费和指令周期。现在主流的内存管理模型中,一般都存在着这样的问题当三个独立的线程来申请内存,由于真正执行的动作是串行化的,因此分派给三个不同的线程的内存地址一般是连续的,并且位于CPU(处理器)的同一个Cache Line范围内。 因而后续当任何一个线程对其所得到的地址空间内进行数据操作时,操作系统和CPU的缓存协议都会强制性地发起一次数据同步操作,即这个Cache Line地址范围内的所有数据同步到其它CPU的缓存地址空间。即使当前线程只修改或者操作了自己地址空间内的数据内容,操作系统和CPU的缓存协议都会做数据同步的操作,因此带来了额外的负担,而这种数据同步将极大地占用CPU内部的数据总线。从这个微观的角度讲,在现行的内存管理调度模型下,如果应用系统中存在着频繁的细粒度内存申请和释放,系统的CPU扩展得越多,反而会导致内存的使用性能降低。本发明中局部堆(221)所管理维护的所有内存地址,其对应的Cache Line都不会被其它线程共享,管理堆在创建局部堆Q21)并为每ー个局部堆 (221)分派空闲内存块的时候,就是已CPU默认Cache Line大小为内存块的分配粒度的,因此可以很好地保证ー个Cache Line地址对应的内存块不会被其它线程所共享而进一歩引起“假共享”,当然ー个局部堆021)是可以对应多个Cache Line的内存空间的。如图3所示,在采用本发明的高并行实时内存资源管理调度之后,对于有动态内存服务需求的线程,在进入线程时会首先向管理堆(210)注册以获得ー个局部堆021)对象,局部堆021)对象会在线程的生命周期内负责处理该线程的所有动态内存请求。当然这里指的“有动态内存服务需求”是指广义的,和传统的从操作系统去申请内存是两个不同的概念,只要任何有内存需求而需求量又超过ー个线程栈的当前容量吋,我们都可以认为 “有动态内存服务需求”。在获得局部堆021)对象后,线程内便可以灵活地获得或者释放内存,在申请内存的事情,只有当局部堆021)内可用的内存不足以满足申请的需求的时候,局部堆(221)才会向管理堆OlO)申请ー个管理块。因此在绝大多数的情况下,局部堆 (221)进行的都是无锁的内存申请和释放,效率非常高。不仅如此,在同一个局部堆(221) 内,由于所使用的内存都是从管理堆(210)分配的管理块,每ー个局部堆021)的内存块不会和其它线程共享ー个Cache Line内的内存地址空间,因此在进行数据读写操作吋,将进一歩避免了数据同步的负担。综合上述两方面的优势,本发明的内存分配调度策略将获得非常高效的速度和稳定性优势。単一的管理堆和操作系统物理内存之间的申请和释放是串行的,效率比较低下。 本发明在此基础上再引入了管理堆,因此保证在应用程序运行时内存的申请和释放都是高效的并行操作,因为应用程序的各个线程都是直接和各自对应的局部堆交互,进行申请和释放。另外ー种情况是应用程序实时运行的过程中发现管理堆预分配的空闲内存块已经不足以满足局部堆请求的时候,需要进行串行化的内存操作,但是这种情况一般可通过合理的优化配置进行避免或者将发生概率降低到最低与此同吋,在每ー个局部堆里面,维护可定制的初始化页面数量、已分配的页面数量和可用的页面数量等信息,每ー个线程在运行态的请求和释放一般都是无锁的高效请求。只有当线程对应的局部堆可用内存不足或者空闲页面过多时,才会向管理堆发起申请请求或者释放的请求。根据实际场景和统计经验,大多数情况下可以将各个局部堆的參数设置得较为优化,从而保证运行期间向管理堆提出串行请求的几率大大降低甚至彻底屏蔽。本发明的实施方式不限于此,在本发明上述基本技术思想前提下,按照本领域的普通技术知识和惯用手段对本发明内容所做出其它多种形式的修改、替换或变更,均落在本发明权利保护范围之内。
权利要求
1.一种高并行的实时内存资源管理调度方法,其特征在于包括以下步骤初始化步骤,内存管理模块分配指定数量的内存作为管理堆,并将这些内存划分成多个内存块,再以双向链表的方式将这些内存块组织起来,作为空闲内存块链表;同时,配置一个空的双向链表,作为已分配内存块链表;内存管理模块建立一个映射模块用于管理局部堆与线程之间的对应关系;内存管理步骤,当一个有动态内存管理需求的线程加入到内存管理模块后,映射模块负责为当前线程创建一个局部堆并维护这个局部堆和当前线程的对应关系;这个局部堆创建成功以后,从管理堆的空闲内存块链表中申请一定数量的内存块作为局部堆的内存,将这些内存块从空闲内存块链表中移出的同时加入到已分配内存块链表中;所述局部堆用于在线程的生命周期内负责处理当前线程的所有动态内存请求;动态内存分配步骤,如果局部堆中的内存足以满足当前线程申请的需求内存时,直接在该局部堆内处理该线程的业务逻辑;否则,局部堆将从管理堆的空闲内存块链表中申请一定数量的内存块并追加到当前局部堆中,在将这些内存块从空闲内存块链表中移出的同时加入到已分配内存块链表中,再继续处理该线程的业务逻辑;归还动态内存步骤,处理完当前线程的业务逻辑后,归还当前线程的内存并结束当前线程。
2.根据权利要求1所述的高并行的实时内存资源管理调度方法,其特征在于所述作为管理堆的内存的具体数量由内存管理模块根据应用程序的总内存需求进行 相应配置。
3.根据权利要求1所述的高并行的实时内存资源管理调度方法,其特征在于所述的每个内存块的大小为默认的系统页面大小。
4.根据权利要求3所述的高并行的实时内存资源管理调度方法,其特征在于所述默认的系统页面大小为4096字节或者以每一个不同的操作系统的API接口查询获得。
5.根据权利要求1所述的高并行的实时内存资源管理调度方法,其特征在于所述映射模块为哈希表形式的映射表,并采用以树为内部数据结构的图(map)来管理维护该映射关系。
6.根据权利要求1所述的高并行的实时内存资源管理调度方法,其特征在于所述动态内存请求包括分配、释放和动态扩充。
7.根据权利要求6所述的高并行的实时内存资源管理调度方法,其特征在于所述动态内存请求还包括需求量超过一个线程栈的当前容量的内存请求。
8.根据权利要求1至7任意一项所述的高并行的实时内存资源管理调度方法,其特征在于所述归还当前线程的内存的过程是判断当前线程是否有归还动态内存的需求,如果无,则不进行任何操作;否则,根据配置再判断是否需要回收局部堆,如果是,则首先归还内存到局部堆,最后再将该局部堆对应的内存块回收到管理堆的空闲内存块链表中,以备其它局部堆申请内存块时重复利用这些内存块;否则,首先归还当前局部堆的全部内存到管理堆的空闲内存块链表中,然后销毁该局部堆。
全文摘要
本发明公开了一种高并行的实时内存资源管理调度方法,包括初始化步骤,内存管理模块分配指定数量的内存作为管理堆,并将这些内存划分成多个内存块;内存管理模块建立一个映射模块;内存管理步骤,当一个有动态内存管理需求的线程加入到内存管理模块后,映射模块负责为当前线程创建一个局部堆并维护这个局部堆和当前线程的对应关系;动态内存分配步骤;处理完当前线程的业务逻辑后,归还当前线程的内存并结束当前线程。该方法解决了在现代多核高端商务服务器上并发内存资源调度瓶颈的问题,使得传统应用系统在无需任何代码改变的前提下,充分发掘现代计算机的硬件资源潜力,大幅提升软件系统的实时运行效率。
文档编号G06F9/48GK102567107SQ201110337808
公开日2012年7月11日 申请日期2011年10月31日 优先权日2011年10月31日
发明者周伊琳, 孙建伟, 简怀兵, 陈扬, 陈炯聪, 黄缙华 申请人:广东电网公司电力科学研究院, 广州执舟软件有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1