CN1567250A - 一种高速零碎片的小对象内存结构及分配方法 - Google Patents
一种高速零碎片的小对象内存结构及分配方法 Download PDFInfo
- Publication number
- CN1567250A CN1567250A CNA031318916A CN03131891A CN1567250A CN 1567250 A CN1567250 A CN 1567250A CN A031318916 A CNA031318916 A CN A031318916A CN 03131891 A CN03131891 A CN 03131891A CN 1567250 A CN1567250 A CN 1567250A
- Authority
- CN
- China
- Prior art keywords
- memory
- block
- small object
- size
- divider
- 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
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明涉及一种高速零碎片的小对象内存结构及分配方法,包括:设置大块内存、基本分配器和小对象分配器,小对象分配器用于把内存的分配和回收请求按照其大小分发到相应的基本分配器;当小对象分配器收到内存分配请求后,依据请求的内存大小,把分配请求分发给相应的基本分配器,成功分配后修改上次完成分配的大块内存索引;当小对象分配器收到内存回收请求后,依据请求回收的内存大小,把回收请求分发给相应的基本分配器,成功回收后修改上次完成回收的大块内存索引。本发明使得块内碎片和块外碎片均降为零、最小分配碎片也降为零,大大节省了内存空间,提高了内存分配和回收的速度,从而极大的提高了操作系统的实时性和资源利用率。
Description
技术领域
本发明涉及一种计算机操作系统中的内存分配,尤其涉及一种高速零碎片的小对象内存结构及分配方法。
背景技术
内存分配是操作系统的核心内容之一,一个优秀的内存分配方法,要求耗费的分配时间和消耗的管理空间均较少。内存分配方法的优劣,直接关系到操作系统的速度、资源利用率等关键性能。
现有操作系统领域对内存分配的方法有较多研究,但这些现存的方法更多的考虑通用性。
比如,较为常见的伙伴系统方法,能够适应很大尺度范围内的内存分配要求,但其造成的块内碎片太大,资源利用率低,时间耗费也较大。
经典的首次适配方法,在资源利用率上比伙伴系统方法有所提高,得以应用于一些商用操作系统。但其时间耗费更大,且造成的块外碎片又成为新的问题。
在一些嵌入式实时操作系统中,为改进内存分配的时间性能,提出了快速适配方法,这一方法牺牲了分配的弹性来换取时间性能,满足了实时系统的关键需求,但与伙伴系统一样,块内碎片的问题没有得到很好的解决。
内存占用小于64字节的对象称为小对象,碎片属于小对象。
综上所述,现有技术的缺点有两个:一是受限于通用性,要满足各种需求大小,因而不可避免的存在块外和块内的碎片;二是时间性能不佳(快速适配方法除外);第三,几乎每种分配方法都使用薄记信息完成内存的分配和归还,这些薄记信息本身占用一定的内存空间,造成较大的管理开销。
发明内容
本发明的目的在于提出一种高速零碎片的小对象内存结构及分配方法,克服上述现有技术的不足之处,所述结构和方法具有实时性强、空间利用率高、管理开销小的特点,从而极大的提高了操作系统的实时性和资源利用率。
本发明的目的是这样实现的:
本发明公开一种高速零碎片的小对象内存结构,包括:
大块内存Chunk,包含固定数量的区块block及空闲区块数freeBlockNum_、首个空闲区块索引firstFreeBlock_,Chunk通过分配Allocate()和归还Deallocate()接口向上层提供和回收区块block;
基本分配器BaseAllocator,包含一个上述大块内存Chunk的数组及每个大块内存Chunk的区块大小blockSize_、每个大块内存Chunk的区块数目blockNum_、上次完成分配的大块内存Chunk索引lastAllocChunk_、上次完成回收的大块内存Chunk索引lastDeallocChunk_、大块内存Chunk数组的实际结束处,基本分配器BaseAllocator通过分配Allocate()和归还Deallocate()接口向上层提供和回收区块block;
小对象分配器SmallObjAllocator,包含一个基本分配器BaseAllocator的有序数组,各个基本分配器BaseAllocator的区块block大小不等;小对象分配器SmallObjAllocator向上层提供内存(即block)分配接口new()和内存(即block)回收接口delete();小对象分配器SmallObjAllocator用于把内存的分配和回收请求按照其大小分发到相应的BaseAllocator。
所述的每个block具有相同大小,且内含一个“下一个可用block编号”的标记,各个block之间通过此标记形成一个隐含的单链表。
所述的“下一个可用block编号”的标记仅占一字节。
所述大块内存Chunk还包括指向数据区的指针pData_,在Chunk的初始化过程中,依据参数区块大小size和数量num计算所需内存总量,向低层申请这个总量大小的一大块内存,将其首地址赋给pData_,然后,把获得的这一大块内存细分为num个block,使得每一个block的大小等于区块大小size。
所述基本分配器BaseAllocator数组中的每个BaseAllocator所辖的区块大小blockSize_均不相同,最小为1。
本发明还公开一种高速零碎片的小对象内存分配方法,包括如下步骤:
第一步:设置Chunk(大块内存),其中包含固定数量的区块(block)及空闲区块数freeBlockNum_、首个空闲区块索引firstFreeBlock_。每个block具有相同大小,且内含一个“下一个可用block编号”的标记(仅占一字节),各个block之间通过此标记形成一个隐含的单链表。Chunk通过分配Allocate()和归还Deallocate()接口向上层提供和回收block。Chunk的结构如图1所示。设置BaseAllocator(基本分配器),其中包含一个Chunk的数组及每个Chunk的区块大小blockSize_、每个Chunk的区块数目blockNum_,上次完成分配的Chunk索引lastAllocChunk_、上次完成回收的Chunk索引lastDeallocChunk_,Chunk数组的实际结束处。BaseAllocator通过分配Allocate()和归还Deallocate()接口向上层提供和回收block。BaseAllocator的结构如图2所示。设置SmallObjAllocator(小对象分配器),其中包含一个BaseAllocator的有序数组,各个BaseAllocator的block大小不等。小对象分配器SmallObjAllocator向上层提供内存(即block)分配接口new()和内存(即block)回收接口delete()。SmallObjAllocator的主要作用是把内存的分配和回收请求按照其大小分发到相应的BaseAllocator,其结构如图3所示。
第二步:当SmallObjAllocator收到内存分配请求后,依据请求的内存大小,把分配请求分发给相应的BaseAllocator,若相应BaseAllocator还没有创建,则创建之。BaseAllocator首先检查索引lastAllocChunk_指向的Chunk的空闲列表,若其非空,则分配之,并修改空闲区块数目freeBlocksNum_和首个空闲区块索引firstFreeBlock_,否则依次搜索Chunk数组,直至找到为止。成功分配后修改lastAllocChunk_。
第三步:当SmallObjAllocator收到内存回收请求后,依据请求回收的内存大小,把回收请求分发给相应的BaseAllocator。BaseAllocator依据待回收内存的指针搜索其归属Chunk,搜索从索引lastDeallocChunk_开始。搜索完成则回收之。成功回收后修改lastDeallocChunk_。
本发明的有益效果:
本发明所述的针对小对象的高速高效的内存结构及分配方法,对每一个大小值进行对应快速分配,使得块内碎片和块外碎片均降为零;对每一个区块采用了最少的簿记信息,因此最小区块大小缩短为1个字节,从而使得最小分配碎片也降为零。上述方法的采用,大大节省了内存空间,提高了内存分配和回收的速度,从而极大的提高了操作系统的实时性和资源利用率。
附图说明
图1是Chunk结构示意图;
图2是BaseAllocator结构示意图;
图3是SmallObjAllocator结构示意图;
图4是内存分配流程图;
图5是内存回收流程图。
具体实施方式
下面结合附图,基本按照附图的顺序对技术方案的实施作进一步的详细描述:
图1介绍了Chunk的结构。一个Chunk包含三部分:指向数据区的指针pData_,当前可用区块数freeBlocksNum_和当前首个可用区块索引firstFreeBlock_。之所以采用索引方式而非指针方式,是出于节约内存的考虑。Chunk的C++语言定义如下:
class Chunk { public: Chunk():freeBlocksNum_(0), firstFreeBlock_(0), pData_(NULL) {} void Init(unsigned char size,unsigned char num); void*Allocatate(unsigned char size); void Deallocate(void*p,unsigned char size); private: unsigned char freeBlocksNum_; unsigned char firstFreeBlock_; unsigned char*pData_; };
在Chunk的初始化Init()过程中,依据参数区块大小size和数量num计算所需内存总量,向低层申请这个总量大小的一大块内存,将其首地址赋给pData_,然后,把获得的这一大块内存细分为num个block,使得每一个block的大小等于size,并且在每个block的第一个字节填入“下个可用block的索引”(使用1字节的索引而非4字节的指针是出于节约内存考虑),使得这些block形成一个隐含的单链表,最后对freeBlocksNum_和firstFreeBlock_进行相应赋值。代码如下:
void Chunk::Init(unsigned char size,unsigned char num)
{
pData_=malloc(size*num);
unsigned char*p=pData_;
for(unsigned char i=0;i!=num;p+=size)
*p=++i;
freeBlocksNum_=num;
firstFreeBlock_=0;
}
初始化完成后,当需要响应分配请求时,Chunk对象依据firstFreeBlock_和pData_计算出相应block的地址p,把此区块中的“下个可用block的索引”赋值给firstFreeBlock_,减少freeBlocksNum_,返回p。
当需要响应回收请求时,Chunk对象把待回收block的“下个可用block的索引”置为firstFreeBlock_,并把firstFreeBlock_设置为此block,并增加freeBlocksNum_。
图2介绍了BaseAllocator的结构。一个BaseAllocator包含一个Chunk数组和一组控制信息。
因为Chunk的freeBlocksNum_宽度为8比特,所以一个Chunk只能容纳256个block,当某一大小的block数目超出此限制时,就需要多个Chunk。我们将其组织成数组,并加上一些控制信息,形成BaseAllocator。
BaseAllocator的控制信息之中,blockSize_表示此BaseAllocator下辖的各个block的大小;blockNum_表示每个Chunk的block数量;ChunkEnd_表示Chunk数组中第一个无效的索引;lastAllocChunk_表示Chunk数组中最近一次进行分配的Chunk索引。根据程序的局部性原理,下次分配很可能由这个Chunk完成,否则,搜索整个Chunk数组,直至找到满足需要的Chunk为止,如果没有一个Chunk能满足要求,则在ChunkEnd_位置进行一次Chunk的初始化过程,并增加ChunkEnd_。
lastDeallocChunk_表示Chunk数组中最近一次进行回收的Chunk索引,设置它的原因同lastAllocChunk_。
图3介绍了SmallObjAllocator的结构。一个SmallObjAllocator由一个BaseAllocator的有序数组和一些记录信息组成。BaseAllocator有序数组中的每个BaseAllocator所辖的blockSize_(作为排序依据)均不相同,最小为1,最大为用户定义的MAX_SIZE(缺省值为64)。SmallObjAllocator的任务,就是把一个分配或回收请求依据其size分派到适当的BaseAllocator。
图4介绍了内存分配流程。当SmallObjAllocator收到内存分配请求后,依据请求的内存大小,把分配请求分发给相应的BaseAllocator,若相应BaseAllocator还没有创建,则创建之。BaseAllocator首先检查索引lastAllocChunk_指向的Chunk的空闲列表,若其非空,则分配之,并修改freeBlocksNum_和firstFreeBlock_,否则依次搜索Chunk数组,直至找到为止。成功分配后修改lastAllocChunk_。
图5介绍了内存回收流程。当SmallObjAllocator收到内存回收请求后,依据请求回收的内存大小,把回收请求分发给相应的BaseAllocator。BaseAllocator依据待回收内存的指针搜索其归属Chunk,搜索从索引lastDeallocChunk_开始。搜索完成则回收之。成功回收后修改lastDeallocChunk_。
上述内容就是本方法的核心部分,具体细节不再赘述。由上述核心方法所派生的其他具体应用,都在本发明专利的保护之列。
Claims (12)
1.一种高速零碎片的小对象内存结构,其特征在于,包括:
大块内存,包含固定数量的区块及空闲区块数目、首个空闲区块索引,大块内存通过分配和归还接口向上层提供和回收区块;
基本分配器,包含一个所述大块内存的数组及每个大块内存的区块大小、每个大块内存的区块数目、上次完成分配的大块内存索引、上次完成回收的大块内存索引、大块内存数组的实际结束处,基本分配器通过分配和归还接口向上层提供和回收区块;
小对象分配器,包含一个基本分配器的有序数组,各个基本分配器的区块大小不等;小对象分配器向上层提供内存分配接口和内存回收接口;小对象分配器用于把内存的分配和回收请求按照其大小分发到相应的基本分配器。
2.如权利要求1所述的高速零碎片的小对象内存结构,其特征在于,所述的每个区块具有相同大小,且内含一个下一个可用区块编号的标记,各个区块之间通过此标记形成一个隐含的单链表。
3.如权利要求2所述的高速零碎片的小对象内存结构,其特征在于,所述的下一个可用区块编号的标记仅占一字节。
4.如权利要求1所述的高速零碎片的小对象内存结构,其特征在于,大块内存还包括指向数据区的指针,在大块内存的初始化过程中,依据区块大小参数和数量参数计算所需内存总量,向低层申请这个总量大小的一大块内存,将其首地址赋给指向数据区的指针,然后,把获得的这一大块内存细分为数个区块,使得每一个区块的大小等于区块大小参数。
5.如权利要求1所述的高速零碎片的小对象内存结构,其特征在于,基本分配器数组中的每个基本分配器所辖的区块大小均不相同,最小为1。
6.一种高速零碎片的小对象内存分配方法,其特征在于,包括如下步骤:
第一步:设置大块内存,其中包含固定数量的区块及空闲区块数、首个空闲区块索引,大块内存通过分配和归还接口向上层提供和回收区块;设置基本分配器,其中包含一个大块内存的数组及每个大块内存的区块大小、每个大块内存的区块数目、上次完成分配的大块内存索引、上次完成回收的大块内存索引、大块内存数组的实际结束处,基本分配器通过分配和归还接口向上层提供和回收区块;设置小对象分配器,其中包含一个基本分配器的有序数组,各个基本分配器的区块大小不等;小对象分配器向上层提供内存分配接口和内存回收接口;小对象分配器用于把内存的分配和回收请求按照其大小分发到相应的基本分配器;
第二步:当小对象分配器收到内存分配请求后,依据请求的内存大小,把分配请求分发给相应的基本分配器,成功分配后修改上次完成分配的大块内存索引;
第三步:当小对象分配器收到内存回收请求后,依据请求回收的内存大小,把回收请求分发给相应的基本分配器,成功回收后修改上次完成回收的大块内存索引。
7.如权利要求6所述的高速零碎片的小对象内存分配方法,其特征在于,所述的每个区块具有相同大小,且内含一个下一个可用区块编号的标记,各个区块之间通过此标记形成一个隐含的单链表。
8.如权利要求7所述的高速零碎片的小对象内存分配方法,其特征在于,所述的下一个可用区块编号的标记仅占一字节。
9.如权利要求6所述的高速零碎片的小对象内存分配方法,其特征在于,大块内存还包括指向数据区的指针,在大块内存的初始化过程中,依据区块大小和数量参数计算所需内存总量,向低层申请这个总量大小的一大块内存,将其首地址赋给指向数据区的指针,然后,把获得的这一大块内存细分为数个区块,使得每一个区块的大小等于区块大小参数。
10.如权利要求6所述的高速零碎片的小对象内存分配方法,其特征在于,基本分配器数组中的每个基本分配器所辖的区块大小均不相同,最小为1。
11.如权利要求6所述的高速零碎片的小对象内存分配方法,其特征在于,第二步还包括下面的步骤:基本分配器首先检查上次完成分配的大块内存索引指向的大块内存的空闲列表,若其非空,则分配之,并修改空闲区块数目和首个空闲区块索引,否则依次搜索大块内存数组,直至找到为止。
12.如权利要求6所述的高速零碎片的小对象内存分配方法,其特征在于,第三步还包括下面的步骤:基本分配器依据待回收内存的指针搜索其归属大块内存,搜索从上次完成回收的大块内存索引开始,搜索完成则回收之。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNA031318916A CN1567250A (zh) | 2003-06-11 | 2003-06-11 | 一种高速零碎片的小对象内存结构及分配方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNA031318916A CN1567250A (zh) | 2003-06-11 | 2003-06-11 | 一种高速零碎片的小对象内存结构及分配方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN1567250A true CN1567250A (zh) | 2005-01-19 |
Family
ID=34469801
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNA031318916A Pending CN1567250A (zh) | 2003-06-11 | 2003-06-11 | 一种高速零碎片的小对象内存结构及分配方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN1567250A (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100382048C (zh) * | 2005-11-08 | 2008-04-16 | 中兴通讯股份有限公司 | 一种内存管理方法 |
CN101799786A (zh) * | 2009-02-11 | 2010-08-11 | 三星电子株式会社 | 管理动态存储器的嵌入式系统和动态存储器管理方法 |
CN101866298A (zh) * | 2009-04-14 | 2010-10-20 | 上海科泰世纪科技有限公司 | 线程托管对象的方法 |
CN103544203A (zh) * | 2013-07-11 | 2014-01-29 | 盛科网络(苏州)有限公司 | 基于链表的索引分配方法和装置 |
CN104778264A (zh) * | 2015-04-22 | 2015-07-15 | 北京科电高技术公司 | 一种键值数据库的内存分配方法 |
CN106844224A (zh) * | 2016-12-21 | 2017-06-13 | 华中科技大学 | 一种基于nvram的内存分配链表及内存分配方法 |
CN107273061A (zh) * | 2017-07-12 | 2017-10-20 | 郑州云海信息技术有限公司 | 一种固态硬盘创建多namespace的方法及系统 |
-
2003
- 2003-06-11 CN CNA031318916A patent/CN1567250A/zh active Pending
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100382048C (zh) * | 2005-11-08 | 2008-04-16 | 中兴通讯股份有限公司 | 一种内存管理方法 |
CN101799786A (zh) * | 2009-02-11 | 2010-08-11 | 三星电子株式会社 | 管理动态存储器的嵌入式系统和动态存储器管理方法 |
CN101866298A (zh) * | 2009-04-14 | 2010-10-20 | 上海科泰世纪科技有限公司 | 线程托管对象的方法 |
CN103544203A (zh) * | 2013-07-11 | 2014-01-29 | 盛科网络(苏州)有限公司 | 基于链表的索引分配方法和装置 |
CN104778264A (zh) * | 2015-04-22 | 2015-07-15 | 北京科电高技术公司 | 一种键值数据库的内存分配方法 |
CN106844224A (zh) * | 2016-12-21 | 2017-06-13 | 华中科技大学 | 一种基于nvram的内存分配链表及内存分配方法 |
CN106844224B (zh) * | 2016-12-21 | 2019-06-07 | 华中科技大学 | 一种基于nvram的内存分配链表及内存分配方法 |
CN107273061A (zh) * | 2017-07-12 | 2017-10-20 | 郑州云海信息技术有限公司 | 一种固态硬盘创建多namespace的方法及系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1276361C (zh) | 一种嵌入式系统内存管理的方法 | |
CN1292370C (zh) | 从源系统复制信息到目标系统的方法 | |
US6453403B1 (en) | System and method for memory management using contiguous fixed-size blocks | |
US8745316B2 (en) | System and method of managing indexation of flash memory | |
CN104636285B (zh) | 一种闪存存储系统及其读写、删除方法 | |
US6594749B1 (en) | System and method for memory management using fixed-size blocks | |
CN1271524C (zh) | 一种静态内存管理方法 | |
CN110347685B (zh) | 基于字典树的索引结构、数据查询优化方法、主存管理器 | |
CN101079034A (zh) | 消除文件存储系统中冗余文件的系统及方法 | |
CN1722106A (zh) | 一种嵌入式实时操作系统中内存分配的方法 | |
CN1815629A (zh) | 一种闪存装置的脏块回收方法 | |
CN1848118A (zh) | 管理文件系统的设备和方法 | |
CN1687904A (zh) | 智能卡存储环境的控制方法 | |
CN1567250A (zh) | 一种高速零碎片的小对象内存结构及分配方法 | |
CN1845093A (zh) | 一种属性可扩展的对象文件系统 | |
CN1851671A (zh) | 一种节省全局变量内存空间的方法 | |
CN1614591A (zh) | 一种组织和访问分布式文件系统目录的方法 | |
CN100342374C (zh) | 一种数据存储方法及装置 | |
WO2007097581A1 (en) | Method and system for efficiently managing a dynamic memory in embedded system | |
CN1866218A (zh) | 软件系统的资源管理方法 | |
CN1881895A (zh) | 一种网络管理系统中的设备操作方法 | |
CN1627272A (zh) | 移动终端的闪存中的文件管理方法 | |
CN1612114A (zh) | 在分配存储器时通过偏移地址避免高速缓存拥塞的方法 | |
CN1489334A (zh) | 一种静态动态结合的存储区管理的方法 | |
CN1866203A (zh) | 一种字符串引用方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C12 | Rejection of a patent application after its publication | ||
RJ01 | Rejection of invention patent application after publication |