G06F12/02
1.一种内存消耗可控的高速内存申请释放管理系统,其特征在于,包括有:
多个空闲内存链表,各空闲内存链表分别用于管理一组大小相同的空闲内 存片,同组空闲内存片在物理上分布于同一个内存页中,且在其总量达到一预 设值时,释放给页内存池;
页内存池,用于向空闲内存链表提供空闲内存片,并接收空闲内存链表释 放的内存页,该页内存池以页为单位组织内存,并预设有空闲内存页总量上限, 超过上限的空闲内存页释放给操作系统的内存管理模块;
操作系统的内存管理模块,用于向页内存池提供空闲内存页,并接收页内 存池释放的内存页。
2.如权利要求1所述的高速内存申请释放管理系统,其特征在于:所述空 闲内存片由页内存池的空闲内存页切分得到。
3.如权利要求1所述的内存申请释放管理系统,其特征在于:所述空闲内 存片划分为变量指针区和可使用内存区两部分,变量指针区用于保存用户变量 的地址,可使用内存区用于提供给用户使用。
4.如权利要求1所述的内存申请释放管理系统,其特征在于:所述预设值 为一个内存页。
5.一种利用权利要求1的系统实现的内存消耗可控的高速内存申请释放管 理方法,其特征在于,包括以下步骤:
申请内存时,首先判断空闲内存链表中是否有足够的内存片,是,则将空 闲内存链表中的内存片分配给用户;否,则向页内存池申请新的空闲内存片, 如果页内存池中的空闲内存页不够,则再向操作系统的内存管理模块申请新的 空闲内存页;
释放内存时,首先调整内存片的分布,将已使用的内存片和空闲内存片在 空间上彼此分开,并使空闲内存片在物理上位于同一个内存页之内;然后,当 空闲内存链表中的内存片总量达到一预设值时,将该空闲内存链表中的内存片 释放给页内存池,当页内存池中的空闲内存页数量超过页内存池的空闲内存总 量上限时,将超出的空闲内存页释放给操作系统的内存管理模块。
6.如权利要求5所述的内存申请释放管理方法,其特征在于:所述空闲内 存片包括变量指针区和可使用内存区两部分,分配内存时,将可使用内存区的 内存地址赋值给用户变量,供用户使用,并同时将该用户变量的地址保存在该 内存片的变量指针区;释放内存时,通过该内存片的变量指针区中保存的用户 变量的地址,通知用户更新用户变量,使用户变量指向正确的内存片。
7.如权利要求5所述的内存申请释放管理方法,其特征在于,所述向页内 存池申请空闲内存片的步骤是:向页内存池申请一个空闲内存页,按照所需空 闲内存片的大小,等分成若干内存片,然后将这些内存片链接在对应的空闲内 存链表中。
8.如权利要求5所述的内存申请释放管理方法,其特征在于,所述调整内 存片的分布,包括以下步骤:
1)将与第一个空闲内存片相邻的已使用内存片中的数据移动到新释放的 内存片中,使该已使用内存片被释放,成为新的空闲内存片;
2)将该新的空闲内存片挂载到空闲内存链表的头部;
3)调整头指针,使其指向该新的空闲内存片。
9.如权利要求5所述的内存申请释放管理方法,其特征在于:所述预设值 为一个内存页。
本发明涉及一种内存管理系统,尤其涉及一种适合应用于数据库、工业控 制领域和嵌入式系统的内存消耗可控的高速内存申请释放管理系统;本发明还 涉及一种利用上述系统进行内存的申请和释放的方法。
在工业控制和嵌入式应用领域,对系统的实时性要求通常很高,由于系统 的内存资源是比较有限的,当应用软件占用内存过多时,系统的实时性就会降 低,这可能给整个系统带来安全隐患,因此,为了保证系统的实时性,必须控 制应用系统内存的占用量,同时还必须实现内存的快速申请和释放。
普通操作系统的内存管理功能,是通过API接口(如C语言的malloc和free) 开放给用户使用的。当用户向操作系统申请内存时,操作系统首先从管理的内 存中查出大于所需内存大小的内存空间给用户,然后建立索引,并通过索引 结构管理这片分配给用户的内存,而查合适的内存空间并建立索引是比较耗 时的操作,而且,由于用户每次申请的内存块大小不规律,并存在频繁的申请 和释放,这样就会产生内存碎片,导致大块内存申请无法满足,从而会更多地 占用系统资源,而进行内存碎片整理又会增加CPU的负荷。因此,虽然操作系 统自身也具有内存管理功能,但却无法满足工控领域的苛刻需求。
为了解决上述内存分配和释放以及内存碎片的问题,《STL源码剖析》(作者 侯捷,华中科技大学出版社,2002年5月出版,ISBN:756092699)一书中提出 了SGI STL内存管理方法。该方法应用内存池管理内存,该内存池维护了16个 链表,这16个链表分别用于维护8、16、24、……128个字节长的小内存,当 用户需要分配内存时,将用户所需要分配内存的大小上调为8的整数倍再进行 申请,如此即可用16个链表解决用户1~128个字节的内存需求,如果链表中 空间不够,就向操作系统申请页大小的大内存,内部切分后挂载到原链表上, 以满足新内存申请的需求;当用户需要释放内存时,重新挂到原链表上。这种 方法解决了内存快速申请和释放的问题,同时保证不会产生内存碎片。但该内 存管理方法会导致内存大小不可控,这是因为,一方面,不同链表之间的空闲 内存无法调剂并互相利用,比如8字节的链表没有剩余空间时,16字节链表中 即使有大量的空闲内存,也无法分配给用户;另一方面,当用户释放出内存时, 内存池无法将空闲的内存还给操作系统,供别的应用软件使用,因此,SGI STL 内存管理方法中,所使用的内存大小取决于内存使用达到峰值时的内存量,可 见该方法具有一定的局限性。
中国第01118873.1号名称为“自适应动态内存管理方法”的发明专利提出 了另外一种内存管理方法。该方法是将内存划分为页面簇,页面簇由页面组成, 每个页面容纳一个分片,分片长度相同的页面簇为同类型页面簇,不同类型的 页面簇可以相互转换。当用户申请某种类型的分片时,如果该类型页面簇中有 空闲的分片,则直接取用分片;当该类型的页面簇中的所有分片都被占用时, 可以从其它类型的页面簇中出其中各分片均处于空闲的页面簇,改变其类型, 将其中分片的长度改变为所需类型,再进行分配。该方法通过调剂不同类型间 的内存,可以提高内存的利用率,但是,由于其在小片内存时申请,实质是向 其它的小片内存申请,因此,内存管理的CPU开销比较高,而小片内存释放时, 也不会把释放的内存归还给操作系统,因此,整个系统的内存总量只能增加, 不能减少,在内存使用达到峰值后,内存的占用量同样不会回落。
本发明要解决的技术问题是提供一种内存消耗可控的高速内存申请释放管 理系统,它可以实现内存的快速申请和释放,并能有效控制内存的占用量。
为解决上述技术问题,本发明的内存消耗可控的高速内存申请释放管理系 统,包括有:
多个空闲内存链表,各空闲内存链表分别用于管理一组大小相同的空闲内 存片,同组空闲内存片在物理上分布于同一个内存页中,且在其总量达到一预 设值时,释放给页内存池;
页内存池,用于向空闲内存链表提供空闲内存片,并接收空闲内存链表释 放的内存页,该页内存池以页为单位组织内存,并预设有空闲内存页总量上限, 超过上限的空闲内存页释放给操作系统的内存管理模块;
操作系统的内存管理模块,用于向页内存池提供空闲内存页,并接收页内 存池释放的内存页。
所述空闲内存片由页内存池的空闲内存页切分得到。
所述空闲内存片划分为变量指针区和可使用内存区两部分,变量指针区用 于保存用户变量的地址,可使用内存区用于提供给用户使用。
本发明要解决的另一技术问题是提供一种利用上述系统实现的内存消耗可 控的高速内存申请释放管理方法。
为解决上述技术问题,本发明的内存消耗可控的高速内存申请释放管理方 法,包括以下步骤:
申请内存时,首先判断空闲内存链表中是否有足够的内存片,是,则将空 闲内存链表中的内存片分配给用户;否,则向页内存池申请新的空闲内存片, 如果页内存池中的空闲内存页不够,则再向操作系统的内存管理模块申请新的 空闲内存页;
释放内存时,首先调整内存片的分布,将已使用的内存片和空闲内存片在 空间上彼此分开,并使空闲内存片在物理上位于同一个内存页之内;然后,当 空闲内存链表中的内存片总量达到一预设值时,将该空闲内存链表中的内存片 释放给页内存池,当页内存池中的空闲内存页数量超过页内存池的空闲内存总 量上限时,将超出的空闲内存页释放给操作系统的内存管理模块。
所述空闲内存片包括变量指针区和可使用内存区两部分,分配内存时,将 可使用内存区的内存地址赋值给用户变量,供用户使用,并同时将该用户变量 的地址保存在该内存片的变量指针区;释放内存时,通过该内存片的变量指针 区中保存的用户变量的地址,通知用户更新用户变量,使用户变量指向正确的 内存片。
所述向页内存池申请空闲内存片的步骤是:向页内存池申请一个空闲内存 页,按照所需空闲内存片的大小,等分成若干内存片,然后将这些内存片链接 在对应的空闲内存链表中。
所述调整内存片的分布,包括以下步骤:
1)将与第一个空闲内存片相邻的已使用内存片中的数据移动到新释放的 内存片中,使该已使用内存片被释放,成为新的空闲内存片;
2)将该新的空闲内存片挂载到空闲内存链表的头部;
3)调整头指针,使其指向该新的空闲内存片。
本发明的内存管理方法,具有下列优点和有益效果:
1、小片内存申请时,是向底层的页内存池申请的,因此,内存管理的CPU 开销比较小;
2、小片内存释放时,可以通过内存的调整,空出一个完整的页,返回给操 作系统,从而可以减少内存占用量;
3、内存的申请和释放,大部分通过页内存池进行,不需要操作系统进行耗 时的空闲内存查询和索引建立操作,因此可以加快内存申请和释放的速度。
下面结合附图与具体实施方式对本发明作进一步详细的说明:
图1是本发明的页内存池和空闲内存链表的逻辑结构示意图;
图2是本发明申请内存时的流程图;
图3是本发明的内存片的结构示意图;
图4是本发明空闲内存链表的实际物理结构示意图;
图5是在图4基础上进行内存的释放和调整后,形成的空闲内存链表结构 示意图;
图6是本发明与SGI STL内存管理方法在内存申请和释放过程中的内存占 用情况对比图。
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实 施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅 仅用以解释本发明,并不用于限定本发明。
本发明的内存消耗可控的高速内存申请释放管理系统及方法,采用操作系 统的内存管理模块与下层的页内存池和上层的空闲内存链表相互配合的方式来 实现内存的高效管理。
该页内存池和空闲内存链表的逻辑结构请参阅图1所示。页内存池,位于 内存分配的最底层,以页为单位组织内存,并采用链表的形式管理其中的空闲 内存页(初始化时,页内存池中没有空闲的内存页)。本实施例的内存申请释放 管理系统共维护了16个空闲内存链表,该16个空闲内存链表分别用于管理8、 16、24、……128个字节长的空闲内存片,且每个空闲内存链表设置有一个头指 针,指向本空闲内存链表的第一个内存片。内存片则由分配到的内存页切分得 到。
请参阅图2所示,当用户申请内存时,首先,按照向上取整的原则,即所 申请内存的字节数调整为8的整数倍,据此决定向哪个空闲内存链表申请内存。 例如,用户需要申请长度位于9~16个字节的内存,按照向上取整的原则,可 确定用户需要16个字节长的可使用内存,故决定向16字节空闲内存链表申请 一个16字节长的空闲内存片。
然后,判断该空闲内存链表中是否有空闲的内存片,如果有,就直接将空 闲内存片分配给用户;如果没有,则向页内存池申请一页内存。如果页内存池 中有空闲的内存页,就将该内存页切分成同等大小的内存片,每个内存片包括 变量指针区和用户可使用内存区两部分,如图3所示。每个内存片的前面4个 字节为变量指针区(若是64位操作系统,则留8个字节的指针空间),用于保 存用户变量的地址或下一个空闲内存片的地址,剩下的空间则为用户可使用内 存区。当获得的一个空闲内存页切分后,通过变量指针区将这些切分得到的内 存片串接起来,挂载到同类型的空闲内存链表中。例如,当用户需要16个字节 长的可使用内存时,就将内存页切分成长度都为20个字节的内存片,串接后挂 载到16字节的空闲内存链表上。如果页内存池中没有空闲的内存页,则页内存 池向操作系统的内存管理模块申请一页内存,按照上述方法切分后,挂载到空 闲内存链表中。
向用户分配内存时,将空闲内存片的可使用内存区的指针赋值给用户变量, 用户即可拿这个用户变量访问申请的内存片。同时,该用户变量的地址被保存 到该内存片中的变量指针区,以供在该内存片在释放移动时,同步调整用户变 量。
当用户释放内存时,首先,进行内存片分布的调整,使已分配给用户使用 的内存片聚集在一起,未分配给用户使用的空闲内存片也聚在一起,并且使空 闲内存片在物理上位于同一个内存页之内。同时,更新用户变量,使其指向调 整后的内存片。例如,图4是一个空闲内存链表的实际物理结构图,图中每一 行(A1到H1,A2到H2,A3到H3)代表一个内存页,每一格(A1、B1……H3)代表一 个内存片,各内存片大小相同,其中,C3到H3为空闲内存片,用指针进行了串 接,其他均为已使用内存片;当已使用内存片D2被释放时,将与空闲内存片相 邻的那个已使用内存片(即内存片B3)中的数据移动到内存片D2的位置,即用 内存片B3的内容覆盖内存片D2的内容,以释放内存片D2,然后,根据内存片B3 的变量指针区中保存的用户变量的地址,通知该用户变量修改其所指向的可使 用内存区的地址,即以内存片D2的可使用内存区的地址替换原来存放的内存片 B3的可使用内存区的地址,这样,当用户以后访问这些内容时,就会自动重定向 到内存片D2的可使用内存区的地址,而新释放的内存片B3则被挂载到空闲内存 链表头部,且该空闲内存链表的头指针也被调整为指向该新释放的内存片B3。 这样,所有已分配的内存和未分配的内存就在空间上彼此分开了,且全部空闲 内存片都位于同一个内存页中,如图5所示。
当某个空闲内存链表中的空闲内存片的字节数总和达到一个页大小时,空 闲内存链表可以将该页内存释放给页内存池。为了防止页内存池过度占用系统 的内存,可以预先为页内存池设置一个空闲内存页数量上限,当页内存池中的 空闲内存页的数量达到此上限时,新释放的内存页就不再存入页内存池,而是 直接返还给操作系统的内存管理模块,如此就能降低系统整体占用的内存量。
可见,页内存池为上一层的内存分配提供了内存缓冲,由于页内存池的存 在,绝大多数的页内存申请和释放都不用通过操作系统,从而避免了操作系统 进行耗时的空闲内存查询和建立索引等操作,经测试,该方法的时间复杂度可 以达到0(1),因此,内存的申请和释放速度很快。
本发明对内存占用量的控制效果如图6所示。该图是分别应用本发明和SGI STL内存管理方法进行内存申请和释放过程所得到的实验结果。该实验每次申 请64个字节的内存,不断地进行申请,直至申请的内存总量达到20M,然后进 行内存释放,每次释放64个字节的内存,将上述内存申请和释放过程中,内存 占用的情况记录下来,并以申请内存量为横坐标,内存占用量为纵坐标,绘制 出内存占用情况图,即图6。由该图可以看出,在内存申请过程中,两种方法所 占用的内存都是逐步增多,本发明在申请过程中的内存消耗比SGI STL内存管 理方法略高,是因为本发明内存片中附带用户变量的地址;而在内存释放过程 中,应用SGI STL内存管理方法时,内存占用量基本不变,而应用本发明的内 存申请释放管理系统和方法时,内存占用量则会随着内存的释放而逐步减少, 可见,现有的SGI STL内存管理方法,不能将释放的内存归还给操作系统,而 本发明却能够将应用模块释放的内存还给操作系统,使内存占用量在达到顶峰 后,还能随着内存的释放而逐步回落,从而实现了内存占用量的可控。
综上所述,本发明的内存消耗可控的高速内存申请释放管理方法,能够实 现内存的快速申请和释放,并能保证内存占用量的可控,因此,特别适合对内 存总量控制较严的嵌入式设备或工业控制场合,以及对内存管理的性能和总量 要求较严的数据库产品和对数据处理要求很高的应用场合。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发 明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明 的保护范围之内。
本文发布于:2023-04-13 02:05:50,感谢您对本站的认可!
本文链接:https://patent.en369.cn/patent/3/85721.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |