一种内存操作的管理方法及系统的制作方法

文档序号:6480927阅读:157来源:国知局
专利名称:一种内存操作的管理方法及系统的制作方法
技术领域
本发明涉及内存管理技术领域,尤其涉及一种内存操作的管理方法及系统。
背景技术
目前,为了避免直接使用操作系统分配内存带来的内存碎片化问题,现有 技术一般都采用二级内存管理模式来管理内存。该二级内存管理模式的架构是 第一级由操作系统维护内存,第二级由进程维护内存。其中,进程通过内存池
的方式来对操作系统分配给它的内存进行维护。这里,将操作系统维护的内存 称为操作系统级内存,将进程维护的内存称为进程级内存池。图l为现有内存
池组织方式的示意图,如图1所示,内存池中内存块的大小一般为2n,大小相 同的内存块通过同一内存队列指针构成一个列表,内存池指针又将这些列表通 过各内存队列指针联系起来构成内存池。
当运用二级内存管理模式管理内存时,由于业务模块通过线程运行,而线
程本身没有内存块但可以享用其所属的进程的内存块,因此业务模块使用内存
块时需通过自身所属的线程向进程申请内存块;同样,当业务模块使用完内存 块后,也通过其所属的线程向进程释放内存块。众所周知,当线程向进程申请 或释放内存块时均需加锁,以保证在申请或释放时,只有该线程能访问该进程, 且只有当该线程访问完该进程进行解锁后,其它线程才能访问该进程。
随着科技的进步,如今计算机的硬件都在向多CPU方向发展,软件也在向 多进程、多线程方向发展,现有二级内存管理;漠式已不适用于这种应用环境。 因为在多线程运行的情况下,若每个线程都高频度地申请或释放内存块,则需 要频繁地进行加锁和解锁操作,这会造成线程之间相互等待,从而影响程序的 运行效率,也就不能充分利用多CPU这样的硬件条件。

发明内容
有鉴于此,本发明的主要目的在于提供一种内存操作的管理方法和系统, 以避免频繁地进行加锁和解锁操作,从而提高程序运行效率。 为达到上述目的,本发明的技术方案是这样实现的
一种内存操作的管理方法,设置由线程维护的线程级内存池,该方法还包

业务模块需要使用内存块时向线程申请,线程计算应分配的内存块的大小 后,查找自身的线程级内存池中是否存在所需大小的内存块,
如果存在,则线程从线程级内存池中分配相应大小的内存块给业务模块, 并结束内存申请流程;
否则,加锁并向进程申请一定数量所需大小的内存块;或者分配比所需大 小大一级的内存块给业务模块,并结束内存申请流程。
其中,所述相应大小的内存块为大小为2n的内存块,所述2。等于业务模 块申请的内存的大小,或2"为大于业务模块申请的内存大小的最小的2n。
其中,该方法进一步包括所述业务模块首次向线程申请内存块时,线程 向进程申请得到一定数量所需大小的内存块之后,开始生成自身的线程级内存 池。
其中,所述线程级内存池由线程局部存储技术、或者线程级内存管理对象 管理。
其中,所述线程向进程申请一定数量所需大小的内存块之后,该方法还包

进程查找自身的进程级内存池中是否存在所需数量所需大小的内存块,如 果存在,则进程分配相应凄t量相应大小的内存块给线程级内存池;否则,向操 作系统申请内存,所申请内存的大小大于等于线程向进程申请的所有内存块的 大小。
其中,所述进程向操作系统申请内存之后,该方法还包括
5操作系统查找自身是否存在进程所需大小的内存,如果不存在,则内存申
请失败,结束内存块申请流程;否则,为进程分配相应大小的内存,之后进程 将分配得到的内存划分成线程所需大小的内存块存入自身的进程级内存池中。
其中,所述进程将分配得到的内存划分成线程所需大小的内存块存入自身 的进程级内存池中之后,该方法还包括
进程分配相应数量相应大小的内存块给线程级内存池。
其中,所述进程分配相应数量相应大小的内存块给线程级内存池之后,该 方法还包括
解锁;然后从线程级内存池中分配相应大小的内存块给业务模块,并结束 内存块申请流程。
其中,该方法进一步包括 业务模块向线程释放一定大小的内存块; 将释放的内存块存入线程的线程级内存池;
判断线程级内存池中该大小的内存块是否超过指定数目,如果未超过指定 数目,则结束内存块释放流程;否则,加锁并向进程释放一定数目的该大小的 内存块,然后解锁,并结束内存块释放流程。
一种内存操作的管理系统,包括一级内存管理单元、二级内存管理单元及 三级内存管理单元;其中,
一级内存管理单元,用于由操作系统维护内存,当进程向操作系统申请内 存时由操作系统为进程分配内存;
二级内存管理单元,用于由进程以进程级内存池的方式维护内存,当线程
池;
三级内存管理单元,用于由线程以线程级内存池的方式维护内存。 由以上技术方案可以看出,采用本发明的三级内存管理模式,若业务模块 需使用内存块,则可以直接向业务模块所属的线程申请,如果该线程的线程级 内存池中存在大小合适的内存块,则可以直接向业务模块分配内存块而不需要进行加锁操作,只有当线程级内存池中没有大小合适的内存块时,才需加锁向
进程申请内存块;同样,当业务模块释放内存块时,也直接向线程的线程级内
存池中释放而不需要进行加解锁操作,因此,与现有二级内存管理模式相比, 本发明能明显减少加锁和解锁操作,从而提高程序的运行效率。


图1为现有内存池组织方式的示意图2为本发明三级内存管理模式的原理示意图3为本发明三级内存管理模式下内存块申请的流程示意图4为本发明三级内存管理模式下内存块释放的流程示意图。
具体实施例方式
为使本发明的目的、技术方案及优点更加清楚明了,以下对本发明作进一 步i羊细iJl明。
本发明的基本思想是在现有二级内存管理模式的基础上,增加一级线程 级内存池,业务模块需要使用内存块时直接向线程申请,线程调用自身的线程 级内存池为业务模块分配内存块;由于线程同时只运行一个业务模块,因此业 务模块向线程申请内存块时不需要加锁,如此能减少业务模块申请或释放内存 块时的加锁和解锁操作,从而提高程序的运行效率。其中,线程级内存池为由 线程维护的内存。
本发明内存操作的管理方法是设置三级内存管理模式,第一级由操作系 统维护内存,第二级由进程以进程级内存池的方式维护内存,第三级由线程以 线程级内存池的方式维护内存。
图2显示的为包含多线程的三级内存管理模式,每个线程各具有一个线程 级内存池。其中,线程级内存池及进程级内存池均采用如图l所示的方式组织。
虽然线程级内存池可以在创建线程时生成,但通常是在业务模块首次向线 程申请内存块时才开始生成的。具体地说,在最初阶段,各线程均没有线程级
7内存池,只有当业务模块首次向其所属的线程申请内存块时,该线程向进程申 请得到一定数量所需大小的内存块后,才开始生成自身的线程级内存池,此时 的线程级内存池是由相同大小的内存块构成。之后,随着申请的次数增多,线 程级内存池逐渐包括不同大小的内存块。
线程级内存池的生成可以由线程局部存储技术或专门的线程级内存管理对 象来实现。其中,专门的线程级内存管理对象为用户编写的一段代码。此外, 对各线程的线程级内存池的统一管理也是由线程局部存储技术或专门的线程级 内存管理对象来实现。如何通过线程局部存储技术或线程级内存管理对象来管 理线程级内存池为现有技术,在此不再赘述。但是,优选线程局部存储技术来 管理各线程级内存池,可以简化管理的复杂度。
为实现内存操作的管理方法,本发明相应提供一种内存操作的管理系统,
该系统包括一级内存管理单元、二级内存管理单元及三级内存管理单元;其中,
一级内存管理单元,用于由操作系统维护内存,当进程向操作系统申请内
存时由操作系统为进程分配内存;
二级内存管理单元,用于由进程以进程级内存池的方式维护内存,当线程
池;
三级内存管理单元,用于由线程以线程级内存池的方式维护内存。 在三级内存管理模式下,业务模块直接向线程申请或释放内存块。 以下结合图3说明采用本发明进行内存块申请的方法。如图3所示,采用 本发明进行内存块申请的方法包括
步骤301,业务模块向线程申请内存块。 步骤302,线程计算应分配的内存块的大小;
具体地i兌,线程调用内存分配函数,内存分配函数根据分配内存块的大小 应等于或最小地大于业务模块申请的内存的大小这一原则,计算出应分配内存 块的大小。所述应分配内存块的大小为2n,且2"等于业务模块申请的内存的大 小,或2。为大于业务模块申请的内存大小的最小的2n。例如,业务模块申请30
8字节的内存块,由于内存块的大d、一般为2n,因此,通过内存分配函数计算可 知应分配大小为32字节的内存块。
步骤303 ~304b,线程查找自身的线程级内存池中是否存在所需大小的内 存块,如果存在,则执行步骤312;否则,加锁并向进程申请一定数量所需大 小的内存块;或者分配一块比所需大小大一级的内存块给业务模块,并结束内 存申请流程;
例如,当业务模块申请20字节的内存块时,应分配大小为32字节的内存 块,但是如果当线程级内存池中没有32字节的内存块但有64字节的内存块时, 也可以直接分配稍大些的内存块即64字节的内存块,当然这样会浪费空间,因 此,当没有32字节的内存块时,优选向进程申请一定数量32字节的内存块;
其中, 一次申请同一大小的内存块的数量可以为一个或一个以上,但较佳 地应选择多个,因为这样做可以减少业务模块再次申请该大小的内存块时加锁 的频率。例如,假设线程向进程一次申请100个32字节的内存块,则之后业务 模块再申请32字节的内存块时,将至少有99%的概率不需要加锁,这样就可以 提高程序的运行效率。以下阐述"至少99%的概率"是如何计算得出的
假设只有业务模块向该线程申请32字节的内存块,而没有业务模块向其释 放32字节的内存块,则除了第一次申请32字节的内存块时需要进行加锁,其 余99次均不需要加锁;但是一般情况下,业务模块既向其申请内存块又向其释 放内存块,释放的内存块被存入线程级内存池后,又能被分配给其他的业务模 块,这样,将超过99%的概率不需要加锁。因此能大大提高内存块的重复利用 率。
步骤305 -306,进程查找自身的进程级内存池中是否存在所需数量所需大 小的内存块,如果存在,则执行步骤310~312;否则,进程向操作系统申请内 存,所申请内存的大小大于等于线程向进程申请的所有内存块的大小;
较佳地,为了减少进程向操作系统申请内存的次数,应将进程申请内存的 大小设为大于线程申请的所有内存块的大小,这样也可以提高程序的运行效率。
步骤307~309,操作系统查找自身是否存在进程所需大小的内存,如果不存在,则操作系统向进程返回为空,说明内存申请失败,则结束内存块申请流 程;否则,为进程分配相应大小的内存,之后进程将分配得到的内存划分成线
程所需大小的内存块存入自身的进程级内存池中,然后执行步骤310 312。
步骤310 ~ 311,进程从自身的进程级内存池中分配相应数量相应大小的内 存块给线程级内存池,然后解锁。
步骤312,线程从线程级内存池中分配一块相应大小的内存块给业务模块, 并结束内存块申请流程。
以下结合图4说明利用本发明进行内存块释放的方法。如图4所示,利用 本发明进行内存块释放的方法包括
步骤401,业务模块向线程释放一定大小的内存块; 步骤402,将该释放的内存块存入线程的线程级内存池中; 步骤403 406,判断线程级内存池中该大小的内存块是否超过指定数目, 如果未超过指定数目,则结束内存块释放流程;否则,加锁并向进程的进程级 内存池释放一定数目的该大小的内存块,然后解锁,并结束内存块释放流程。
其中,步骤403中内存块的指定数目可根据以下原则进行选择如果只有 业务模块向该线程级内存池释放该大小的内存块,而没有业务模块向其申请该 大小的内存块,则该指定数目应选择的小一些,比如可以将指定数目设置为等 于步骤405中的一定数目,即将线程级内存池中该大小的内存块全部释放给 进程级内存池;如果既有业务模块向其释放该大小的内存块,又有业务模块向 其申请该大小的内存块,则该指定数目应选择的大一些,比如可以将该指定数 目设置为一定数目的两倍大小,即仅释放一半该大小的内存块。
虽然业务模块释放内存块时,可以将该内存块释放至之前申请该内存块的 线程级内存池中,也可以将该内存块释放至其他线程的线程级内存池中,在释 放内存块时可选择线程的情况下,优选前者,因为这样可以大大增加同一线程 级内存池中内存块的重复利用率,从而最大限度地减少线程向进程申请内存块 时加锁的频率。
以下通过实际的测试试验来更明显地说明本发明的优势。
10对于单CPU环境P4 2.6G, 1G内存,XPSP2操作系统,10个线程各100 万次内存操作,二级内存管理模式下所用的操作时间为3556ms;三级内存管理 模式下所用的操作时间为2323ms。
对于多CPU环境Xeon 2.6G 8核CPU, 3.5G内存,Windows 2003 Server 操作系统,10个线程各100万次内存操作,二级内存管理模式下所用的操作时 间为11094ms;三级内存管理模式下所用的操作时间为984ms。
从测试结果可以明显看出,在二级内存管理模式下,线程高频度地申请或 释放内存块,需要频繁地进行加锁和解锁操作,导致多线程之间互相等待,因 此二级内存管理模式下内存操作的时间比较长,非常不适用于多线程、多CPU 高频度地操作内存。但是,在本发明三级内存管理模式下,由于减少了加锁和 解锁的次数,使得多CPU可以充分得并行工作,因此,比现有二级内存管理模 式更具有优势,且尤其适用于多线程、多CPU高频度地操作内存。
以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。
1权利要求
1、一种内存操作的管理方法,其特征在于,设置由线程维护的线程级内存池,该方法还包括业务模块需要使用内存块时向线程申请,线程计算应分配的内存块的大小后,查找自身的线程级内存池中是否存在所需大小的内存块,如果存在,则线程从线程级内存池中分配相应大小的内存块给业务模块,并结束内存申请流程;否则,加锁并向进程申请一定数量所需大小的内存块;或者分配比所需大小大一级的内存块给业务模块,并结束内存申请流程。
2、 根据权利要求1所述的内存操作的管理方法,其特征在于,所述相应大 小的内存块为大小为2"的内存块,所述2"等于业务模块申请的内存的大小, 或2n为大于业务;f莫块申请的内存大小的最小的211。
3、 根据权利要求1所述的内存操作的管理方法,其特征在于,该方法进一 步包括所述业务模块首次向线程申请内存块时,线程向进程申请得到一定数 量所需大小的内存块之后,开始生成自身的线程级内存池。
4、 根据权利要求1所述的内存操作的管理方法,其特征在于,所述线程级 内存池由线程局部存储技术、或者线程级内存管理对象管理。
5、 根据权利要求1所述的内存操作的管理方法,其特征在于,所述线程向 进程申请一定数量所需大小的内存块之后,该方法还包括进程查找自身的进程级内存池中是否存在所需数量所需大小的内存块,如 果存在,则进程分配相应数量相应大小的内存块给线程级内存池;否则,向操 作系统申请内存,所申请内存的大小大于等于线程向进程申请的所有内存块的 大小。
6、 根据权利要求5所述的内存操作的管理方法,其特征在于,所述进程向 操作系统申请内存之后,该方法还包括操作系统查找自身是否存在进程所需大小的内存,如果不存在,则内存申请失败,结束内存块申请流程;否则,为进程分配相应大小的内存,之后进程将分配得到的内存划分成线程所需大小的内存块存入自身的进程级内存池中。
7、 根据权利要求6所述的内存操作的管理方法,其特征在于,所述进程将 分配得到的内存划分成线程所需大小的内存块存入自身的进程级内存池中之 后,该方法还包4舌进程分配相应凄史量相应大小的内存块给线程级内存池。
8、 根据权利要求5或7所述的内存操作的管理方法,其特征在于,所述进 程分配相应数量相应大小的内存块给线程级内存池之后,该方法还包括解锁;然后从线程级内存池中分配相应大小的内存块给业务模块,并结束 内存块申请流程。
9、 根据权利要求1所述的内存操作的管理方法,其特征在于,该方法进一 步包括业务模块向线程释放一定大小的内存块; 将释放的内存块存入线程的线程级内存池;判断线程级内存池中该大小的内存块是否超过指定数目,如果未超过指定 数目,则结束内存块释放流程;否则,加锁并向进程释放一定数目的该大小的 内存块,然后解锁,并结束内存块释放流程。
10、 一种内存操作的管理系统,其特征在于,该系统包括一级内存管理单 元、二级内存管理单元及三级内存管理单元;其中,一级内存管理单元,用于由操作系统维护内存,当进程向操作系统申请内 存时由操作系统为进程分配内存;二级内存管理单元,用于由进程以进程级内存池的方式维护内存,当线程 向进程申请内存块时进程从自身的进程级内存池中分配内存块给线程级内存 池;三级内存管理单元,用于由线程以线程级内存池的方式维护内存。
全文摘要
本发明公开了一种内存操作的管理方法,设置由线程维护的线程级内存池,该方法还包括业务模块需要使用内存块时向线程申请,线程计算应分配的内存块的大小后,查找自身的线程级内存池中是否存在所需大小的内存块,如果存在,则线程从线程级内存池中分配相应大小的内存块给业务模块,并结束内存申请流程;否则,加锁并向进程申请一定数量所需大小的内存块;或者分配比所需大小大一级的内存块给业务模块,并结束内存申请流程。本发明还公开了一种内存操作的管理系统,包括一级内存管理单元、二级内存管理单元及三级内存管理单元。采用本发明可以提高程序的运行效率。
文档编号G06F9/50GK101493787SQ20091000910
公开日2009年7月29日 申请日期2009年2月18日 优先权日2009年2月18日
发明者汪步江 申请人:中兴通讯股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1