本发明专利技术公开了一种基于链表的动态内存管理方法和设备,所述方法包括:定义内存空间,所述内存空间首尾满足内存对齐的要求;接收来自应用的内存请求,定义其所需类型的链表内存池并声明其入口地址;获取链表节点,判断链表内存池是否为空,若所述链表内存池不为空,则从对应链表内存池中获取链表节点,若所述链表内存池为空,则向所述内存空间申请链表节点;应用使用完成后,释放所占用的链表节点,将所述占用的链表节点释放回原链表内存池。占用的链表节点释放回原链表内存池。占用的链表节点释放回原链表内存池。
【技术实现步骤摘要】
一种基于链表的动态内存管理方法和设备
[0001]本专利技术涉及计算机内存管理领域,具体的,涉及一种基于链表的动态内存管理方法和设备。
技术介绍
[0002]计算机软件编程中,为实现某一个复杂的软件功能,编程人员通常会定义很多的链表结构(即固定大小的内存区域),用于实现高效的数据管理,在大部分的编程场合中,这些链表的所需的数量通常不是确定的,因为链表实际使用的数量通常与应用和实际系统的运行情况有很强的联系。若采用动态内存分配方式获取内存并创建链表节点,通常会带来较大的内存分配搜索时间以及额外内存管理空间上的开销,而且由于内存分配时搜索方法通常很难保证每次分配时间的一致性,在很多应用场合特别是嵌入式应用这种实时性要求较高的场合中,一般是不宜采用的。因此,为了提高效率,通常会采用静态链表数组的方式进行。在实现时,首先由程序员对应用可能产生的最大链表数量进行估计,在考虑一定的数据节点裕量后,综合确定实际静态链表数组的元素个数,而后对这些链表节点进行初始化,将所有的链表节点链接成为一个空闲链表池,并由程序员在链表池上实现链表节点动态分配。这种编程方式通常会产生以下几个问题:
[0003]1.由于链表数量对系统运行稳定性有较大影响,链表数量少时,容易导致部分功能实现有缺陷,数量较大容易造成严重内存资源浪费,在内存资源有限的场合,可能导致其他功能运行异常。因此,必须要求程序员对实际业务功能非常熟悉,以此对系统可能产生的最大链表资源数量能够准确预估,才能合理控制内存资源,而在某些应用场合,链表的数量可能依赖于硬件的性能、实际CPU的执行情况以及系统所运行的应用功能,要准确预估数量是很难的,从而使程序的总体性能表现不佳;
[0004]2.由于每种链表总是需要有一定的预留空间,即便程序员能够准确预估各类链表节点的数量,当链表种类较多时,需要预留的空间也会变多,即使为每种链表预留的内存资源较少,也会由于链表种类多也会造成系统内存空间的大量闲置;
[0005]3.由于使用时需要首先将各类链表数分别初始化成各自的空闲链表池,
[0006]若链表资源的种类较多而且各种类的链表数量需求较大,则会给CPU带来很大的系统初始化负担,对于一些实时性要求苛刻的场合,如嵌入式操作系统的启动,会带来较大不利的影响;
[0007]4.在某些相互独立的应用功能中,若需要用到同种类的链表结构,通常都会通过共享链表池资源实现,造成应用间内存资源交叉。由于应用功能是相互独立的,因此两部分程序没有联系,这种情况下处于安全保护的目的,一般不希望两种功能变量空间上有交叉,而共享链表池却要求必须同享内存池资源,这时需要用到较多的同步互斥操作,系统容易出错;
[0008]在上述应用中,各类内存节点的数量较难预测,是影响系统稳定以及内存资源利用率的重要因素,另外,大量不同种类链表的空闲池初始化也是制约系统应用的一个难题。
通过总结可以发现,上述应用中,所有链表结构都是已知的,也就是说其占用内存空间大小是确定的,此外,每种类型链表节点同时并发使用的数量可能不多,但总量不定,另外获得的节点无需返回系统内存堆,而是向对应的数据链表空闲池中返回。
[0009]结合以上分析,需要提出一种新的动态内存管理方法,用以提高效率并减少内存空间浪费,降低对程序员对实际业务掌握的要求。
技术实现思路
[0010]为解决上述问题至少之一,本专利技术的一个目的在于提供一种基于链表的动态内存管理方法,包括:
[0011]定义内存空间,所述内存空间首尾满足内存对齐的要求;
[0012]接收来自应用的内存请求,定义其所需类型的链表内存池并声明其入口地址;
[0013]获取链表节点:判断链表内存池是否为空,若所述链表内存池不为空,则从对应链表内存池中获取链表节点,若所述链表内存池为空,则向所述内存空间申请链表节点;
[0014]应用使用完成后,释放所占用的链表节点,将所述占用的链表节点释放回原链表内存池。
[0015]具体的,所述定义内存空间包括:
[0016]声明一个指针变量arrStart,将内存空间首地址赋值给所述指针变量arrStart,设置内存空间首个整型数为内存空间的剩余空间字节个数nRemain。
[0017]具体的,所述若所述链表内存池不为空,则从对应链表内存池中获取链表节点包括:
[0018]获取链表内存池入口地址ppFreePool和链表数据大小nSize,其中nSize满足系统内存对齐要求,读取当前ppFreePool存储的内存池末端节点pTail,若所述末端节点pTail不为空,即所述链表内存池不为空,设置获取缓存的节点指针pRet=pTail
‑
>pNext,若所述节点指针pRet等于pTail,则取出pRet节点并设置所述链表内存池为空,即令*ppFreePool=NULL,若所述节点指针不等于pTail,则取出pRet节点并令pTail
‑
>pNext=pRet
‑
>pNext,其中pNext用于将内部指针指向链表中的下一个节点。
[0019]具体的,所述若所述链表内存池为空,则向所述内存空间申请链表节点包括:
[0020]获取链表内存池入口地址ppFreePool和链表数据大小nSize,读取当前ppFreePool存储的内存池末端节点pTail,若所述末端节点pTail为空,则读取系统统一数组起始空间arrStart,以及arrStart首部剩余内存大小nRemain,若所述剩余内存大小nRemain小于链表数据大小nSize,则设置返回指针pRet为空指针NULL;
[0021]若所述剩余空间字节个数nRemain大于链表数据大小nSize,则设置所述剩余空间字节个数nRemain=nRemain
‑
nSize,设置返回指针pRet=arrStart+nRemain。
[0022]优选的,所述链表内存池采用单向环形链表的形式,所述链表内存池的入口地址始终指向最末端节点。
[0023]具体的,所述应用使用完成后,释放所占用的链表节点pFree,将所述占用的链表节点pFree释放回原链表内存池包括:
[0024]所述链表节点pFree释放时,读取原链表内存池的入口地址ppFreePool以及其末端节点pTail,判断链表内存池是否为空,若为空,则设置链表自身为单向环形链表,设置链
表池入口地址内容为pFree;若不为空,则将所述释放后的缓存节点pFree插入原链表末端节点pTail与首端节点之间,同时将入口地址ppFreePool更改为最新释放的节点pFree,使得最近一次释放的链表节点成为末端节点。
[0025]优选的,所述内存空间引入了变量设置,若当前系统的内存空间已经使用完,则重新设置另一个缓存空间,继续进行链表节点的分配。
[0026]第二方面,本专利技术的第二个目的在于提供一种动态内存管理本文档来自技高网...
【技术保护点】
【技术特征摘要】
1.一种基于链表的动态内存管理方法,其特征在于,包括:定义内存空间,所述内存空间首尾满足内存对齐的要求;接收来自应用的内存请求,定义其所需类型的链表内存池并声明其入口地址;获取链表节点:判断链表内存池是否为空,若所述链表内存池不为空,则从对应链表内存池中获取链表节点,若所述链表内存池为空,则向所述内存空间申请链表节点;应用使用完成后,释放所占用的链表节点,将所述占用的链表节点释放回原链表内存池。2.根据权利要求1所述的动态内存管理方法,其特征在于,所述定义内存空间具体包括:声明一个指针变量arrStart,将内存空间首地址赋值给所述指针变量arrStart,设置内存空间首个整型数为内存空间的剩余空间字节个数nRemain。3.根据权利要求1所述的动态内存管理方法,其特征在于,所述若所述链表内存池不为空,则从对应链表内存池中获取链表节点具体包括:获取链表内存池入口地址ppFreePool和链表数据大小nSize,其中nSize满足系统内存对齐要求,读取当前ppFreePool存储的内存池末端节点pTail,若所述末端节点pTail不为空,即所述链表内存池不为空,设置获取缓存的节点指针pRet=pTail
‑
>pNext,若所述节点指针pRet等于pTail,则取出pRet节点并设置所述链表内存池为空,即令*ppFreePool=NULL,若所述节点指针不等于pTail,则取出pRet节点并令pTail
‑
>pNext=pRet
‑
>pNext,其中pNext用于将内部指针指向链表中的下一个节点。4.根据权利要求1所述的动态内存管理方法,其特征在于,所述若所述链表内存池为空,则向所述内存空间申请链表节点具体包括:获取链表内存池入口地址ppFreePool和链表数据大小nSize,读取当前ppFreePool存储的内存池末端节点pTail,若...
【专利技术属性】
技术研发人员:吕锦柏,崔萍,陈操,
申请(专利权)人:吕锦柏,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。