一种嵌入式软件内存管理系统的制作方法

文档序号:14653568发布日期:2018-06-08 22:30阅读:202来源:国知局
一种嵌入式软件内存管理系统的制作方法

本发明涉及嵌入式软件内存管理技术领域,具体涉及一种嵌入式软件内存管理系统。



背景技术:

由于嵌入式系统的实时性、灵活性和稳定性要求,对内存管理有着特殊的策略。良好的程序性能部分依赖于其有效的内存管理能力,而常规的堆内存管理器的性能会受到内存碎片和内存回收需求的影响,尤其是在内存频繁分配和释放的应用环境中,更容易成为系统性能的瓶颈。不仅如此,潜在的内存泄露可能会使长时间运行的系统内存耗尽,导致系统性能急剧下降直至最后宕机。为解决嵌入式系统在内存分配时带来的堆中内存有碎片,同时在分配与回收时所需时间不确定等问题,一般采用内存池分配内存。传统内存池管理机制只能分配大小固定的内存块,灵活性差;其它的内存池管理方法虽然可以实现动态分配内存块,但是内存池管理的内存空间通过定义全局数组的方法创建,将数组名作为内存池地址指针传递给生成函数,这种做法显然不够灵活。

为了克服现有内存池管理机制存在的不足,需要提出一种嵌入式软件内存管理方案。



技术实现要素:

(一)要解决的技术问题

本发明是克服现有内存池管理机制存在的不足,提出一种嵌入式软件内存管理方案。

(二)技术方案

为了解决上述技术问题,本发明提供了一种嵌入式软件内存管理系统,包括系统内存区的静态内存分配模块和用户内存区的动态内存分配模块;

所述系统内存区的静态内存分配模块用于通过如下方式进行系统内存区的静态内存分配:

系统内存区通过Partition_Create()函数创建内存分区,每个块内存的第一部分存储分区对象,其后才是各个内存块,且在内存区中设置一个全局链表来存储所有的内存分区指针,内存分区的数量可动态定义,对链表中的分区按照每个分区中内存块的大小进行排序,内存块小的分区排在前面,内存块大的分区排在后面;

在申请内存块时,采用first-fit方法从系统内存区的分区链表中找到合适大小的内存分区,如果该分区空闲内存链表不为空,则返回该链表的第一个内存块地址,如果为空则查看下一块分区;如果找不到合适大小的内存分区,则返回空指针;

所述用户内存区的动态内存分配用于通过如下方式进行用户内存区的动态内存分配:

采用池式内存分配方法在程序运行前在内存池中预先分配好一块内存区,然后对内存进行分配,空闲内存块在内存池中按照从小到大的顺序以双向链表进行组织,内存池的结构由两部分组成:内存块管理头节点和可供用户读写的内存;所述内存块管理头节点包括内存池的起始地址、内存池的总大小、最大可用连续空间的大小、指向内存块双向链表的指针、指向空闲内存块的双向链表的指针和指向下一个内存池的指针;

当用户程序申请内存时,为每块内存池设置失败因子和跳转指针两个字段,所述失败因子用于记录“查找满足需求的内存池”的次数,所述跳转指针用于表示扫描内存池时下一个要跳转的节点,在顺序查找该内存池的空闲内存块双向链表时,对于失败因子高于预设阈值的节点则直接跳过;若查找到第一个满足分配字节大小要求的空闲块,将该空闲块从双向链表上移除;若未找到合适大小的空闲内存块,则重新创建一块新的内存池;如果查找到的空闲内存块大小除了能够满足用户程序所申请的字节数要求外还有一定大小的可用空闲空间,则将其分割为两个新的内存块,其中一块是为用户程序分配的内存,将其占用标志置为“占用”,另一块是可供用户程序后续申请分配的新空闲块,将其占用标志置为“空闲”,并将其作为新的空闲块按照一定方式插入到空闲块双向链表中;否则,直接将该内存块返回给用户程序。

优选地,所述系统内存区的静态内存分配模块还用于,在回收或释放内存块时,首先检查内存块属于哪个内存分区,在找到所属的内存分区后,直接把该内存块放到该分区空闲内存链表的尾部。

优选地,所述一定方式为向前查找插入法:由于分割后得到的新空闲块的大小一定小于原空闲块,因此从原空闲块在空闲块链表中的位置向前查找到合适的位置,将新的空闲块插入到该位置上即可。

优选地,所述用户内存区的动态内存分配模块还用于,在对用户的内存进行动态回收或释放时,首先对待回收或释放的内存块向前偏移内存块管理头节点大小的字节数,找到内存块管理头节点,将其中的占用标志置为空闲;通过内存块管理头节点找到其所属内存池的内存池管理头节点,然后检测与待回收或释放内存块相邻的块是否为空闲块,若是空闲块,则进行内存块的合并操作,将合并后的空闲块按照预设方法插入到所属内存池的空闲内存块链表的合适位置;否则,直接将待回收或释放内存块作为一个新空闲块从头查找并插入到所属内存池的空闲块链表中,回收或释放完成后更新内存池管理头节点中的最大可用连续空间的值。

优选地,所述预设方法为向后查找插入法:由于合并后得到的新空闲块的大小一定大于原相邻空闲块,因此从原空闲块在空闲块链表中的位置向后查找到合适的位置,将新空闲块插入到该位置上即可。

(三)有益效果

本发明采用静态分配的方式,预先设定好系统内存区中的分区数量和各个分区中内存块的数量和大小,然后基于池式内存管理机制对用户内存区采用动态内存分配的方式,通过创建内存分配器处理内存申请和释放请求,并对传统的动态内存分配和释放算法进行了改进。该方法采用静态分配系统内存区和动态分配用户内存区相结合的方式,增加了系统的灵活性,同时也限制了大量碎片的产生,避免了内存泄露的出现,且该方法能够有效降低申请和释放内存的时间耗费,提高动态内存管理效率。

