CN113419858B - 一种动态内存分配方法 - Google Patents
一种动态内存分配方法 Download PDFInfo
- Publication number
- CN113419858B CN113419858B CN202110734591.5A CN202110734591A CN113419858B CN 113419858 B CN113419858 B CN 113419858B CN 202110734591 A CN202110734591 A CN 202110734591A CN 113419858 B CN113419858 B CN 113419858B
- Authority
- CN
- China
- Prior art keywords
- node
- memory
- ulen
- length
- header information
- 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.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 11
- 238000010586 diagram Methods 0.000 description 5
- 239000012634 fragment Substances 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
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/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
-
- 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
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明涉及一种动态内存分配方法,其可包括以下步骤:定义节点头信息,节点头信息包括节点的已使用长度ulen和next指针;内存初始化,将内存池初始化成仅有开始节点和末尾节点的单向链表结构;内存分配,从开始节点开始查找剩余的空间长度大于申请内存的长度的节点,找到后判断该节点的ulen是否等于0,若是,则将该节点的ulen的值改为申请内存的长度,否则在该节点后创建一个新节点,并将该节点的next指针指向新节点;内存释放,当释放内存时,若释放的是开始节点,则只要将开始节点的ulen赋值为0即可,否则只需要将的前一节点的next指针指到下一节点即可。本发明无需进行复杂运算,仅需对参数ulen和next指针进行操作,执行代码简单,效率高。
Description
技术领域
本发明涉及嵌入式电子设备领域,具体地涉及一种小内存嵌入式电子设备的动态内存分配方法。
背景技术
在嵌入式电子设备中,其内存(RAM)一般都比较小。为了充分利用有限的内存空间,需要对内存进行动态分配。中国发明专利申请CN103678152A公开了小内存微型控制器零碎片的动态内存分配方法,通过内存初始化、内存分配和内存释放三个步骤,可以有效地利用内存,不产生碎片。但这种方法需要知道每个分配成功的内存单元的起始地址,结束地址和长度,并且在释放的时候,需要判断之前内存单元是否已经被释放,释放了才合并,执行代码比较复杂,效率低。
发明内容
本发明旨在提供一种动态内存分配方法,以解决上述问题。为此,本发明采用的具体技术方案如下:
一种动态内存分配方法,其可包括以下步骤:
定义节点头信息,节点头信息包括节点的已使用长度ulen和next指针;
内存初始化,将内存池初始化成仅有开始节点和末尾节点的单向链表结构,其中,开始节点的ulen=0,next指针指向末尾节点;末尾节点的next指针为空,即next=NULL;
内存分配,当申请内存时,从开始节点开始查找剩余的空间长度大于等于申请内存的长度的节点,找到后判断该节点的ulen是否等于0,若是,则将该节点的ulen的值改为申请内存的长度,否则在该节点后创建一个新节点,并将该节点的next指针指向新节点,新节点的ulen值等于申请内存的长度,next指针指向下一个节点;
内存释放,当释放内存时,若释放的是开始节点,则只要将开始节点的ulen赋值为0即可,否则只需要将该节点的前一节点的next指针指到该节点的下一节点即可。
进一步地,节点的剩余空间长度LR的计算公式为:LR=nextblock-curblock-ulen-8-8,其中,curblock表示当前节点的起始地址,nextblock表示下一节点的起始地址,第一个8表示当前节点头信息所占字节数,第二个8表示新创建的下一个节点头信息所占字节数。
进一步地,ulen和next指针的长度均为4个字节。
本发明采用上述技术方案,具有的有益效果是:无需进行复杂运算,仅需对参数ulen和next指针进行操作,执行代码简单,效率高。
附图说明
为进一步说明各实施例,本发明提供有附图。这些附图为本发明揭露内容的一部分,其主要用以说明实施例,并可配合说明书的相关描述来解释实施例的运作原理。配合参考这些内容,本领域普通技术人员应能理解其他可能的实施方式以及本发明的优点。图中的组件并未按比例绘制,而类似的组件符号通常用来表示类似的组件。
图1是本发明的动态内存分配方法的流程图;
图2是内存初始化的示意图;
图3是第一次内存分配的示意图;
图4是第二次内存分配的示意图;
图5是第一内存节点释放的示意图;
图6是第三内存节点释放的示意图。
具体实施方式
现结合附图和具体实施方式对本发明进一步说明。
如图1所示,一种动态内存分配方法可包括以下步骤:
100、定义节点头信息,节点头信息包括节点的已使用长度ulen和next指针。具体代码如下:
typedef struct mpool_head{
struct mpool_head*next;
INT32U ulen;/*当前块已用长度*/
}OS_MPLIST_T;
其中,ulen和next指针分别占用4个字节。也就是说,每个节点的节点头信息占用8个字节。
200、内存初始化,将内存池初始化成仅有开始节点(或第一节点)和末尾节点的单向链表结构,其中,开始节点的ulen=0,next指针指向末尾节点;末尾节点的ulen=0,next指针为空,即next=NULL,如图2所示。即,内存的最后8个字节存储next=NULL,ulen=0。假设内存长度为4096个字节,则末尾节点的起始地址为第4088个字节。
300、内存分配,当申请内存时,从开始节点开始查找剩余的空间长度大于等于申请内存的长度的节点,找到后判断该节点的ulen是否等于0,若是,即该节点是开始节点,则将该节点的ulen的值改为申请内存的长度,否则在该节点后创建一个新节点,并将该节点的next指针指向新节点,其中,新节点的ulen值等于申请内存的长度,next指针指向下一个节点。
其中,节点的剩余空间长度LR的计算公式为:LR=nextblock-curblock-ulen-8-8,其中,curblock表示当前节点的起始地址,nextblock表示下一节点的起始地址,第一个8表示当前节点头信息所占字节数,第二个8表示新创建的下一个节点头信息所占字节数。例如,当前节点的起始地址curblock=100,下一节点的起始地址nextblock=200,当前节点的已使用长度ulen=50,则LR=200-100-50-8-8=42。计算非常简单。
例如,初始化第一次分配50字节的内存时,将开始节点的ulen赋值为50,如图3所示。在此基础上进行第二次分配100个字节时,在第58个字节创建一个新节点,即新节点的起始地址为第58个字节(注:内存地址字节顺序从0开始编号),ulen赋值为100。此时,开始节点的next指针指向新节点(即,next=58),新节点的next指针指向末尾节点(即,next=4088),如图4所示。
400、内存释放,当释放内存时,若释放的是开始节点,则只要将开始节点的ulen赋值为0即可,如图5所示,否则只需要将该节点的前一节点的next指针指到该节点的下一节点即可。如图6所示,当释放的节点是第三节点时,仅需将第二节点的next指针指向第四节点即可,即,原第三节点所占用的内存变成第二节点的剩余空间长度。整个内存释放操作非常方便,无需进行任何计算,并且在释放时也不用判断是否需要进行合并,简化了代码。
尽管结合优选实施方案具体展示和介绍了本发明,但所属领域的技术人员应该明白,在不脱离所附权利要求书所限定的本发明的精神和范围内,在形式上和细节上可以对本发明做出各种变化,均为本发明的保护范围。
Claims (1)
1.一种动态内存分配方法,其特征在于,包括以下步骤:
定义节点头信息,所述节点头信息包括节点的已使用长度ulen和next指针;
内存初始化,将内存池初始化成仅有开始节点和末尾节点的单向链表结构,其中,所述开始节点的ulen=0,开始节点的next指针指向末尾节点;所述末尾节点的next指针为空,即next=NULL;ulen和next指针的长度均为4个字节,所述内存池的最后8个字节用于存储所述末尾节点的ulen和next指针;
内存分配,当申请内存时,从所述开始节点开始查找剩余空间长度大于等于申请内存的长度的节点,找到后判断该节点的ulen是否等于0,若是,则将该节点的ulen的值改为申请内存的长度,否则在该节点后创建一个新节点,并将该节点的next指针指向新节点,新节点的ulen值等于申请内存的长度,next指针指向下一个节点;节点的剩余空间长度LR的计算公式为:LR=nextblock-curblock-ulen-8-8,其中,curblock表示当前节点的起始地址,nextblock表示下一节点的起始地址,第一个8表示当前节点头信息所占字节数,第二个8表示新创建的下一个节点头信息所占字节数;
内存释放,当释放任一节点的内存时,若释放的是开始节点,则将开始节点的ulen赋值为0,否则将该节点的前一节点的next指针修改为指向该节点的下一节点。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110734591.5A CN113419858B (zh) | 2021-06-30 | 2021-06-30 | 一种动态内存分配方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110734591.5A CN113419858B (zh) | 2021-06-30 | 2021-06-30 | 一种动态内存分配方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113419858A CN113419858A (zh) | 2021-09-21 |
CN113419858B true CN113419858B (zh) | 2024-02-13 |
Family
ID=77717928
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110734591.5A Active CN113419858B (zh) | 2021-06-30 | 2021-06-30 | 一种动态内存分配方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113419858B (zh) |
Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101140531A (zh) * | 2007-10-10 | 2008-03-12 | 中兴通讯股份有限公司 | 快速申请内存的方法 |
EP1918822A1 (fr) * | 2006-10-31 | 2008-05-07 | Axalto SA | Système et procédé d'indexation de mémoire |
CN101266575A (zh) * | 2007-03-13 | 2008-09-17 | 中兴通讯股份有限公司 | 一种提高内存池利用率的方法 |
CN101470665A (zh) * | 2007-12-27 | 2009-07-01 | Tcl集团股份有限公司 | 一种无mmu平台的应用系统内存管理的方法及系统 |
CN102968378A (zh) * | 2012-10-23 | 2013-03-13 | 深圳市融创天下科技股份有限公司 | 一种内存分配和释放的方法、装置及系统 |
CN103678152A (zh) * | 2014-01-08 | 2014-03-26 | 广州思泰信息技术有限公司 | 一种小内存微型控制器零碎片的动态内存分配方法 |
CN103984639A (zh) * | 2014-04-29 | 2014-08-13 | 宁波三星电气股份有限公司 | 一种动态内存分配方法 |
CN111177017A (zh) * | 2018-11-09 | 2020-05-19 | 炬芯(珠海)科技有限公司 | 一种内存分配方法及装置 |
CN112732435A (zh) * | 2019-10-29 | 2021-04-30 | 浙江宇视科技有限公司 | 内存动态分配方法、装置、电子设备及可读存储介质 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6785888B1 (en) * | 1997-08-29 | 2004-08-31 | International Business Machines Corporation | Memory allocator for a multiprocessor computer system |
US9733911B2 (en) * | 2015-11-11 | 2017-08-15 | National Instruments Corporation | Value transfer between program variables using dynamic memory resource mapping |
US11074179B2 (en) * | 2017-11-02 | 2021-07-27 | Hewlett Packard Enterprise Development Lp | Managing objects stored in memory |
US11403213B2 (en) * | 2019-06-28 | 2022-08-02 | International Business Machines Corporation | Reducing fragmentation of computer memory |
US11307779B2 (en) * | 2019-09-11 | 2022-04-19 | Ceremorphic, Inc. | System and method for flash and RAM allocation for reduced power consumption in a processor |
-
2021
- 2021-06-30 CN CN202110734591.5A patent/CN113419858B/zh active Active
Patent Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP1918822A1 (fr) * | 2006-10-31 | 2008-05-07 | Axalto SA | Système et procédé d'indexation de mémoire |
CN101266575A (zh) * | 2007-03-13 | 2008-09-17 | 中兴通讯股份有限公司 | 一种提高内存池利用率的方法 |
CN101140531A (zh) * | 2007-10-10 | 2008-03-12 | 中兴通讯股份有限公司 | 快速申请内存的方法 |
CN101470665A (zh) * | 2007-12-27 | 2009-07-01 | Tcl集团股份有限公司 | 一种无mmu平台的应用系统内存管理的方法及系统 |
CN102968378A (zh) * | 2012-10-23 | 2013-03-13 | 深圳市融创天下科技股份有限公司 | 一种内存分配和释放的方法、装置及系统 |
CN103678152A (zh) * | 2014-01-08 | 2014-03-26 | 广州思泰信息技术有限公司 | 一种小内存微型控制器零碎片的动态内存分配方法 |
CN103984639A (zh) * | 2014-04-29 | 2014-08-13 | 宁波三星电气股份有限公司 | 一种动态内存分配方法 |
CN111177017A (zh) * | 2018-11-09 | 2020-05-19 | 炬芯(珠海)科技有限公司 | 一种内存分配方法及装置 |
CN112732435A (zh) * | 2019-10-29 | 2021-04-30 | 浙江宇视科技有限公司 | 内存动态分配方法、装置、电子设备及可读存储介质 |
Non-Patent Citations (5)
Title |
---|
AVR单片机实时系统内存分配算法的研究;王家亮;赵海;潘荣;蔡鹏华;;东北大学学报(自然科学版)(第05期);全文 * |
DYNAMIC NETWORK RANGE-ADJUSTED MEASURE VS. DYNAMIC NETWORK SLACKS-BASED MEASURE;Avkiran Necmi Kemal;McCrystal Alan;Journal of the Operations Research Society of Japan;第57卷(第1期);全文 * |
FPGA range fills gap in Lattice portfolio.;Electronics Weekly(第2203期);全文 * |
提高堆数据局部性的动态池分配技术;王振江;武成岗;张兆庆;;计算机学报(第04期);全文 * |
无线传感网络节点内存管理机制的研究与设计;蒋林林;刘峰;;电子器件(第05期);全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN113419858A (zh) | 2021-09-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
KR100528278B1 (ko) | 데이터 블록들을 압축하여 메모리를 관리하는 방법 | |
EP2175370B1 (en) | System and method of using pooled thread-local character arrays | |
US6286016B1 (en) | Incremental heap expansion in a real-time garbage collector | |
JP4511653B2 (ja) | マルチスレッド仮想マシン内におけるメモリ・アロケーションの方法及び装置 | |
US5339431A (en) | Software compiler and linker with improved line-number table | |
US8069330B2 (en) | Memory management system for reducing memory fragmentation | |
JP2005108216A (ja) | 客体志向プログラムの動的メモリ管理方法及び装置 | |
JPH08237138A (ja) | 圧縮装置および圧縮方法 | |
GB2386715A (en) | Method for the use of a stack in a Java accelerator device | |
JP2007535241A (ja) | 条件付で実行可能モジュールを縮小するシステムおよび方法 | |
US9734620B2 (en) | Apparatus and method for graphics state management | |
CN113419858B (zh) | 一种动态内存分配方法 | |
US5832507A (en) | Method and apparatus for converting ASCII path names to parsed path name structures | |
WO2002091176A2 (en) | Frameworks for accessing java class files | |
EP1489518B1 (en) | Embedded garbage collection | |
US6009272A (en) | Register allocation via selective spilling | |
EP1386231B1 (en) | Partial loading of class files into virtual machines | |
CN109446198A (zh) | 一种基于双数组的trie树节点压缩方法及装置 | |
JP4041347B2 (ja) | ガベージコレクション装置及びガベージコレクション方法 | |
US20050021929A1 (en) | Micro controller for processing compressed codes | |
KR101670916B1 (ko) | 실행 파일 생성 방법 및 그 방법을 이용하는 시스템 장치 | |
CN104657131B (zh) | 一种软件安装包的生成系统和方法 | |
US6535969B1 (en) | Method and apparatus for allocating free memory | |
WO2003012637A2 (en) | Two tier clusters for representation of objects in java programming environments | |
CN108428195B (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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |