一种终端的内存池的管理方法
技术领域
本发明涉及通信系统,尤其涉及一种终端的内存池的管理方法。
背景技术
在终端无线通信协议栈软件设计过程中,为了提高系统的实时性,可以通过采取减少线程切换、系统调用或者减少内存操作的开销等策略;内存管理的效率是影响系统开销的重要因素之一,在通信产品的设计过程中一般都有自己独立的内存管理系统。
另外,在协议栈的设计中,各个协议层都有消息的处理功能模块和消息的收发功能模块;消息处理实体负责加工处理各种各样的消息,而每条消息可能会经过许多实体的处理或者转发才能得到完整的处理。由于消息的收发一般都是通过承载在某种物理设备上的一定通信协议来实现消息发送和接收,因此,就有可能发生流量过大而导致的消息拥塞和丢失的问题。此外,考虑到消息处理过程中都需要消耗一定的资源,所以每个消息处理实体的消息处理能力都是有一定限度的,不可能在一定时间内处理无限多条消息。在这些情况下,对消息发送的流量做必要的流控就成为迫切的要求,一个好的内存管理系统对协议层进行流控是非常关键的。
当前的一种动态内存池的实现方法,其中,可配置多个由固定大小内存页面构成的内存缓冲池,内存页面的大小和数量可由应用指定;对于特定页面大小的内存缓冲池,在系统允许的范围内,页面的数量可由系统动态扩充或回收,并对应用透明。
另外,当前还有一种有效使用存储器的存储池管理方法,其中使用了一个搜索顺序表,该顺序表输入了所请求的存储区容量范围和相应的搜索顺序,搜索控制部分响应请求,通过搜索顺序表找到要搜索的子存储池。
综上所述,当前方法在内存管理都有独特之处,并且在大部分场合具有通用性,但是无线终端设备在硬件上具有内存相对较小,处理器处理能力相对较弱的特点,因此需要结合已有的内存管理方法和终端设备自身的特点提出一种简单,高效,且有利于维护链路流量控制、维护安全的内存管理方法。
发明内容
本发明所要解决的技术问题是提供一种终端的内存池的管理方法,其中内存池的内存页面的数量可由系统动态扩充,而且能在一定程度上提高内存空间分配的效率和减少内存碎片,同时增加相应的状态信息和流控标志来帮助控制流控。
为了解决上述问题,本发明提供了一种终端的内存池的管理方法,包括,
首先进行内存池的初始化,设立多个内存池队列,并分别配置各个内存池的参数;
内存池的初始化后,对内存池的流控是通过在内存池中配置最高水位线、最低水位线,同时在内存空间申请和/或回收空间的过程中判断当前处于最高水位线和最低水位线上下间的可继续扩充的内存块数和禁止申请标志的设置来完成;其中,最高水位线、最低水位线表示内存池中可继续扩充的内存块数量多少的两个位置线。
进一步地,上述管理方法还可包括,在内存池的初始化中,还包括,
根据申请的内存池总共的大小PoolSize和配置的每次扩充申请内存页面的大小BlockSize,得到总共申请最大的可扩充内存块数MoreOver、和内存池可继续扩充的内存块数P;
其中MoreOver的数值为PoolSize减1后除以BlockSize得到的数值再进行取整,然后再
1;P的数值为MoreOver减1。
进一步地,上述管理方法还可包括,所述分别配置各个内存池的参数,包括内存块指针、内存申请指针、可扩充内存块个数、最低水位线、最高水位线;如果内存池需要互斥访问,则初始化互斥信号量。
进一步地,上述管理方法还可包括,当所述禁止申请标志为真时,则内存池停止内存空间申请,否则进行内存空间申请;当进行内存空间申请后,如果内存池中可继续扩充的内存块数量满足禁止申请条件,则将禁止申请标志置为真,停止内存空间申请;随着内存池空间的回收,当内存池中可继续扩充的内存块数量回到最高水位线上时,则将禁止申请标志置假,进行内存空间申请;在最高水位线和最低水位线间的内存空间相当于缓冲,避免在分配与停止间反复引起震荡,同时避免搜索内存块链表,提高系统分配的效率。
进一步地,上述管理方法还可包括,当内存池中可继续扩充的内存块数量在最高水位线上,则将禁止申请标志设置为假,内存池进行内存空间申请;当内存池中可继续扩充的内存块数量在所述最低水位线下,则将禁止申请标志设置为真,内存池停止内存空间申请。
进一步地,上述管理方法还可包括,在内存池进行内存空间申请时,判断禁止申请标志是否为真,如果为真,则此时内存空间不足,内存池停止内存空间申请;否则,内存池进行内存空间申请;
内存空间申请成功后,判断此时内存池中可继续扩充的内存块数是否由最低水位线上变为最低水位线下,如果是,则将最低水位线上的内存块数减1,判断最低水位线上可继续扩充的内存块数为0、P为0是否同时满足,如果是,则将禁止申请标志置为真,表示此时内存池空间不足,内存池停止内存空间申请。
进一步地,上述管理方法还可包括,在内存池进行回收空间时,每当在缓冲池的某一个内存池中回收一个内存空间时,则判断新增或合并的可继续扩充的内存块数是否由最低水位线下变为最低水位线上,如果是,则将最低水位线以上的可继续扩充的内存块数加1;如果变化后的内存块数由最高水位线下成为最高水位线上,则将禁止申请标志置为假,内存池进行内存空间申请。
进一步地,上述管理方法还可包括,在内存池进行内存空间申请中,包括以下步骤,
a、从内存申请指针所指向的内存块开始找寻内存空间,当内存申请指针所指内存块空间大于等于所要申请的内存空间时,则执行步骤c,否则执行步骤b;
b、内存申请指针指向当前内存块的下一个内存块,判断该内存块空间的大小是否大于等于所要申请的内存空间大小,如果是,则执行步骤304,否则,内存申请指针继续指向下一个内存块,继续判断该内存块空间的大小是否大于等于所要申请的内存空间大小,依次类推,直到找到满足条件的内存块,然后执行步骤c;;
c、在所述内存块空间上申请相应大小的内存空间,调整该内存块空间大小参数,如果P大于0,则将内存申请指针指向该内存块,否则,P为0,在内存块循环链表上删除该内存块,同时将内存申请指针指向下一个内存块,调整内存池相应参数,返回申请到的内存空间首地址。
进一步地,上述管理方法还可包括,在所述步骤b中,当内存申请指针将所有的内存块都搜索完毕时,
如果P=0,则表示当前内存池空间不足,且内存池无法扩充页面,内存空间申请失败,跳出申请;
如果P>0,则在内存块队列中新申请一块BlockSize大小的内存页面,同时将该内存页面链接到内存池队列上,形成循环链表,链接的顺序为内存块首地址由低到高的顺序;在该新申请的内存页面上申请所需的内存空间,重新调整该内存块空间的大小,同时将内存申请指针指向该内存块,调整内存池相应参数,返回申请到的内存空间首地址,跳出申请。
进一步地,上述管理方法还可包括,在内存池进行回收空间中,根据回收空间的首地址搜索内存池队列,包括以下几种情况:
如果回收空间的首地址小于队列首地址,则将回收空间置于队列开头,如果回收空间的首地址小于队列尾地址,则将回收空间置于队列的末尾;否则,搜索内存池队列找到其空间位于上一个内存块和下一个内存块地址之间的位置;
如果回收空间的首地址不是队列首地址,则判断所述队列其上一个内存块的首地址加上其空间的大小是否等于回收空间的首地址,如果是,则将回收的空间与其上一个内存块空间合并,并调整上一个内存块空间的大小;
如果回收空间的首地址不是队列尾地址,则判断所述队列其首地址加上其空间大小是否等于下一个内存块的首地址,如果是,则将回收的空间与其下一个内存块空间合并,并调整该内存块空间的大小。
与现有技术相比,应用本发明,其中内存池的内存页面的数量可由系统动态扩充,而且能在一定程度上提高内存空间分配的效率和减少内存碎片,同时增加相应的状态信息和流控标志来帮助控制流控。
附图说明
图1是本发明具体实施方式中一种终端的内存池的管理方法的流程图;
图2是本发明的终端无线通信协议栈内存池结构示意图。
具体实施方式
下面结合附图和具体实施方式对本发明作进一步说明。
本发明的主要构思是:在终端无线通信协议栈的内存池的内存分配上采取了动态的逐步扩充的分配方式,可以有效利用有限的内存空间;在内存块链接的方式上采取按照地址由低到高的顺序进行链接;在内存回收上采取了根据地址插入的方法,同时观察释放的内存块地址与前后内存块的关系,尽可能合成一块,可以有效的减少内存碎片,并且加快内存空间申请的速度,提高系统效率;在流控方面,在每个内存块的信息块上添加指示页面大小的信息元,同时设立最低水位线与最高水位线等流控参数进行流控。
如图1所示,本发明的一种终端的内存池的管理方法,包括以下步骤,
步骤10、内存池进行内存初始化,设立多个内存池队列,并分别配置各个内存池的参数;
步骤20、内存池进行内存空间申请和/或回收空间,其中对内存池的流控是通过在内存池中配置最高水位线、最低水位线,同时在内存空间申请和/或回收空间的过程中判断当前处于最高水位线和最低水位线上下间的可继续扩充的内存块数和禁止申请标志的设置来完成;其中,最高水位线、最低水位线表示内存池中可继续扩充的内存块数量多少的两个位置线。
图2是本发明的终端无线通信协议栈内存池结构示意图,应用于该内存池的管理方法,具体包括以下步骤,
首先,内存池进行内存初始化,包括以下步骤:
步骤100:根据系统的需要设立多个内存池队列(内存池队列的设立依据可以是不同的协议层的应用接入点或者是上下行的数据流方向),并且分别配置各个内存池的参数(如内存块指针,内存申请指针,可扩充内存块个数,最低水位线,最高水位线等);如果内存池需要互斥访问,还要初始化互斥信号量;
步骤200:根据所申请的内存池总共的大小PoolSize和所配置的每次扩充申请内存页面的大小BlockSize,计算出总共可以申请最大的可扩充内存块数MoreOver、和内存池还可继续扩充的内存块数P;
MoreOver=1+INT((PoolSize-1)/BlockSize);
P=MoreOver-1,(其中P表示内存池还可继续扩充的内存块数);
初始时,申请1个(BlockSize)大小的内存页面,同时给相应的内存池参数和内存块信息元素的参数(包括内存块指针,内存申请指针,内存块大小等)赋值;其中,内存块指针使整个内存池的内存块形成一个循环链表;内存申请指针指向在内存池中申请内存空间所在的内存块(初始时指向第一个页面)。
在内存池初始化时合理设置好以下几个跟流控相关的信息元(最低水位线LWM,最高水位线HWM,最低水位线上的内存块数,禁止申请标志)。
在内存池初始化后,对内存池的管理包括两个处理内容(内存空间申请和回收空间)。
其中,内存池的流控是通过在内存池中配置最高水位线、最低水位线,同时在内存申请和回收空间的过程中判断当前处于最高水位线和最低水位线上下间的内存块数和禁止申请标志的设置来达到流控的目的。
最高水位线、最低水位线表示内存池中可继续扩充的内存块数量多少的两个位置线;其中,当内存池中可继续扩充的内存块数量在最高水位线上,则将禁止申请标志设置为假,内存池可以进行内存空间申请;当内存池中可继续扩充的内存块数量在最低水位线下,则将禁止申请标志设置为真,内存池不能进行内存空间申请,内存池不能申请新的内存空间。
当所述禁止申请标志为真时,则内存池不能进行内存空间申请,否则可以进行内存空间申请;当进行内存空间申请后,如果内存池中可继续扩充的内存块数量满足禁止申请条件,则将禁止申请标志置为真,停止内存空间申请;随着内存池空间的回收,当内存池中可继续扩充的内存块数量回到最高水位线上时,则将禁止申请标志置假,可以进行内存空间申请,内存池又可以分配内存空间;在最高水位线和最低水位线间的内存空间相当于缓冲,避免在分配与停止间反复引起震荡,同时避免搜索内存块链表,提高系统分配的效率。
一、在内存池的内存空间申请采取如下的步骤:
步骤301:从内存申请指针所指向的内存块开始找寻内存空间,当内存申请指针所指内存块空间大于等于所要申请的内存空间时,则执行步骤304,否则执行步骤302;
步骤302:内存申请指针指向当前内存块的下一个内存块,判断该内存块空间的大小是否大于等于所要申请的内存空间大小,如果是,则执行步骤304,否则,内存申请指针继续指向下一个内存块,继续判断该内存块空间的大小是否大于等于所要申请的内存空间大小,依次类推,直到找到满足条件的内存块,然后执行步骤304;其中,当内存申请指针将所有的内存块都搜索完毕时,如果P=0,则表示当前内存池空间不足,且内存池无法扩充页面,内存空间申请失败,跳出申请,结束;如果P>0,则表示当前内存池空间不足,但是内存池可以继续扩充页面,执行步骤303;
步骤303:在内存块队列中新申请一块BlockSize大小的内存页面,同时将该内存页面链接到内存池队列上,形成循环链表,链接的顺序为内存块首地址由低到高的顺序;在该新申请的内存页面上申请所需的内存空间,重新调整该内存块空间的大小,同时将内存申请指针指向该内存块,调整内存池相应参数,返回申请到的内存空间首地址,跳出申请,结束;
步骤304:在所述内存块空间上申请相应大小的内存空间,调整该内存块空间大小参数,如果P大于0,则将内存申请指针指向该内存块,否则,P为0,在内存块循环链表上删除该内存块,同时将内存申请指针指向下一个内存块,调整内存池相应参数,返回申请到的内存空间首地址
在内存池申请空间时需要考虑流控的因素,判断禁止申请标志是否为真,如果为真,则表示此时内存空间不足,内存池不能内存空间申请;否则,该内存池可以进行内存空间申请。
内存空间申请成功后,判断此时内存池中可继续扩充的内存块数是否由最低水位线上变为最低水位线下,如果是,则将最低水位线上的内存块数减1,判断最低水位线上可继续扩充的内存块数为0、P为0是否同时满足,如果是,则将禁止申请标志置为真,表示此时内存池空间不足,内存池停止内存空间申请。
二、在内存池的回收空间采取如下的步骤:
根据回收空间的首地址搜索内存池队列,包括以下几种情况:
如果回收空间的首地址小于队列首地址,则将回收空间置于队列开头,如果回收空间的首地址小于队列尾地址,则将回收空间置于队列的末尾;否则,搜索内存池队列找到其空间位于上一个内存块和下一个内存块地址之间的位置;
如果回收空间的首地址不是队列首地址,则判断所述队列其上一个内存块的首地址加上其空间的大小是否等于回收空间的首地址,如果是,则将回收的空间与其上一个内存块空间合并,并调整上一个内存块空间的大小;
如果回收空间的首地址不是队列尾地址,则判断所述队列其首地址加上其空间大小是否等于下一个内存块的首地址,如果是,则将回收的空间与其下一个内存块空间合并,并调整该内存块空间的大小;
在内存池回收空间时需要考虑流控的因素,每当在缓冲池的某一个内存池中回收一个内存空间时,则判断新增或者合并的可继续扩充的内存块数是否由最低水位线下变为最低水位线上,如果是,则将最低水位线以上的可继续扩充的内存块数加1;如果变化后的可继续扩充的内存块数由最高水位线下成为最高水位线上,则将禁止申请标志置为假,表示内存池可以重新申请空间。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉该技术的人在本发明所公开的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。