附图说明

图1是本发明中创建系统内存区流程图;

图2是本发明中用户内存区内存分配流程图;

图3是本发明中用户内存区内存回收/释放流程图。

具体实施方式

为使本发明的目的、内容、和优点更加清楚,下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。

为了提高嵌入式系统内存的利用率,有效解决内存碎片和内存泄露问题,并实现内存的快速分配和释放,本发明提出一种嵌入式软件内存管理系统。该系统采用静态分配的方式,预先设定好系统内存区中的分区数量和各个分区中内存块的数量和大小,然后基于池式内存管理机制对用户内存区采用动态内存分配的方式,通过创建内存分配器处理内存申请和释放请求,并对传统的动态内存分配和释放算法进行了改进。该系统采用静态分配系统内存区和动态分配用户内存区相结合的方式,增加了系统的灵活性,同时也限制了大量碎片的产生,避免了内存泄露的出现,且该系统能够有效降低申请和释放内存的时间耗费,提高动态内存管理效率。

该系统包括系统内存区的静态内存分配模块和用户内存区的动态内存分配模块;

系统内存区的静态内存分配模块用于按照如下方式进行系统内存区的静态内存分配:

系统内存区通过Partition_Create()函数创建内存分区,创建系统内存区流程图,如图1所示。

每个块内存的第一部分存储该分区对象,其后才是各个内存块。在系统内存区中设置一个全局链表来存储所有的内存分区指针,系统内存分区的数量可以动态定义。对链表中的分区需按照每个分区中内存块的大小进行排序,内存块小的分区排在前面,内存块大的分区排在后面,这样做的好处是在采用了经典的first-fit算法后,可以减少内存浪费。

在申请内存块时,采用first-fit方法从系统内存区的分区链表中找到合适大小的内存分区,如果该分区空闲内存链表不为空,则返回该链表第一个内存块地址,否则查看下一块分区。如果找不到合适的内存块,则返回空指针。

回收/释放内存块时,首先检查该内存块属于哪个内存分区,在找到所属的内存分区后,直接把该内存块放到该分区空闲内存链表的尾部。

用户内存区的动态内存分配模块用于按照如下方式进行用户内存区的动态内存分配:

传统的动态内存分配需要频繁调用malloc/free函数,这样会产生大量的内存碎片。本发明采用池式内存分配方法可在程序运行前在内存池中预先分配好一块内存区,然后采用高效的内存管理算法对内存进行分配,可以有效降低内存碎片的产生,提高内存利用率。

和传统的池式内存分配方法相比,本发明提出的动态内存分配方法的优势在于能够明显提高空闲内存块链表的查找效率,减少内存申请与回收/释放的时间耗费,进而减少内存碎片。

空闲内存块在内存池中按照从小到大的顺序以双向链表进行组织。内存池的结构由两部分组成:内存块管理头节点和可供用户读写的内存。内存块管理头节点包括内存池的起始地址、内存池的总大小、最大可用连续空间的大小、指向内存块双向链表的指针、指向空闲内存块的双向链表的指针和指向下一个内存池的指针。

1)动态内存分配方法

当用户程序申请内存时,为每块内存池设置失败因子和跳转指针两个字段,失败因子用于记录“查找满足需求的内存池”的次数,跳转指针用于表示扫描内存池时下一个要跳转的节点。在顺序查找该内存池的空闲内存块双向链表时,对于失败因子过高(具体数值可根据实际需要设置)的节点则直接跳过,这样做可避免大量无效的扫描和判断,大大提高扫描的成功率,降低平均扫描时间;若查找到第一个满足分配字节大小要求的空闲块,将该空闲块从双向链表上移除;若未找到合适大小的空闲内存块,则重新创建一块新的内存池。

如果查找到的空闲内存块大小除了能够满足用户程序所申请的字节数要求外还有一定大小的可用空闲空间,则将其分割为两个新的内存块,其中一块是为用户程序分配的内存,将其占用标志置为“占用”,另一块是可供用户程序后续申请分配的新空闲块,将其占用标志置为“空闲”,并将其作为新的空闲块按照“向前查找插入法”插入到空闲块双向链表中;否则,直接将该内存块返回给用户程序。

“向前查找插入法”的思想是:由于分割后得到的新空闲块的大小一定小于原空闲块,因此从原空闲块在空闲块链表中的位置向前查找到合适的位置,将新空闲块插入到该位置上即可。这样做的好处是不必从头遍历整个空闲块链表,从而提高了空闲块链表的查找效率。

用户内存区内存分配的流程图如图2所示。

2)动态内存回收/释放方法

如图3所示,在对用户的内存进行动态回收/释放时,首先对待回收/释放的内存块向前偏移内存块管理头节点大小的字节数,找到内存块管理头节点,将其中的占用标志置为空闲;通过内存块管理头节点找到其所属内存池的内存池管理头节点,然后检测与待回收/释放内存块相邻的块是否为空闲块,若是空闲块,则进行内存块的合并操作,将合并后的空闲块按照“向后查找插入法”插入到所属内存池的空闲内存块链表的合适位置;否则,直接将待回收/释放内存块作为一个新空闲块从头查找并插入到所属内存池的空闲块链表中。回收/释放完成后更新内存池管理头节点中的最大可用连续空间的值。

“向后查找插入法”的思想是:由于合并后得到的新空闲块的大小一定大于原相邻空闲块,因此从原空闲块在空闲块链表中的位置向后查找到合适的位置,将新空闲块插入到该位置上即可。这样做的好处是不必从头遍历整个空闲块链表,从而提高了空闲块链表的查找效率。

以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1