G06F9/50
1.一种嵌入式软件内存申请和释放方法,其特征在于:包括如下步骤:
步骤一、初始化内存池和内存池中的内存节点的存储结构;
步骤二、向内存池申请指定大小的内存空间;
步骤三、比较申请内存空间所占字节长度与内存池中最大内存节点的字节长度;当申请内存空间所占的字节长度大于最大内存节点的字节长度时,判断该内存池不适用于申请内存空间;从内存池外部系统调用与申请内存空间匹配的内存节点,将该内存节点作为申请的内存空间;设置该内存节点的列编号为Index;
当申请内存空间所占的字节长度小于等于最大内存节点的字节长度时,按内存节点字节长度从小到大的顺序遍历内存池中的各列,直至当第i列中内存节点的字节长度大于等于申请内存空间所占的字节长度时,查询该列中有无空闲的内存节点;当有空闲的内存节点时,将空闲的内存节点时,将该空闲的内存节点添加到已占用节点的链表头部,将该列内存池已使用内存节点个数加一,并返回该节点地址;当列中无空闲节点,则查询下一列有没有空闲节点;当所有列都没有空闲节点,从内存池外部系统调用与申请内存空间匹配的内存节点,将该内存节点作为申请的内存空间,设置该节点的列编号为Index;
步骤四、当使用完申请的内存空间后,根据内存池中内存节点的列编号将申请的内存节点归还回内存池中;
步骤五、销毁内存池。
2.根据权利要求1所述的一种嵌入式软件内存申请和释放方法,其特征在于:所述步骤一中,内存节点长度分为8字节、16字节、32字节、64字节、128字节、256字节、512字节和1024字节。
3.根据权利要求2所述的一种嵌入式软件内存申请和释放方法,其特征在于:所述步骤一中,对内存池和内存池中的内存节点的存储结构进行初始化的方法为:
将内存池按照内存节点长度划分为M列,每列中各内存节点的长度相同,不同列中的内存节点的长度均不同;M为正整数;
每列记录内存节点长度、总内存节点个数、已使用的内存节点个数、空闲节点头指针和已占用节点头指针;其中,空闲节点头指针和已占用节点头指针均指向每个内存节点;
在每个内存节点中记录所在的列编号、内存节点头指针和下一个内存节点头指针;
当将申请的存储空间归还给内存池时,无需遍历内存池中所有内存节点,仅需遍历与该内存节点列编号相同的内存节点即可;申请的存储空间大小为该内存节点列编号的全部内存节点长度;
将每列中各内存节点以单链表的形式挂载在每列的空闲节点头指针上,每列中已占用节点头指针下不挂载任何内存节点;当内存池中全部内存节点均完成上述设置后,则完成内存池和内存池中的内存节点的初始化设置。
4.根据权利要求1所述的一种嵌入式软件内存申请和释放方法,其特征在于:所述步骤三中,Index的值与内存池所有列编号均不同。
5.根据权利要求1所述的一种嵌入式软件内存申请和释放方法,其特征在于:所述步骤四中,将申请的内存节点归还回内存池中的具体方法为:
在已占用节点链表中查到待归还的内存节点的列编号,将待归还的内存节点从已占用节点链表中删除,将该内存节点加在空闲节点链表的头部,并将该列内存池已使用内存节点个数减一。
6.根据权利要求1所述的一种嵌入式软件内存申请和释放方法,其特征在于:所述步骤四中,当判断待归还内存节点的列编号为Index时,则将该内存节点归还系统。
7.根据权利要求1所述的一种嵌入式软件内存申请和释放方法,其特征在于:所述步骤五中,销毁内存池的方法为:
遍历内存池所有内存节点,释放空闲节点链表中的所有内存节点和已占用节点链表中的所有内存节点,最后释放所有列。
本发明属于嵌入式系统内存池技术领域,涉及一种嵌入式软件内存申请和释放方法。
在嵌入式系统下编程时,经常会对内存进行操作。当需要开辟一块新的内存时,在程序中使用malloc函数实现。若频繁的申请内存、释放内存,操作系统根据内存管理算法就会产生很多内存碎片,导致出现内存不足,严重影响系统性能。在资源紧张的单片机系统中,若调用开发环境自带的malloc库函数和free库函数,往往会占用本来就已经不充裕的存储空间。系统中会出现“有效空间足够,却无法分配大块连续内存”的情况
本发明解决的技术问题是:克服现有技术的不足,提出一种嵌入式软件内存申请和释放方法,在给定的内存缓冲区上建立内存管理机制,根据用户需求从该缓冲区上分配内存或者将已经分配的内存释放回缓冲区中,尽可能减少内存碎片的产生。
本发明解决技术的方案是:
一种嵌入式软件内存申请和释放方法,包括如下步骤:
步骤一、初始化内存池和内存池中的内存节点的存储结构;
步骤二、向内存池申请指定大小的内存空间;
步骤三、比较申请内存空间所占字节长度与内存池中最大内存节点的字节长度;当申请内存空间所占的字节长度大于最大内存节点的字节长度时,判断该内存池不适用于申请内存空间;从内存池外部系统调用与申请内存空间匹配的内存节点,将该内存节点作为申请的内存空间;设置该内存节点的列编号为Index;
当申请内存空间所占的字节长度小于等于最大内存节点的字节长度时,按内存节点字节长度从小到大的顺序遍历内存池中的各列,直至当第i列中内存节点的字节长度大于等于申请内存空间所占的字节长度时,查询该列中有无空闲的内存节点;当有空闲的内存节点时,将空闲的内存节点时,将该空闲的内存节点添加到已占用节点的链表头部,将该列内存池已使用内存节点个数加一,并返回该节点地址;当列中无空闲节点,则查询下一列有没有空闲节点;当所有列都没有空闲节点,从内存池外部系统调用与申请内存空间匹配的内存节点,将该内存节点作为申请的内存空间,设置该节点的列编号为Index;
步骤四、当使用完申请的内存空间后,根据内存池中内存节点的列编号将申请的内存节点归还回内存池中;
步骤五、销毁内存池。
在上述的一种嵌入式软件内存申请和释放方法,所述步骤一中,内存节点长度分为8字节、16字节、32字节、64字节、128字节、256字节、512字节和1024字节。
在上述的一种嵌入式软件内存申请和释放方法,所述步骤一中,对内存池和内存池中的内存节点的存储结构进行初始化的方法为:
将内存池按照内存节点长度划分为M列,每列中各内存节点的长度相同,不同列中的内存节点的长度均不同;M为正整数;
每列记录内存节点长度、总内存节点个数、已使用的内存节点个数、空闲节点头指针和已占用节点头指针;其中,空闲节点头指针和已占用节点头指针均指向每个内存节点;
在每个内存节点中记录所在的列编号、内存节点头指针和下一个内存节点头指针;
当将申请的存储空间归还给内存池时,无需遍历内存池中所有内存节点,仅需遍历与该内存节点列编号相同的内存节点即可;申请的存储空间大小为该内存节点列编号的全部内存节点长度;
将每列中各内存节点以单链表的形式挂载在每列的空闲节点头指针上,每列中已占用节点头指针下不挂载任何内存节点;当内存池中全部内存节点均完成上述设置后,则完成内存池和内存池中的内存节点的初始化设置。
在上述的一种嵌入式软件内存申请和释放方法,所述步骤三中,Index的值与内存池所有列编号均不同。
在上述的一种嵌入式软件内存申请和释放方法,所述步骤四中,将申请的内存节点归还回内存池中的具体方法为:
在已占用节点链表中查到待归还的内存节点的列编号,将待归还的内存节点从已占用节点链表中删除,将该内存节点加在空闲节点链表的头部,并将该列内存池已使用内存节点个数减一。
在上述的一种嵌入式软件内存申请和释放方法,所述步骤四中,当判断待归还内存节点的列编号为Index时,则将该内存节点归还系统。
在上述的一种嵌入式软件内存申请和释放方法,所述步骤五中,销毁内存池的方法为:
遍历内存池所有内存节点,释放空闲节点链表中的所有内存节点和已占用节点链表中的所有内存节点,最后释放所有列。
本发明与现有技术相比的有益效果是:
(1)本发明根据内存池中内存节点长度将内存池按列存储,能够实现快速内存申请,并能够根据申请空间的大小,选择和申请空间大小最接近的内存池,避免了内存空间的浪费;
(2)本发明将内存节点采用列编号的方式进行存储,不仅极大的提高了内存节点释放的效率,实现了快速内存释放,而且减少了内存碎片的产生;
(3)本发明可根据项目需要灵活的配置每个内存池的容量大小,即内存池容量大小是可自定义的,可以满足项目中操作内存空间的各种需求。
图1为本发明内存申请和释放流程图。
下面结合实施例对本发明作进一步阐述。
本发明提出了一种嵌入式软件内存申请和释放方法,实现了减少嵌入式系统中内存碎片的产生,合理分配管理用户内存,从而减少系统中出现“有效空间足够,却无法分配大块连续内存”的情况。
一种嵌入式软件内存申请和释放方法,如图1所示,具体包括如下步骤:
步骤一、初始化内存池和内存池中的内存节点的存储结构;内存节点长度分为8字节、16字节、32字节、64字节、128字节、256字节、512字节和1024字节。对内存池和内存池中的内存节点的存储结构进行初始化的方法为:
将内存池按照内存节点长度划分为M列,每列中各内存节点的长度相同,不同列中的内存节点的长度均不同;M为正整数;该长度可根据用户实际需求进行设定,不同列的内存池中的内存节点长度均不相同,并对每列内存池进行编号。
每列记录内存节点长度、总内存节点个数、已使用的内存节点个数、空闲节点头指针和已占用节点头指针;其中,空闲节点头指针和已占用节点头指针均指向每个内存节点;
在每个内存节点中记录所在的列编号、内存节点头指针和下一个内存节点头指针;
当将申请的存储空间归还给内存池时,无需遍历内存池中所有内存节点,仅需遍历与该内存节点列编号相同的内存节点即可;申请的存储空间大小为该内存节点列编号的全部内存节点长度;
为了提高将用完的内存归还给内存池的效率,将每列中各内存节点以单链表的形式挂载在每列的空闲节点头指针上,每列中已占用节点头指针下不挂载任何内存节点;当内存池中全部内存节点均完成上述设置后,则完成内存池和内存池中的内存节点的初始化设置。
步骤二、向内存池申请指定大小的内存空间。
步骤三、为了减少内存碎片的产生,用户在申请长度为N(N为正整数)字节的内存池空间时,会在内存池中寻内存节点长度大于N,并且长度最接近N的内存节点。比较申请内存空间所占字节长度与内存池中最大内存节点的字节长度;当申请内存空间所占的字节长度大于最大内存节点的字节长度时,判断该内存池不适用于申请内存空间;从内存池外部系统调用与申请内存空间匹配的内存节点,将该内存节点作为申请的内存空间;设置该内存节点的列编号为Index;Index的值与内存池所有列编号均不同。
当申请内存空间所占的字节长度小于等于最大内存节点的字节长度时,按内存节点字节长度从小到大的顺序遍历内存池中的各列,直至当第i列中内存节点的字节长度大于等于申请内存空间所占的字节长度时,查询该列中有无空闲的内存节点;当有空闲的内存节点时,将空闲的内存节点时,将该空闲的内存节点添加到已占用节点的链表头部,将该列内存池已使用内存节点个数加一,并返回该节点地址;当列中无空闲节点,则查询下一列有没有空闲节点;当所有列都没有空闲节点,从内存池外部系统调用与申请内存空间匹配的内存节点,将该内存节点作为申请的内存空间,设置该节点的列编号为Index。
步骤四、当使用完申请的内存空间后,根据内存池中内存节点的列编号将申请的内存节点归还回内存池中;将申请的内存节点归还回内存池中的具体方法为:
在已占用节点链表中查到待归还的内存节点的列编号,将待归还的内存节点从已占用节点链表中删除,将该内存节点加在空闲节点链表的头部,并将该列内存池已使用内存节点个数减一。
步骤五、可选的,销毁内存池。销毁内存池的方法为:
遍历内存池所有内存节点,释放空闲节点链表中的所有内存节点和已占用节点链表中的所有内存节点,最后释放所有列。
本发明的目的在于设计一种嵌入式软件内存申请和释放方法,该方法在给定的内存缓冲区上建立内存管理机制,根据用户需求从该缓冲区上分配内存或者将已经分配的内存释放回缓冲区中,尽可能减少内存碎片的产生。
本发明虽然已以较佳实施例公开如上,但其并不是用来限定本发明,任何本领域技术人员在不脱离本发明的精神和范围内,都可以利用上述揭示的方法和技术内容对本发明技术方案做出可能的变动和修改,因此,凡是未脱离本发明技术方案的内容,依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化及修饰,均属于本发明技术方案的保护范围。
本文发布于:2023-04-12 21:44:04,感谢您对本站的认可!
本文链接:https://patent.en369.cn/patent/4/85476.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |