CN113391922A - 一种嵌入式软件内存申请和释放方法 - Google Patents
一种嵌入式软件内存申请和释放方法 Download PDFInfo
- Publication number
- CN113391922A CN113391922A CN202110667508.7A CN202110667508A CN113391922A CN 113391922 A CN113391922 A CN 113391922A CN 202110667508 A CN202110667508 A CN 202110667508A CN 113391922 A CN113391922 A CN 113391922A
- Authority
- CN
- China
- Prior art keywords
- memory
- node
- nodes
- pool
- row
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5022—Mechanisms to release resources
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5016—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Memory System (AREA)
Abstract
本发明涉及一种嵌入式软件内存申请和释放方法,属于嵌入式系统内存池技术领域;步骤一、初始化内存池和内存池中的内存节点的存储结构;步骤二、向内存池申请指定大小的内存空间;步骤三、匹配申请指定的内存空间;步骤四、当使用完申请的内存空间后,根据内存池中内存节点的列编号将申请的内存节点归还回内存池中;步骤五、销毁内存池;本发明在给定的内存缓冲区上建立内存管理机制,根据用户需求从该缓冲区上分配内存或者将已经分配的内存释放回缓冲区中,尽可能减少内存碎片的产生。
Description
技术领域
本发明属于嵌入式系统内存池技术领域,涉及一种嵌入式软件内存申请和释放方法。
背景技术
在嵌入式系统下编程时,经常会对内存进行操作。当需要开辟一块新的内存时,在程序中使用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。
步骤四、当使用完申请的内存空间后,根据内存池中内存节点的列编号将申请的内存节点归还回内存池中;将申请的内存节点归还回内存池中的具体方法为:
在已占用节点链表中查找到待归还的内存节点的列编号,将待归还的内存节点从已占用节点链表中删除,将该内存节点加在空闲节点链表的头部,并将该列内存池已使用内存节点个数减一。
步骤五、可选的,销毁内存池。销毁内存池的方法为:
遍历内存池所有内存节点,释放空闲节点链表中的所有内存节点和已占用节点链表中的所有内存节点,最后释放所有列。
本发明的目的在于设计一种嵌入式软件内存申请和释放方法,该方法在给定的内存缓冲区上建立内存管理机制,根据用户需求从该缓冲区上分配内存或者将已经分配的内存释放回缓冲区中,尽可能减少内存碎片的产生。
本发明虽然已以较佳实施例公开如上,但其并不是用来限定本发明,任何本领域技术人员在不脱离本发明的精神和范围内,都可以利用上述揭示的方法和技术内容对本发明技术方案做出可能的变动和修改,因此,凡是未脱离本发明技术方案的内容,依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化及修饰,均属于本发明技术方案的保护范围。
Claims (7)
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所述的一种嵌入式软件内存申请和释放方法,其特征在于:所述步骤五中,销毁内存池的方法为:
遍历内存池所有内存节点,释放空闲节点链表中的所有内存节点和已占用节点链表中的所有内存节点,最后释放所有列。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110667508.7A CN113391922A (zh) | 2021-06-16 | 2021-06-16 | 一种嵌入式软件内存申请和释放方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110667508.7A CN113391922A (zh) | 2021-06-16 | 2021-06-16 | 一种嵌入式软件内存申请和释放方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113391922A true CN113391922A (zh) | 2021-09-14 |
Family
ID=77621419
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110667508.7A Pending CN113391922A (zh) | 2021-06-16 | 2021-06-16 | 一种嵌入式软件内存申请和释放方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113391922A (zh) |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1635482A (zh) * | 2003-12-29 | 2005-07-06 | 北京中视联数字系统有限公司 | 一种嵌入式系统内存管理的方法 |
CN101140531A (zh) * | 2007-10-10 | 2008-03-12 | 中兴通讯股份有限公司 | 快速申请内存的方法 |
CN102063385A (zh) * | 2010-12-23 | 2011-05-18 | 深圳市金宏威实业发展有限公司 | 一种内存管理方法和系统 |
CN108038002A (zh) * | 2017-12-15 | 2018-05-15 | 天津津航计算技术研究所 | 一种嵌入式软件内存管理方法 |
-
2021
- 2021-06-16 CN CN202110667508.7A patent/CN113391922A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1635482A (zh) * | 2003-12-29 | 2005-07-06 | 北京中视联数字系统有限公司 | 一种嵌入式系统内存管理的方法 |
CN101140531A (zh) * | 2007-10-10 | 2008-03-12 | 中兴通讯股份有限公司 | 快速申请内存的方法 |
CN102063385A (zh) * | 2010-12-23 | 2011-05-18 | 深圳市金宏威实业发展有限公司 | 一种内存管理方法和系统 |
CN108038002A (zh) * | 2017-12-15 | 2018-05-15 | 天津津航计算技术研究所 | 一种嵌入式软件内存管理方法 |
Non-Patent Citations (2)
Title |
---|
21IC电子网: "内存! 内存! 内存! 嵌入式裸机编程最重要的事", 《21IC电子网》 * |
机械猿: "一篇讲透嵌入式系统内存分配方式", 《机械猿》 * |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7246195B2 (en) | Data storage management for flash memory devices | |
JP2858795B2 (ja) | 実記憶割り当て方法 | |
CN104731799B (zh) | 内存数据库管理装置 | |
US20110246742A1 (en) | Memory pooling in segmented memory architecture | |
WO2016187974A1 (zh) | 一种存储空间管理方法及装置 | |
CN1996258A (zh) | 一种动态内存池的实现方法 | |
US6643753B2 (en) | Methods and systems for managing heap creation and allocation | |
US10824555B2 (en) | Method and system for flash-aware heap memory management wherein responsive to a page fault, mapping a physical page (of a logical segment) that was previously reserved in response to another page fault for another page in the first logical segment | |
WO2009098547A1 (en) | Memory management | |
JP2006268776A (ja) | メモリカード | |
CN1271524C (zh) | 一种静态内存管理方法 | |
US7330956B1 (en) | Bucket based memory allocation | |
CN107533435A (zh) | 存储空间的分配方法及存储设备 | |
CN101344861A (zh) | 一种智能卡内存管理方法 | |
CN111984425B (zh) | 用于操作系统的内存管理方法、装置及设备 | |
CN115599544A (zh) | 内存管理方法、装置、计算机设备及存储介质 | |
US6976021B2 (en) | Method, system, and computer program product for managing a re-usable resource with linked list groups | |
CN111694765A (zh) | 一种面向移动应用特征的非易失性内存文件系统多粒度空间管理方法 | |
CN114327917A (zh) | 内存管理方法、计算设备及可读存储介质 | |
CN112784120B (zh) | 一种基于范围分片方式的kv内存数据库存储管理方法 | |
CN101610197A (zh) | 一种缓冲区管理方法及其系统 | |
CN109213423A (zh) | 基于地址屏障无锁处理并发io命令 | |
KR20090007926A (ko) | 플래시 메모리에 저장된 데이터의 인덱스 정보 관리 장치및 방법 | |
CN110109677B (zh) | 一种动态对象缓存池分配方法 | |
CN113391922A (zh) | 一种嵌入式软件内存申请和释放方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20210914 |
|
RJ01 | Rejection of invention patent application after publication |