一种基于机载嵌入式系统内存动态管理方式

2019-07-16 03:14薛楠李斌王晓华杨明伟杜建华
电脑知识与技术 2019年15期
关键词:嵌入式系统

薛楠 李斌 王晓华 杨明伟 杜建华

摘要:在嵌入式软件开发和设计中,软件的安全性和稳定性是非常重要的,一个大型的嵌入式软件是由各个不同功能的软件子系统构成的[1]。在众多不同功能的软件子系统中,内存管理功能模块是最重要的子功能模块,也是其他子功能模块的基础[2]。该文提出了一种基于动态内存管理和分配的双向链表管理方式,在动态给定存储地址和空间大小基础上,根据实际需要,将存储空间作为内存池进行动态管理,实现功能包括动态的内存申请和释放,以及给定地址内存块的查询,高效、动态地对内存空间进行操作。

关键词:嵌入式系统;内存管理;双向链表

中图分类号:TP309        文献标识码:A

文章编号:1009-3044(2019)15-0281-02

1 引言

在嵌入式系统软件开发过程中,由于嵌入式系统的特殊性,系统拥有的资源是十分有限的,但是又要满足各个子系统功能的使用要求,这就要求对嵌入式系统资源进行最高效、合理的使用[3]。内存管理是嵌入式系统软件开发中非常重要的子功能,由于资源的限制,内存资源是否被合理利用并且高效利用已经成为嵌入式软件开发的核心[4]。

在一般的静态内存管理中,嵌入式系统软件可以使用操作系统封装的内存分配和内存释放接口,而其管理是经过操作系统进行的,并且内存空间的首地址和大小一般也是固定的。开发者只可看到内存空间是否分配成功、是否释放成功和是否引起内存泄露等[5]。动态分配是根据实时需要,将一段动态给定的地址空间作为一个内存池,根据内存池的首地址和长度对内存空间进行合理化的动态分段管理和使用。因此,内存动态管理方式相比内存静态管理方式更加灵活,内存使用率也更高。本文提出一种机载嵌入式系统内存动态管理方式,使用双向链表方式动态对内存空间进行管理和操控,在内存空间资源有限的前提下高效利用空间资源,并且极大程度减少内存泄露的发生[6]。

2 动态内存管理方案与设计

2.1 内存池初始化

一般情况下,动态内存管理的方式是在系统需要时,实时的根据给定的一段可用物理内存空间的首地址和内存空间长度,通过一定的方式将物理内存空间转化成软件可直接操控的空间,提供给软件各个功能模块使用[7]。本文提出的内存管理方式,首先根据提供的可用内存首地址和内存长度,根据字节对齐将这段內存空间分配为一个分段连续的内存池空间,可看作连续的内存块组。根据多少字节对齐可以由需求动态决定,对齐的字节个数保持和每次需要申请空间的大小一致,或可将需要的内存空间大小整除,可将内存充分使用,避免内存碎片的产生。使用过程中也可以根据需要针对同一个内存空间,使用不同的对齐字节分配多个子内存池来满足使用。

定义一个双向链表结构体变量指针,作为第一个结构体变量,其中的内存空间变量指针指向内存池内存块组的第一个内存块,结构体变量中保存了直接前驱和直接后继两个结构体的指针(初始都为NULL),以及当前结构体变量指针所指内存块和当前结构体的直接后继结构体变量所指向内存块之间的内存块使用与否的标志变量(初始为未使用)以及内存块个数(初始为所有内存块) 。

2.2 给定大小内存空间申请

当需要申请内存空间时,首先找到当前结构体变量,并计算需申请的内存空间需要使用多少个内存块。先判断当前结构体变量指向的内存中剩余的内存块个数是否大于需要申请的内存空间所使用的内存块个数并且剩余内存块组使用标志位是否为未使用,然后申请一个新的双向链表结构体变量指针,新结构体变量指针的内存空间变量指针指向的地址空间为当前的结构体变量指向的内存块地址向后偏移一段长度,此长度为需要申请的内存空间所使用的内存块个数,其直接前驱指针指向当前的结构体变量,直接后继指针指向当前结构体变量的直接后继结构体变量,其当前可用内存块个数为当前结构体变量中保存的内存块个数减去需要申请的内存空间所使用的内存块个数后余下的内存块个数,并将当前结构体变量中的内存块使用与否标记为使用,将新的结构体变量中的内存块使用与否标记为未使用。最后将当前结构体变量指向的内存块地址传出给外部使用,并将新的结构体变量当作当前的结构体变量;若刚开始当前结构体变量指向的内存块使用标志为已使用或可用内存块个数不够,则继续寻找下一个结构体变量,若为空则当前结构体变量取值为指向第一个内存块的结构体变量,实现内存空间的环形寻址使用。

作为举例,根据系统需要对齐的字节长度为a。假设当前分配好的内存池大小为a*n,总共可分配n个内存块。现在已申请3a大小内存块基础上需再申请2a大小的内存块,具体流程图如图1所示,灰色内存块标注已使用。

若后面需申请的内存空间大小所需内存块个数超过n-5,当前结构体变量指针中标记的剩余内存块个数不够,且当前结构体变量指针的直接后继指针为空,则将第一个结构体变量First标记为当前结构体变量指针,继续之前操作。

2.3 释放给定地址内存块

当需要释放内存空间时,首先根据内存地址寻找其在内存池中所对应的内存块,并找到保存这个内存块首地址的目标结构体变量。将目标结构体变量使用标志设为未使用,然后取目标结构体变量的直接前驱和直接后继两个结构体变量指针,若前后两个结构体变量所指向的内存块组均不为空,并且使用标志位和目标结构体指向的内存块一致,则将此三个结构体变量合成为一个,并将其中的所有内存块合并为一整个内存块,指针指向此内存块的结构体变量设置为当前结构体变量;若目标结构体变量的直接前驱或直接后继结构体变量所指向内存块组的使用标志位和目标结构体变量不一致,则不对使用标志位不一致的结构体变量以及对应的内存块组进行合并。作为举例,要释放第二个结构体变量指针指向的内存块组,内存块组有两个内存块,如图2所示:

首先将目标结构体变量标记的内存块组使用标记设置为未使用,然后修改其直接前驱和直接后继的头尾指针,将目标结构体变量中包含的可用内存块组个数叠加到其直接前驱结构体变量中,将目标结构体变量和其直接前驱结构体变量合称为一个结构体变量,描述为当前结构体变量。最后用同样方式,将当前结构体变量和直接后继结构体变量合成为一个结构体变量,描述为当前结构体变量。具体流程图如图3所示:

释放指定内存块,就是将指向其地址的结构体变量和其直接前驱以及直接后继三个结构体变量进行合成,叠加其可用内存块个数,并释放其所指内存块组。

3 结束语

本文提出了一种基于嵌入式系统的动态内存管理方式,该方法可以实现内存的动态管理,和内存高效、高速申请和释放,通过实时传入的空间地址、空间大小以及实时需要,动态申请分配内存池,并且使用双向链表结构体指针来动态管理内存池,保证了内存空间使用的合理性以及连续性,很大程度上避免了内存碎片的产生,并且保證了内存管理功能模块的稳定性和整个嵌入式软件的安全性。经过测试本文提出的动态内存管理方式是一种高效、综合性能好内存管理方式,可作为一种内存管理方案满足嵌入式系统软件使用要求。

参考文献:

[1] 田令平.嵌入式操作系统内存管理研究[J].电脑知识与技术, 2006(4):169-171.

[2] 符丽枚,陈世航.嵌入式软件运行内存余量测试方法[J].自动化应用,2014(11):6-8.

[3] 陆小双,帅建梅,吴庆响.一种新的面向对象程序的内存管理器[J].计算机工程,2012,38(9):21-23.

[4] 吴文峰.嵌入式实时系统动态内存分配管理器的设计与实现[D].重庆:重庆大学,2013.

[5] 杨磊,汪仁煌,刘洪江,黄颖怡.使用Visual Leak Detector检测C/C++程序内存泄漏[J].电脑与电信,2008(07).

[6] 陈力军,魏永军,迮超.一种内存管理系统及其分配方法[P].中国专利号:01139150.2,2001.

[7] 魏海涛,姜昱明,李建武等.内存管理机制的高效实现研究[J].计算机工程与设计,2009,30(16):3708-3712.

【通联编辑:代影】

猜你喜欢
嵌入式系统
Teaching Research on IoT and—Embedded System of Software Engineering
面向应用的智能专业嵌入式系统教学
办公自动化系统的设计
嵌入式系统课程“中断、异常与事件”教学实践及启示
面向实践创新人才培养的嵌入式系统教学研究