CN106201910A - 一种小块内存的管理方法和装置 - Google Patents
一种小块内存的管理方法和装置 Download PDFInfo
- Publication number
- CN106201910A CN106201910A CN201610743435.4A CN201610743435A CN106201910A CN 106201910 A CN106201910 A CN 106201910A CN 201610743435 A CN201610743435 A CN 201610743435A CN 106201910 A CN106201910 A CN 106201910A
- Authority
- CN
- China
- Prior art keywords
- internal memory
- fritter
- chained list
- head
- tail
- 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
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/06—Addressing a physical block of locations, e.g. base addressing, module addressing, memory dedication
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Memory System (AREA)
Abstract
本申请公开了一种小块内存的管理方法和装置,该方法包括:在初始化过程中,分配一整块内存;对所述一整块内存划分成多个小块内存,并对所述小块内存进行索引;利用单向链表将所述小块内存串联起来,并用head和tail来标记所述链表的头结构和尾结构;当需要使用一块预设内存时,从所述链表的所述head的索引号中找到对应的小块内存,并将所述head指向下一个节点。上述方法和装置,移植操作简单,使用灵活,使用范围广,高效利用内存空间,而且分配效率高。
Description
技术领域
本发明属于软件存储技术领域,特别是涉及一种小块内存的管理方法和装置。
背景技术
现有技术中,写代码时,分配一块内存会用malloc,在内核态用kmalloc,释放时候用free或kfree,这种方式容易造成内存碎片,导致后面要分配一块大块的内存时没有连续的空间来进行分配,正常的linux内核中用的内存管理的方式是伙伴***和slub***共用的方式,slub分配的时候,是按照2的幂次方对齐的,当需要分配不是2的幂次方的小块内存时,分配的空间会大于实际用到的空间,造成了空间浪费,***之所以这样做,是为了它的通用性,做到了一种折中。另外创建一块固定大小的内存池时,分配一块内存是顺序查找空闲内存的,分配的时间复杂度最坏情况为O(n),可以说效率不是很高。在存储开发的情况下,处理上游发下来的数据,经常和数据打交道,处理数据的时候大多数用到描述符,基本上描述符是一种小型的数据结构体,用来管理和记录大块数据的流向。这种小型的数据结构体用的次数频繁,使用kmalloc或者malloc的话,不仅分配的时间长,而且会导致内存碎片,用内存池的话也会有分配时间的缺陷。
发明内容
为解决上述问题,本发明提供了一种小块内存的管理方法和装置,移植操作简单,使用灵活,使用范围广,高效利用内存空间,而且分配效率高。
本发明提供的一种小块内存的管理方法,包括:
在初始化过程中,分配一整块内存;
对所述一整块内存划分成多个小块内存,并对所述小块内存进行索引;
利用单向链表将所述小块内存串联起来,并用head和tail来标记所述链表的头结构和尾结构;
当需要使用一块预设内存时,从所述链表的所述head的索引号中找到对应的小块内存,并将所述head指向下一个节点。
优选的,在上述小块内存的管理方法中,还包括:
当需要释放所述预设内存时,将所述预设内存对应的结构***到所述链表的tail后面,并将所述tail指向***的所述结构。
优选的,在上述小块内存的管理方法中,所述当需要使用一块预设内存之后,还包括:
判断所述head是否等于所述tail,如果等于,则判断所述链表为空。
优选的,在上述小块内存的管理方法中,所述从所述链表的所述head的索引号中找到对应的小块内存包括:
利用所述预设内存的地址减数组0所对应的地址的差值,得到对应的所述索引号,利用所述索引号找到对应的小块内存。
本发明提供的一种小块内存的管理装置,包括:
分配单元,用于在初始化过程中,分配一整块内存;
划分单元,用于对所述一整块内存划分成多个小块内存,并对所述小块内存进行索引;
串联单元,用于利用单向链表将所述小块内存串联起来,并用head和tail来标记所述链表的头结构和尾结构;
小块内存寻找单元,用于当需要使用一块预设内存时,从所述链表的所述head的索引号中找到对应的小块内存,并将所述head指向下一个节点。
优选的,在上述小块内存的管理装置中,还包括:
***单元,用于当需要释放所述预设内存时,将所述预设内存对应的结构***到所述链表的tail后面,并将所述tail指向***的所述结构。
优选的,在上述小块内存的管理装置中,还包括:
判断单元,用于判断所述head是否等于所述tail,如果等于,则判断所述链表为空。
优选的,在上述小块内存的管理装置中,所述小块内存寻找单元具体用于利用所述预设内存的地址减数组0所对应的地址的差值,得到对应的所述索引号,利用所述索引号找到对应的小块内存。
通过上述描述可知,本发明提供的上述小块内存的管理方法和装置,由于该方法包括:先在初始化过程中,分配一整块内存;然后对所述一整块内存划分成多个小块内存,并对所述小块内存进行索引;再利用单向链表将所述小块内存串联起来,并用head和tail来标记所述链表的头结构和尾结构;最后,当需要使用一块预设内存时,从所述链表的所述head的索引号中找到对应的小块内存,并将所述head指向下一个节点,因此该方法和装置移植操作简单,使用灵活,使用范围广,高效利用内存空间,而且分配效率高。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为本申请实施例提供的第一种小块内存的管理方法的示意图;
图2为本申请实施例提供的第一种小块内存的管理装置的示意图。
具体实施方式
本发明的核心思想在于提供一种小块内存的管理方法和装置,移植操作简单,使用灵活,使用范围广,高效利用内存空间,而且分配效率高。
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本申请实施例提供的第一种小块内存的管理方法如图1所示,图1为本申请实施例提供的第一种小块内存的管理方法的示意图,该方法包括如下步骤:
S1:在初始化过程中,分配一整块内存;
具体的,在初始化的时候,定义一个专门管理内存的结构体,另外分配一整块内存,固定用来做后期分配用。
S2:对所述一整块内存划分成多个小块内存,并对所述小块内存进行索引;
具体的,管理结构体用链表的方式来管理整块内存,对后期将要分配的内存做划分,分成固定的大小,逐个对这些内存做索引,以便后续分配的时候使用。另外定义一块数组来管理这些内存,数组的序号和内存的序号相同,例如管理区的第1号管理结构体对应着内存块中第1块内存。
S3:利用单向链表将所述小块内存串联起来,并用head和tail来标记所述链表的头结构和尾结构;
具体的,用单向链表的方式将这些小块内存串联起来,管理结构体有next变量,初始化时指向下一个序号的结构体指针,这样把这些结构体以链表的方式连接起来,并用head和tail来标记这个链表的头结构和尾结构,初始化完成。
S4:当需要使用一块预设内存时,从所述链表的所述head的索引号中找到对应的小块内存,并将所述head指向下一个节点。
具体的,当需要用一块内存的时候,就从这个链表的head中的索引号中找到对应的小块内存,然后head指向下一个节点。
通过上述描述可知,本申请实施例提供的上述小块内存的管理方法,由于先在初始化过程中,分配一整块内存;然后对所述一整块内存划分成多个小块内存,并对所述小块内存进行索引;再利用单向链表将所述小块内存串联起来,并用head和tail来标记所述链表的头结构和尾结构;最后,当需要使用一块预设内存时,从所述链表的所述head的索引号中找到对应的小块内存,并将所述head指向下一个节点,因此该方法和装置移植操作简单,使用灵活,使用范围广,高效利用内存空间,而且分配效率高。
本申请实施例提供的第二种小块内存的管理方法,是在上述第一种小块内存的管理方法的基础上,还包括如下技术特征:
当需要释放所述预设内存时,将所述预设内存对应的结构***到所述链表的tail后面,并将所述tail指向***的所述结构。
具体的,当这块内存用完要释放的时候,就把这块内存所对应的结构***到这个链表的tail后面,并且tail指向刚***的这个结构。这样在有空间可用的情况下,每次分配的时间复杂度都是O(1),而且不会产生内存碎片的问题。初始化,分配和释放的代码量很少。可以很方便将代码的移到其他项目。
本申请实施例提供的第三种小块内存的管理方法,是在上述第一种小块内存的管理方法的基础上,还包括如下技术特征:
所述当需要使用一块预设内存之后,还包括:
判断所述head是否等于所述tail,如果等于,则判断所述链表为空。当链表为空时,就不能再继续分配内存,需要等释放后再行分配。
本申请实施例提供的第四种小块内存的管理方法,是在上述第一种小块内存的管理方法的基础上,还包括如下技术特征:
所述从所述链表的所述head的索引号中找到对应的小块内存包括:
利用所述预设内存的地址减数组0所对应的地址的差值,得到对应的所述索引号,利用所述索引号找到对应的小块内存。
具体的,分配一块内存的时候,就从head所指向的结构体中获取索引号,获取索引号的方法如下:用该结构体的地址减数组0所对应的地址的差值就是这个结构体所对应的索引值,找到这个索引值之后,就可以根据这个索引值去获取内存区的这块内存。将这个结构体的指针值交给调用者,以备后续释放。
本申请实施例提供的第一种小块内存的管理装置如图2所示,图2为本申请实施例提供的第一种小块内存的管理装置的示意图。该装置包括:
分配单元201,用于在初始化过程中,分配一整块内存,具体的,在初始化的时候,定义一个专门管理内存的结构体,另外分配一整块内存,固定用来做后期分配用;
划分单元202,用于对所述一整块内存划分成多个小块内存,并对所述小块内存进行索引,具体的,管理结构体用链表的方式来管理整块内存,对后期将要分配的内存做划分,分成固定的大小,逐个对这些内存做索引,以便后续分配的时候使用。另外定义一块数组来管理这些内存,数组的序号和内存的序号相同,例如管理区的第1号管理结构体对应着内存块中第1块内存;
串联单元203,用于利用单向链表将所述小块内存串联起来,并用head和tail来标记所述链表的头结构和尾结构,具体的,用单向链表的方式将这些小块内存串联起来,管理结构体有next变量,初始化时指向下一个序号的结构体指针,这样把这些结构体以链表的方式连接起来,并用head和tail来标记这个链表的头结构和尾结构,初始化完成;
小块内存寻找单元204,用于当需要使用一块预设内存时,从所述链表的所述head的索引号中找到对应的小块内存,并将所述head指向下一个节点,具体的,当需要用一块内存的时候,就从这个链表的head中的索引号中找到对应的小块内存,然后head指向下一个节点。
通过上述描述可知,本申请实施例提供的上述小块内存的管理装置,移植操作简单,使用灵活,使用范围广,高效利用内存空间,而且分配效率高。
本申请实施例提供的第二种小块内存的管理装置,是在上述第一种小块内存的管理装置的基础上,还包括:
***单元,用于当需要释放所述预设内存时,将所述预设内存对应的结构***到所述链表的tail后面,并将所述tail指向***的所述结构。
具体的,当这块内存用完要释放的时候,就把这块内存所对应的结构***到这个链表的tail后面,并且tail指向刚***的这个结构。这样在有空间可用的情况下,每次分配的时间复杂度都是O(1),而且不会产生内存碎片的问题。初始化,分配和释放的代码量很少。可以很方便将代码的移到其他项目。
本申请实施例提供的第三种小块内存的管理装置,是在上述第一种小块内存的管理装置的基础上,还包括:
判断单元,用于判断所述head是否等于所述tail,如果等于,则判断所述链表为空。当链表为空时,就不能再继续分配内存,需要等释放后再行分配。
本申请实施例提供的第四种小块内存的管理装置,是在上述第一种小块内存的管理装置的基础上,还包括:
所述小块内存寻找单元具体用于利用所述预设内存的地址减数组0所对应的地址的差值,得到对应的所述索引号,利用所述索引号找到对应的小块内存。具体的,分配一块内存的时候,就从head所指向的结构体中获取索引号,获取索引号的方法如下:用该结构体的地址减数组0所对应的地址的差值就是这个结构体所对应的索引值,找到这个索引值之后,就可以根据这个索引值去获取内存区的这块内存。将这个结构体的指针值交给调用者,以备后续释放。
本申请实施例提供的上述方法和装置,在空闲内存查找的时间上做到了尽可能的短,在内存空间上没有多余的浪费,只有一个管理结构体,很好的避免了内存空间的浪费。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
Claims (8)
1.一种小块内存的管理方法,其特征在于,包括:
在初始化过程中,分配一整块内存;
对所述一整块内存划分成多个小块内存,并对所述小块内存进行索引;
利用单向链表将所述小块内存串联起来,并用head和tail来标记所述链表的头结构和尾结构;
当需要使用一块预设内存时,从所述链表的所述head的索引号中找到对应的小块内存,并将所述head指向下一个节点。
2.根据权利要求1所述的小块内存的管理方法,其特征在于,还包括:
当需要释放所述预设内存时,将所述预设内存对应的结构***到所述链表的tail后面,并将所述tail指向***的所述结构。
3.根据权利要求1所述的小块内存的管理方法,其特征在于,所述当需要使用一块预设内存之后,还包括:
判断所述head是否等于所述tail,如果等于,则判断所述链表为空。
4.根据权利要求1所述的小块内存的管理方法,其特征在于,所述从所述链表的所述head的索引号中找到对应的小块内存包括:
利用所述预设内存的地址减数组0所对应的地址的差值,得到对应的所述索引号,利用所述索引号找到对应的小块内存。
5.一种小块内存的管理装置,其特征在于,包括:
分配单元,用于在初始化过程中,分配一整块内存;
划分单元,用于对所述一整块内存划分成多个小块内存,并对所述小块内存进行索引;
串联单元,用于利用单向链表将所述小块内存串联起来,并用head和tail来标记所述链表的头结构和尾结构;
小块内存寻找单元,用于当需要使用一块预设内存时,从所述链表的所述head的索引号中找到对应的小块内存,并将所述head指向下一个节点。
6.根据权利要求5所述的小块内存的管理装置,其特征在于,还包括:
***单元,用于当需要释放所述预设内存时,将所述预设内存对应的结构***到所述链表的tail后面,并将所述tail指向***的所述结构。
7.根据权利要求5所述的小块内存的管理装置,其特征在于,还包括:
判断单元,用于判断所述head是否等于所述tail,如果等于,则判断所述链表为空。
8.根据权利要求5所述的小块内存的管理装置,其特征在于,所述小块内存寻找单元具体用于利用所述预设内存的地址减数组0所对应的地址的差值,得到对应的所述索引号,利用所述索引号找到对应的小块内存。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610743435.4A CN106201910A (zh) | 2016-08-27 | 2016-08-27 | 一种小块内存的管理方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610743435.4A CN106201910A (zh) | 2016-08-27 | 2016-08-27 | 一种小块内存的管理方法和装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN106201910A true CN106201910A (zh) | 2016-12-07 |
Family
ID=57526336
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610743435.4A Pending CN106201910A (zh) | 2016-08-27 | 2016-08-27 | 一种小块内存的管理方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106201910A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107329833A (zh) * | 2017-07-03 | 2017-11-07 | 郑州云海信息技术有限公司 | 一种利用链表实现内存连续的方法和装置 |
CN108920276A (zh) * | 2018-06-27 | 2018-11-30 | 郑州云海信息技术有限公司 | Linux***内存分配方法、***及设备和存储介质 |
Citations (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1936859A (zh) * | 2005-09-30 | 2007-03-28 | 康佳集团股份有限公司 | 一种内存监控方法 |
CN101276334A (zh) * | 2007-03-29 | 2008-10-01 | 上海新跃仪表厂 | 一种快速检索数据的链表实现方法 |
US8107486B1 (en) * | 2006-10-11 | 2012-01-31 | Marvell International Ltd. | Flexible queue controller reserve list |
CN102999434A (zh) * | 2011-09-15 | 2013-03-27 | 阿里巴巴集团控股有限公司 | 一种内存管理方法及装置 |
CN103136104A (zh) * | 2011-11-24 | 2013-06-05 | 深圳市快播科技有限公司 | 一种内存管理方法和*** |
CN103617123A (zh) * | 2013-11-21 | 2014-03-05 | 珠海金山网络游戏科技有限公司 | 一种通过内存块实现内存管理的方法及*** |
US8898353B1 (en) * | 2013-12-04 | 2014-11-25 | Oracle International Corporation | System and method for supporting virtual host bus adaptor (VHBA) over infiniband (IB) using a single external memory interface |
CN104731799A (zh) * | 2013-12-20 | 2015-06-24 | ***股份有限公司 | 内存数据库管理装置 |
CN105302739A (zh) * | 2014-07-21 | 2016-02-03 | 深圳市中兴微电子技术有限公司 | 一种内存管理方法和装置 |
CN105677577A (zh) * | 2016-02-23 | 2016-06-15 | 中国农业银行股份有限公司 | 一种***的内存管理方法及装置 |
-
2016
- 2016-08-27 CN CN201610743435.4A patent/CN106201910A/zh active Pending
Patent Citations (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1936859A (zh) * | 2005-09-30 | 2007-03-28 | 康佳集团股份有限公司 | 一种内存监控方法 |
US8107486B1 (en) * | 2006-10-11 | 2012-01-31 | Marvell International Ltd. | Flexible queue controller reserve list |
CN101276334A (zh) * | 2007-03-29 | 2008-10-01 | 上海新跃仪表厂 | 一种快速检索数据的链表实现方法 |
CN102999434A (zh) * | 2011-09-15 | 2013-03-27 | 阿里巴巴集团控股有限公司 | 一种内存管理方法及装置 |
CN103136104A (zh) * | 2011-11-24 | 2013-06-05 | 深圳市快播科技有限公司 | 一种内存管理方法和*** |
CN103617123A (zh) * | 2013-11-21 | 2014-03-05 | 珠海金山网络游戏科技有限公司 | 一种通过内存块实现内存管理的方法及*** |
US8898353B1 (en) * | 2013-12-04 | 2014-11-25 | Oracle International Corporation | System and method for supporting virtual host bus adaptor (VHBA) over infiniband (IB) using a single external memory interface |
CN104731799A (zh) * | 2013-12-20 | 2015-06-24 | ***股份有限公司 | 内存数据库管理装置 |
CN105302739A (zh) * | 2014-07-21 | 2016-02-03 | 深圳市中兴微电子技术有限公司 | 一种内存管理方法和装置 |
CN105677577A (zh) * | 2016-02-23 | 2016-06-15 | 中国农业银行股份有限公司 | 一种***的内存管理方法及装置 |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107329833A (zh) * | 2017-07-03 | 2017-11-07 | 郑州云海信息技术有限公司 | 一种利用链表实现内存连续的方法和装置 |
CN107329833B (zh) * | 2017-07-03 | 2021-02-19 | 苏州浪潮智能科技有限公司 | 一种利用链表实现内存连续的方法和装置 |
CN108920276A (zh) * | 2018-06-27 | 2018-11-30 | 郑州云海信息技术有限公司 | Linux***内存分配方法、***及设备和存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN100517240C (zh) | 一种嵌入式操作***的内存池分配方法 | |
CN100382048C (zh) | 一种内存管理方法 | |
CN1996258A (zh) | 一种动态内存池的实现方法 | |
CN102880573B (zh) | 一种基于Linux***的串行RapidIo数据传输方法 | |
CN101344861B (zh) | 一种智能卡内存管理方法 | |
CN105389210B (zh) | 一种存储空间管理方法及装置 | |
CN105718319B (zh) | 一种内存池版图解析方法和内存池装置 | |
CN101968772B (zh) | 嵌入式***高效内存池的实现方法 | |
CN102103541B (zh) | 防止内存泄露和内存多次释放的内核模块内存管理方法 | |
CN101984417A (zh) | 内存管理方法及装置 | |
CN104731799A (zh) | 内存数据库管理装置 | |
CN104394096A (zh) | 一种基于多核处理器的报文处理方法及多核处理器 | |
CN104133784A (zh) | 一种报文缓存管理方法与装置 | |
CN102722455A (zh) | 一种闪存设备中数据存储的方法及装置 | |
CN106557427A (zh) | 共享内存数据库的内存管理方法及装置 | |
CN106201910A (zh) | 一种小块内存的管理方法和装置 | |
CN103793332B (zh) | 基于内存的数据存储方法、装置、处理器和电子设备 | |
CN101604261A (zh) | 超级计算机的任务调度方法 | |
CN103218305A (zh) | 存储空间的分配方法 | |
CN104572498A (zh) | 报文的缓存管理方法和装置 | |
CN106855788A (zh) | 一种堆空间的内存分配管理方法 | |
CN107678686A (zh) | 基于硬件实现闪存的ftl功能的方法及其数据存储装置 | |
CN103064749A (zh) | 一种进程间通信方法 | |
CN106855845A (zh) | 堆空间的内存分配管理***及嵌入式芯片 | |
EP3564814A1 (en) | Method and device for starting and operating system, and computer storage medium |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20161207 |