G06F3/06 G06F12/02
1.一种动态内存控制方法,用于对Linux操作系统用户进程的内存管理控制过程中,其特征 在于:所述动态内存控制方法包括:
从进程空间的内存映射区域为用户进程预先分配至少一个不小于所述内存映射区域 分配阈值的第一内存块;
将所述第一内存块分割成大小相等的至少两个第二内存块;
在接收到不大于所述第二内存块的内存的进程内存申请时,将所述第二内存块的内存 分配至所述进程内存申请对应的进程;
当所述进程释放内存时,将所述进程占用的所述第二内存块的内存归还至所述第二内 存块原来所属的第一内存块中;
在所述第一内存块中的所有第二内存块均被释放后,将所述第一内存块的内存归还至 Linux操作系统。
2.根据权利要求1所述的动态内存控制方法,其特征在于:若所述第一内存块的数量大于等 于两个,各个所述第一内存块的大小不相等。
3.根据权利要求1所述的动态内存控制方法,其特征在于:若所述第一内存块的数量大于等 于两个,各个所述第一内存块的大小相等。
4.根据权利要求1所述的动态内存控制方法,其特征在于:若所述第一内存块的数量大于等 于两个,每一个所述第一内存块中的第二内存块的大小与其他所述第一内存块中的第二内 存块的大小均不相等。
5.根据权利要求1或4所述的动态内存控制方法,其特征在于:所述第二内存块的大小为4 字节、8字节、16字节、32字节、64字节或128字节。
6.一种动态内存控制系统,用于对Linux操作系统用户进程的内存管理控制过程中,其特征 在于:所述动态内存控制系统包括:
第一内存块分配模块,用于从进程空间的内存映射区域为用户进程预先分配至少一个 不小于所述内存映射区域分配阈值的第一内存块;
第二内存块分配模块,与所述第一内存块分配模块相连,用于将所述第一内存块分割 成大小相等的至少两个第二内存块;
进程内存分配模块,与所述第二内存块分配模块相连,用于在接收到不大于所述第二 内存块的内存的进程内存申请时,将所述第二内存块的内存分配至所述进程内存申请对应 的进程;
内存释放控制模块,与所述第二内存块分配模块和所述进程内存分配模块相连,用于 当所述进程释放内存时,将所述进程占用的所述第二内存块的内存归还至所述第二内存块 原来所属的第一内存块中;
内存块归还模块,与所述内存释放控制模块相连,用于在所述第一内存块中的所有第 二内存块均被释放后,将所述第一内存块的内存归还至Linux操作系统。
7.根据权利要求6所述的动态内存控制系统,其特征在于:若所述第一内存块的数量大于等 于两个,所述第一内存块分配模块还用于使得各个所述第一内存块的大小不相等。
9.根据权利要求7所述的动态内存控制系统,其特征在于:若所述第一内存块的数量大于等 于两个,所述第二内存块分配模块还用于控制每一个所述第一内存块中的第二内存块的大 小与其他所述第一内存块中的第二内存块的大小均不相等。
8.根据权利要求6所述的动态内存控制系统,其特征在于:若所述第一内存块的数量大于等 于两个,所述第一内存块分配模块还用于使得各个所述第一内存块的大小相等。
10.根据权利要求6或9所述的动态内存控制系统,其特征在于:所述第二内存块分配模块 还用于控制所述第二内存块的大小为4字节、8字节、16字节、32字节、64字节或128 字节。
本发明涉及操作系统技术领域,特别是涉及操作系统进程的内存管理技术领域,具体为 一种动态内存控制方法及系统。
Linux操作系统用户进程的内存管理默认使用的是ptmalloc机制。Linux操作系统的 ptmalloc内存管理机制有以下特点:Linux系统的用户进程从进程空间的两个区域申请动态内 存:brk区域和mmap区域,如图1所示。当用户申请的内存块大小小于mmap分配阀值(默 认值为128K)时,操作系统从brk区域给进程分配内存。从brk分配的内存在释放时不会立刻 归还操作系统。当用户申请的内存块大小大于或者等于mmap分配阀值(默认值为128K)时, 操作系统从mmap区域给进程分配内存。从mmap区域分配的内存效率比较低,因此适合在 申请大块内存时使用。从mmap区域分配的内存在释放时立刻归还给操作系统。
ptmalloc内存管理机制存在以下问题:假设用户按顺序(内存块A->内存块B->内存块C) 申请三块内存块,内存块大小都小于mmap分配阀值(默认值为128K)。进程在释放内存时如 果只释放了内存块A和内存块B,内存块C没有释放。则存在这么一个问题:所释放的内存 块A和内存块B只是把内存块A和内存块B放到了进程的可用内存当中,并不会归还给操 作系统,这就导致了其他的进程无法使用这两块内存。出现应用进程堆内存释放时无法归还 给操作系统的原因主要是频繁申请和释放大小小于mmap分配阀值的内存块,也就是操作系 统从brk区域分配了内存块。在一些需要反复申请、释放大量的内存块的业务经常会导致操 作系统因为内存耗尽而杀死某些进程,造成业务中断。
鉴于以上所述现有技术的缺点,本发明的目的在于提供一种动态内存控制方法及系统, 用于解决现有技术中在一些需要反复申请、释放大量的内存块的业务经常会导致操作系统因 为内存耗尽而杀死某些进程,造成业务中断的问题。
为实现上述目的及其他相关目的,本发明提供一种动态内存控制方法,用于对Linux操 作系统用户进程的内存管理控制过程中,所述动态内存控制方法包括:从进程空间的内存映 射区域为用户进程预先分配至少一个不小于所述内存映射区域分配阈值的第一内存块;将所 述第一内存块分割成大小相等的至少两个第二内存块;在接收到不大于所述第二内存块的内 存的进程内存申请时,将所述第二内存块的内存分配至所述进程内存申请对应的进程;当所 述进程释放内存时,将所述进程占用的所述第二内存块的内存归还至所述第二内存块原来所 属的第一内存块中;在所述第一内存块中的所有第二内存块均被释放后,将所述第一内存块 的内存归还至Linux操作系统。
优选地,若所述第一内存块的数量大于等于两个,各个所述第一内存块的大小不相等。
优选地,若所述第一内存块的数量大于等于两个,各个所述第一内存块的大小相等。
优选地,若所述第一内存块的数量大于等于两个,每一个所述第一内存块中的第二内存 块的大小与其他所述第一内存块中的第二内存块的大小均不相等。
优选地,所述第二内存块的大小为4字节、8字节、16字节、32字节、64字节或128字 节。
为实现上述目的,本发明还提供一种动态内存控制系统,用于对Linux操作系统用户进 程的内存管理控制过程中,所述动态内存控制系统包括:第一内存块分配模块,用于从进程 空间的内存映射区域为用户进程预先分配至少一个不小于所述内存映射区域分配阈值的第一 内存块;第二内存块分配模块,与所述第一内存块分配模块相连,用于将所述第一内存块分 割成大小相等的至少两个第二内存块;进程内存分配模块,与所述第二内存块分配模块相连, 用于在接收到不大于所述第二内存块的内存的进程内存申请时,将所述第二内存块的内存分 配至所述进程内存申请对应的进程;内存释放控制模块,与所述第二内存块分配模块和所述 进程内存分配模块相连,用于当所述进程释放内存时,将所述进程占用的所述第二内存块的 内存归还至所述第二内存块原来所属的第一内存块中;内存块归还模块,与所述内存释放控 制模块相连,用于在所述第一内存块中的所有第二内存块均被释放后,将所述第一内存块的 内存归还至Linux操作系统。
优选地,若所述第一内存块的数量大于等于两个,所述第一内存块分配模块还用于使得 各个所述第一内存块的大小不相等。
优选地,若所述第一内存块的数量大于等于两个,所述第一内存块分配模块还用于使得 各个所述第一内存块的大小相等。
优选地,若所述第一内存块的数量大于等于两个,所述第二内存块分配模块还用于控制 每一个所述第一内存块中的第二内存块的大小与其他所述第一内存块中的第二内存块的大小 均不相等。
优选地,所述第二内存块分配模块还用于控制所述第二内存块的大小为4字节、8字节、 16字节、32字节、64字节或128字节。
如上所述,本发明的一种动态内存控制方法及系统,具有以下有益效果:
本发明从进程空间的内存映射区域为用户进程预先分配至少一个不小于所述内存映射区 域分配阈值的第一内存块并将所述第一内存块分割成大小相等的至少两个第二内存块,在接 收到不大于所述第二内存块的内存的进程内存申请时,将所述第二内存块的内存分配至所述 进程内存申请对应的进程,当所述进程释放内存时,将所述进程占用的所述第二内存块的内 存归还至所述第二内存块原来所属的第一内存块中,并在所述第一内存块中的所有第二内存 块均被释放后,将所述第一内存块的内存归还至Linux操作系统,所以本发明可以有效解决 现有技术中在一些需要反复申请、释放大量的内存块的业务经常会导致操作系统因为内存耗 尽而杀死某些进程,造成业务中断的问题。本发明简单高效,具有较强的通用性和实用性。
图1显示为现有技术中Linux系统的用户进程从进程空间的brk区域和mmap区域申请 动态内存的示意图。
图2显示为本发明的动态内存控制方法的流程示意图。
图3显示为本发明的动态内存控制方法中分配内存的示意图。
图4显示为本发明的动态内存控制方法中释放内存的示意图。
图5显示为本发明的动态内存控制系统的结构示意图。
元件标号说明
1动态内存控制系统
11第一内存块分配模块
12第二内存块分配模块
13进程内存分配模块
14内存释放控制模块
15内存块归还模块
S11~S15步骤
以下通过特定的具体实例说明本发明的实施方式,本领域技术人员可由本说明书所揭露 的内容轻易地了解本发明的其他优点与功效。本发明还可以通过另外不同的具体实施方式加 以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离本发明的精 神下进行各种修饰或改变。
本实施例的目的在于提供一种动态内存控制方法及系统,用于解决现有技术中在一些需 要反复申请、释放大量的内存块的业务经常会导致操作系统因为内存耗尽而杀死某些进程, 造成业务中断的问题。以下将详细阐述本实施例的一种动态内存控制方法及系统的原理及实 施方式,使本领域技术人员不需要创造性劳动即可理解本实施例的一种动态内存控制方法及 系统。
如图2至图5所示,本实施例提供一种动态内存控制方法及系统,通过从进程空间的mmap 区域(内存映射区域)分配大块内存,然后分割成各种不同大小的小块内存以供进程本身使 用,释放时如果小块内存所在的大块内存上所有的小块内存都已经释放,则立即将整块大块 内存归还给操作系统。
具体地,如图2所示,本实施例提供一种动态内存控制方法,用于对Linux操作系统用 户进程的内存管理控制过程中,所述动态内存控制方法包括以下步骤。
步骤S11,如图3所示,从进程空间的内存映射区域为用户进程预先分配至少一个不小 于所述内存映射区域分配阈值的第一内存块。
其中,在本实施例中,所述内存映射区域(mmap)分配阈值一般默认为128k,即从进 程空间的内存映射区域为用户进程预先分配至少一个不小于128k的第一内存块。由于第一内 存块的大小不小于所述内存映射区域分配阈值,当第一内存块的内存被释放时,第一内存块 的内存会及时归还给操作系统,使得操作系统具有分配给其他进程的内存,从而不会造成业 务的中断。
其中,所述第一内存块的数量大于等于一个。若所述第一内存块的数量大于等于两个, 各个所述第一内存块的大小不相等或者若所述第一内存块的数量大于等于两个,各个所述第 一内存块的大小相等。也就是说,存在多个第一内存块时,多个第一内存块被分配的内存最 好是均不相等,当然也可以存在内存相等的两个或多个第一内存块或多个第一内存块的内存 的大小彼此均相等。
例如,如图3所示,从进程空间的内存映射区域为用户进程预先分配三个第一内存块, 三个第一内存块的大小分别为288k,576k,1152k,或者三个第一内存的大小均为576k。
步骤S12,将所述第一内存块分割成大小相等的至少两个第二内存块。这样,每一个第 一内存块相当于一个大块内存,第一内存块便可以看作一个内存池,池里边有若干个小块内 存(第二内存块)。也就是说,步骤S12实际相当于,从mmap区域分配几块大块(大小大于 mmap分配阀值)的内存,把每一块分割若干个相同大小的小块内。这样,每一个大块内存 可以看作是一个内存池,池内有若干个小块内存。
具体地,在本实施例中,若所述第一内存块的数量大于等于两个,每一个所述第一内存 块中的第二内存块的大小与其他所述第一内存块中的第二内存块的大小均不相等。也就是说, 不管第一内存块的大小是否相等,任意一个第一内存块中的第二内存块的大小与其他第一内 存块中的第二内存块的大小都不相等。例如,两个第一内存块均为576k,其中一个第一内存 块中有6个第二内存块,每个第二内存块的大小为96k,而另外一个第一内存块中有9个第 二内存块,这样每个第二内存块的大小为64k。再比如,一个第一内存块的大小为288k,该 第一内存块中有9个第二内存块,每个第二内存块的大小为32k,而另外一个第一内存块的 大小为576k,该第一内存块中也有9个第二内存块,每个第二内存块的大小为64k,所以两 个第一内存块中第二内存块的内存大小仍然不相等。
所述第二内存块的大小与所述第一内存块的内存大小以及所述第一内存块被分成的均等 份数相关。具体地,在本实施例中,所述第二内存块的大小为但不限于4字节、8字节、16 字节、32字节、64字节或128字节。
步骤S13,在接收到不大于所述第二内存块的内存的进程内存申请时,将所述第二内存 块的内存分配至所述进程内存申请对应的进程。用户进程在申请小块内存(不大于第二内存 块的内存)时,直接从这些小块内存池(第二内存块)里边获取内存,分配给用户进程。例 如,用户在申请小块内存时(比如申请的内存块大小为50字节),从包含64字节大小的多个 内存的内存池(第一内存块)里边摘取一个小块内存(大小为64字节的第二内存块)。
步骤S14,当所述进程释放内存时,将所述进程占用的所述第二内存块的内存归还至所 述第二内存块原来所属的第一内存块中。用户进程在释放内存时,把小块内存(大小为64字 节的第二内存块)放回到内存池第一内存块)里边。
步骤S15,如图4所示,在所述第一内存块中的所有第二内存块均被释放后,将所述第 一内存块的内存归还至Linux操作系统。当内存池里边的内存都释放之后,把整个内存池的 内存归还给操作系统。也就是说,用户进程在释放内存时,直接把小块内存放回对应的内存 池中。当内存池中所有的小块内存都已经释放的时候,把大块内存及时归还给操作系统。这 样,操作系统变回存在相对充足的内存分配给一些需要反复申请、释放大量的内存块的业务。
为使本领域技术人员进一步理解本实施例中的动态内存控制方法,以下将进一步说明本 实施例中动态内存控制方法的实施过程。
首先从mmap区域分配几块大块(大小大于mmap分配阀值)的内存,把每一块分割若 干个相同大小的小块内。例如,进程一次性向操作系统申请了三个大块内存,然后分别分割 成若干块大小为32字节(图3中所示的32)、64字节(图3中所示的64)、128字节(图3 中所示的128)的小块内存块。这样,每一块大块内存便可以看作一个内存池,池里边有若 干个小块内存。用户在申请小块内存时(比如申请的内存块大小为50字节),直接从64字节 大小的内存池里边摘取一个小块内存返回(如图3中的虚线圆角小方块表示分配出去的小块 内存,实线圆角小方块表示已经释放的小块内存)。用户在释放内存时,如图4所示,把小块 放回到内存池里边。当内存池里边的内存都释放之后,把整个内存池的内存归还给操作系统。
为实现本实施例中的一种动态内存控制方法,本实施例还提供一种动态内存控制系统, 用于对Linux操作系统用户进程的内存管理控制过程中,具体地,如图5所示,所述动态内 存控制系统1包括:第一内存块分配模块11,第二内存块分配模块12,进程内存分配模块 13,内存释放控制模块14以及内存块归还模块15。
所述第一内存块分配模块11用于从进程空间的内存映射区域为用户进程预先分配至少 一个不小于所述内存映射区域分配阈值的第一内存块。其中,在本实施例中,所述内存映射 区域(mmap)分配阈值一般默认为128k,即所述第一内存块分配模块11从进程空间的内存 映射区域为用户进程预先分配至少一个不小于128k的第一内存块。由于第一内存块的大小不 小于所述内存映射区域分配阈值,当第一内存块的内存被释放时,第一内存块的内存会及时 归还给操作系统,使得操作系统具有分配给其他进程的内存,从而不会造成业务的中断。
其中,所述第一内存块的数量大于等于一个。具体地,在本实施例中,若所述第一内存 块的数量大于等于两个,所述第一内存块分配模块11还用于使得各个所述第一内存块的大小 不相等或者所述第一内存块分配模块11还用于使得各个所述第一内存块的大小相等。也就是 说,存在多个第一内存块时,多个第一内存块被所述第一内存块分配模块11分配的内存最好 是均不相等,当然也可以存在内存相等的两个或多个第一内存块或多个第一内存块的内存的 大小彼此均相等。例如,如图3所示,所述第一内存块分配模块11从进程空间的内存映射区 域为用户进程预先分配三个第一内存块,三个第一内存块的大小分别为288k,576k,1152k, 或者三个第一内存的大小均为576k。
如图3所示,所述第二内存块分配模块12与所述第一内存块分配模块11相连,用于将 所述第一内存块分割成大小相等的至少两个第二内存块。这样,每一个第一内存块相当于一 个大块内存,第一内存块便可以看作一个内存池,池里边有若干个小块内存(第二内存块)。 也就是说,所述第二内存块分配模块12实际相当于,从mmap区域分配几块大块(大小大于 mmap分配阀值)的内存,把每一块分割若干个相同大小的小块内。这样,每一个大块内存 可以看作是一个内存池,池内有若干个小块内存。
具体地,在本实施例中,若所述第一内存块的数量大于等于两个,所述第二内存块分配 模块12还用于控制每一个所述第一内存块中的第二内存块的大小与其他所述第一内存块中 的第二内存块的大小均不相等。也就是说,不管第一内存块的大小是否相等,任意一个第一 内存块中的第二内存块的大小与其他第一内存块中的第二内存块的大小都不相等。例如,两 个第一内存块均为576k,其中一个第一内存块中有6个第二内存块,每个第二内存块的大小 为96k,而另外一个第一内存块中有9个第二内存块,这样每个第二内存块的大小为64k。再 比如,一个第一内存块的大小为288k,该第一内存块中有9个第二内存块,每个第二内存块 的大小为32k,而另外一个第一内存块的大小为576k,该第一内存块中也有9个第二内存块, 每个第二内存块的大小为64k,所以两个第一内存块中第二内存块的内存大小仍然不相等。
所述第二内存块的大小与所述第一内存块的内存大小以及所述第一内存块被分成的均等 份数相关。更进一步地,在本实施例中,所述第二内存块分配模块12还用于控制所述第二内 存块的大小为4字节、8字节、16字节、32字节、64字节或128字节。
所述进程内存分配模块13与所述第二内存块分配模块12相连,用于在接收到不大于所 述第二内存块的内存的进程内存申请时,将所述第二内存块的内存分配至所述进程内存申请 对应的进程。用户进程在申请小块内存(不大于第二内存块的内存)时,所述进程内存分配 模块13直接从这些小块内存池(第二内存块)里边获取内存,分配给用户进程。例如,用户 在申请小块内存时(比如申请的内存块大小为50字节),从包含64字节大小的多个内存的 内存池(第一内存块)里边摘取一个小块内存(大小为64字节的第二内存块)。
所述内存释放控制模块14与所述第二内存块分配模块12和所述进程内存分配模块13相 连,用于当所述进程释放内存时,将所述进程占用的所述第二内存块的内存归还至所述第二 内存块原来所属的第一内存块中。用户进程在释放内存时,所述内存释放控制模块14控制把 小块内存(大小为64字节的第二内存块)放回到内存池第一内存块)里边。
如图4所示,所述内存块归还模块15与所述内存释放控制模块14相连,用于在所述第 一内存块中的所有第二内存块均被释放后,将所述第一内存块的内存归还至Linux操作系统。 当内存池里边的内存都释放之后,把整个内存池的内存归还给操作系统。也就是说,用户进 程在释放内存时,所述内存释放控制模块14直接把小块内存放回对应的内存池中。当内存池 中所有的小块内存都已经释放的时候,所述内存块归还模块15把大块内存及时归还给操作系 统。这样,操作系统变回存在相对充足的内存分配给一些需要反复申请、释放大量的内存块 的业务。
为使本领域技术人员进一步理解本实施例中的动态内存控制系统1,以下将进一步说明 本实施例中动态内存控制系统1的工作过程。
首先,所述第一内存块分配模块11从mmap区域分配几块大块(大小大于mmap分配阀 值)的内存,所述第二内存块分配模块12把每一大块分割若干个相同大小的小块内。例如, 所述第一内存块分配模块11一次性向操作系统申请了三个大块内存,然后所述第二内存块分 配模块12分别分割成若干块大小为32字节(图3中所示的32)、64字节(图3中所示的64)、 128字节(图3中所示的128)的小块内存块。这样,每一块大块内存便可以看作一个内存池, 池里边有若干个小块内存。用户进程在申请小块内存时(比如申请的内存块大小为50字节), 所述进程内存分配模块13直接从64字节大小的内存池里边摘取一个小块内存返回(如图3 中的虚线圆角小方块表示分配出去的小块内存,实线圆角小方块表示已经释放的小块内存)。 用户进程在释放内存时,如图4所示,所述内存释放控制模块14控制把小块放回到内存池里 边。当内存池里边的内存都释放之后,所述内存块归还模块15把整个内存池的内存归还给操 作系统。
综上所述,本发明从进程空间的内存映射区域为用户进程预先分配至少一个不小于所述 内存映射区域分配阈值的第一内存块并将所述第一内存块分割成大小相等的至少两个第二内 存块,在接收到不大于所述第二内存块的内存的进程内存申请时,将所述第二内存块的内存 分配至所述进程内存申请对应的进程,当所述进程释放内存时,将所述进程占用的所述第二 内存块的内存归还至所述第二内存块原来所属的第一内存块中,并在所述第一内存块中的所 有第二内存块均被释放后,将所述第一内存块的内存归还至Linux操作系统,所以本发明可 以有效解决现有技术中在一些需要反复申请、释放大量的内存块的业务经常会导致操作系统 因为内存耗尽而杀死某些进程,造成业务中断的问题。本发明简单高效,具有较强的通用性 和实用性。所以,本发明有效克服了现有技术中的种种缺点而具高度产业利用价值。
上述实施例仅例示性说明本发明的原理及其功效,而非用于限制本发明。任何熟悉此技 术的人士皆可在不违背本发明的精神及范畴下,对上述实施例进行修饰或改变。因此,举凡 所属技术领域中具有通常知识者在未脱离本发明所揭示的精神与技术思想下所完成的一切等 效修饰或改变,仍应由本发明的权利要求所涵盖。
本文发布于:2023-04-15 02:21:33,感谢您对本站的认可!
本文链接:https://patent.en369.cn/patent/3/86995.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |