CN104778264A - 一种键值数据库的内存分配方法 - Google Patents
一种键值数据库的内存分配方法 Download PDFInfo
- Publication number
- CN104778264A CN104778264A CN201510194970.4A CN201510194970A CN104778264A CN 104778264 A CN104778264 A CN 104778264A CN 201510194970 A CN201510194970 A CN 201510194970A CN 104778264 A CN104778264 A CN 104778264A
- Authority
- CN
- China
- Prior art keywords
- container
- block
- memory
- allocation
- fast
- 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
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种键值数据库的内存分配方法,包括:接收用户内存分配请求;判断所需分配的块是否在快速分配容器中;判断未分类容器中是否满足要求;判断小容器中是否满足要求;判断大容器中是否满足要求;直接从中央资源池中分配相适应的存储空间。以及一种键值数据库的内存释放方法。本发明的方法采用进程局部缓存技术来解决加锁问题,小内存空间分配直接由进程局部缓存来返回,从而减少大量的内存锁操作,提高内存分配进度和有效性;内存释放时优先放到快速分配容器中,可在出现新请求时直接应用,减少了合并空闲资源再重新分配的冗余操作;定期进行容器整理,保证内存分配方法有序执行。
Description
技术领域
本发明涉及数据库设计领域,更具体地涉及一种键值数据库的内存分配方法。
背景技术
内存分配器(Memory Allocator)介于内核与用户程序之间,负责处理用户的分配请求,其根据一定的规则向操作系统申请内存,然后将适合的内存空间返回给请求进程。
内存分配器的职责概括为:向操作系统申请大块内存,并通过一定的策略管理这些内存,将这些内存分为两部分:已分配内存和空闲内存,对每种内存进行特定管理。当用户进程提出内存分配需求时,内存分配器首先在空闲空间中寻找是否存在合适的内存,如果找不到合适的内存,则分配一块新的内存。更具体地,当某一线程需要调用malloc()分配内存空间时,该线程先查看线程私有变量中是否已经存在一个分配区,如果存在,尝试对该分配区加锁,如果加锁成功,使用该分配区分配内存;如果失败,该线程搜索循环链表试图获得一个没有加锁的分配区。如果所有的分配区都已经加锁,那么malloc()会开辟一个新的分配区,把该分配区加入到全局分配区循环链表并加锁,然后使用该分配区进行分配内存操作。在释放操作中,线程同样试图获得待释放内存块所在分配区的锁,如果该分配区正在被别的线程使用,则需要等待直到其他线程释放该分配区的互斥锁之后才可以进行释放操作。
对于高并发的需求,数据库申请内存的需求非常频繁,而若使用传统的malloc-free函数来分配和释放内存,则会带来大量的锁操作,而且会受到数据库运行环境上其他进程的影响。通过测试发现,使用传统的malloc-free函数进行内存申请和释放,消耗的时间为数据写入MemTable总时间的15-40%。这一情形尤其是应用于处理物联网数据时更甚,物联网数据大多来自无线传感器,其主要特点是数据条数多,但每条数据较短,并且具有时序性。由此,如何优化内存分配是迫切需要解决的一个技术问题。
发明内容
有鉴于此,本发明的主要目的在于提供一种键值数据库的快速内存分配方法,以适应高并发数据频繁内存分配的需求,实现快速有效的内存分配。
为了实现上述目的,作为本发明的一个方面,本发明提供一种键值数据库的内存分配方法,包括以下步骤:
接收用户内存分配请求;
判断所需分配的块的大小是否不大于快速分配容器中块大小的最大值MAX_FAST;如果不大于,则在快速分配容器中找一个所需大小的块分配给用户,如果找到则整个分配流程结束,如果找不到则继续下一步;如果大于,也继续下一步;
判断未分类容器中是否存在满足要求的块,如果满足,则给用户分配内存,整个分配流程结束;否则继续下一步;
判断所需分配的块是否存在于小容器中,如果存在于小容器中,则给用户分配内存,整个分配流程结束;否则继续下一步;
判断所需分配的块是否存在于大容器中,如果存在于大容器中,则给用户分配内存,整个分配流程结束;否则继续下一步;
直接从中央资源池中分配相适应的存储空间,整个分配流程结束。
其中,所述直接从中央资源池中分配相适应的存储空间的步骤按照“最小优先、最佳适应”的原则。
其中,所述直接从中央资源池中分配相适应的存储空间的步骤还包括从中央资源池中切割所需分配的块,并将切割剩余的部分存储到相适应的进程缓冲区的相应容器中。
其中,在所述判断未分类容器中是否存在满足要求的块的步骤之前还包括整理所述快速分配容器,将用户释放的大于MAX_FAST的块,或快速分配容器中的空闲块合并后,放到未分类容器队列中的步骤。
其中,所述大容器中存放的为块大小大于512字节的块,所述小容器中存放的为块大小小于等于512字节的块。
作为本发明的另一个方面,本发明还提供了一种键值数据库的内存释放方法,包括以下步骤:
判断需要释放的内存是否直接由局部缓存区内存分配函数mmap()得来,如果是,则调用对应的释放函数munmap(),释放相应空间;
将块放入到快速分配容器中,块放入到快速分配容器中时,并不修改块使用状态位P,也不与相邻的块进行合并,仅仅是简单的放入。
其中,还包括内存分配器定期回收和合并快速分配容器中的块的步骤。
其中,当用户释放的块大于快速分配容器中块大小的最大值MAX_FAST,或者快速分配容器中的空闲块合并后,将所述块放到未分类容器队列中。
基于上述技术方案可知,本发明的内存分配方法采用进程局部缓存技术来解决加锁问题,用户请求的分配空间用块来表示,小内存空间的分配可以直接由进程局部缓存来返回,从而可以减少大量的内存锁操作,提高内存分配进度和有效性,更加适合于高并发数据的处理;本发明的内存释放时,优先放到快速分配容器中,可在出现新的请求时直接应用,减少了合并空闲资源再重新分配的冗余操作;定期进行容器整理,合并快速分配容器中的块,并将合并后的块归入适当的容器中,可以保证内存分配方法有序执行。
附图说明
图1是本发明的内存分配器存储管理结构的框架示意图;
图2是本发明的内存中块结构的示意图;
图3是本发明的内存分配管理器响应用户内存分配要求的具体步骤的流程图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚明白,以下结合具体实施例,并参照附图,对本发明作进一步的详细说明。
本发明采用进程局部缓存技术来解决内存中加锁的问题,其主要思想是:小内存空间的分配可以直接由进程局部缓存来返回;当进程局部缓存中不存在进程请求的空间时,将相应的内存对象从中央资源池移动到进程局部缓存中,同时定期的垃圾回收机制负责把内存从局部缓存迁移回中央资源池。下面对此进行详细的阐述。
用户请求分配的空间在内存分配器中都使用一个块(chunk)来表示。用户调用free()函数释放掉的内存也并不是立即就归还给操作系统,而是将它们也用块来表示,内存分配器使用特定的数据结构来管理这些空闲的块,并给用户分配空间的前后加上一些控制信息,用这样的方法来记录分配的信息,以便完成分配和释放工作。
块的结构如图2所示,为了使得块所占用的空间最小,内存分配器使用了空间复用,一个块或者正在被使用,或者已经被释放(free),所以块中的一些域可以在使用状态和空闲状态表示不同的意义,来达到空间复用的效果。
进程局部缓存将相似大小的块用双向链表链接起来,这样的一个链表被称为一个容器(bin)。容器类型按容量大小分为3种:快速分配容器(fastbin)、未分类容器(unsorted bin)和普通容器(bin),其中普通容器又可以分为小容器(small bin)和大容器(1arge bin)。
块的操作包括释放和分配两种操作。在分配过程中不大于MAX_FAST(默认值为64字节,如果为方便物联网传感器数据存储,则可以将其设置为200字节)的块被释放后,首先会被放入到快速分配容器中。当需要给用户分配的块小于或等于MAX_FAST时,内存分配器首先会在快速分配容器中查找相应的空闲块。在某个特定的时候,内存分配器会遍历快速分配容器中的块,将相邻的空闲块进行合并,并将合并后的块加入到未分类容器中。
如果被用户释放的块大于MAX_FAST,或者快速分配容器中的空闲块合并后,这些块会被放到未分类容器队列中。在进行内存分配操作的时候,如果在快速分配容器中没有找到合适的块,则内存分配器会先在未分类容器中查找合适的空闲块,然后才查找普通容器。
如果未分类容器不能满足分配要求,内存分配器便会将未分类容器中的块加入到普通容器中。然后再从普通容器中继续进行查找和分配过程。从这个过程可以看出来,未分类容器可以看做是普通容器的一个缓冲区,增加它只是为了加快分配的速度。
对于大对象(4KBytes)的分配,由于在进程局部缓存中的普通容器等结构中不存在满足相应大小的块,所以会直接向中央资源池(page bin)申请空间。
作为本发明的一个优选实施例,如图3所示,内存分配管理器响应用户内存分配要求的具体步骤包括:
步骤S1,接收用户内存分配请求,根据进程希望申请的内存空间的大小,计算所需的块的大小。
步骤S2,判断所需分配的块的大小是否满足chunk_size不大于快速分配容器中块大小的最大值MAX_FAST。如果不大于,则转到步骤S3;如果大于,则转到步骤S4。
步骤S3,尝试在快速分配容器中找到一个所需大小的块分配给用户。如果找到,则返回,整个分配流程结束;如果找不到,则转到步骤S4。
步骤S4,整理快速分配容器,将用户释放的大于MAX_FAST的块,或者快速分配容器中的空闲块合并后,放到未分类容器队列中。
步骤S5,判断未分类容器中是否存在满足要求的块。如果满足,则转到步骤S6;否则,转到步骤S7。
步骤S6,给用户分配内存,将未分配的部分放到未分类容器队列中,返回,整个分配流程结束。
步骤S7,判断所需大小的块是否存在于小容器中(chunk_size<=512字节)。如果块存在于小容器中,则转到步骤S8;否则,转到步骤S9。
步骤S8,根据所需分配的块的大小,给用户分配内存,返回,整个分配流程结束。
步骤S9,判断所需大小的块是否存在于大容器中。如果块存在于大容器中,则转到步骤S10;否则,转到步骤S11。步骤S10,根据所需分配的块的大小,给用户分配内存,返回,整个分配流程结束。
步骤S11,说明需要分配的空间较大,需要向中央资源池中分配相适应的存储空间。这时,向中央资源池中按照“最小优先、最佳适应”的块,并对该块进行切割。
步骤S12,将切割剩余的部分存储到相适应的进程缓冲区的相应的容器中。
本发明还公开了一种内存回收方法,该方法通过free()函数来实现。free()函数接受一个指向分配区域的指针作为参数,释放该指针所指向的块。而具体的释放方法则看该块所处的位置和该块的大小。free()函数的工作步骤如下:
(1)判断传入指针是否为NULL,如果是NULL,什么也不做,直接返回。否则转到下一步。
(2)判断需要释放的内存是否直接由局部缓存区内存分配函数mmap()得来,如果是,则调用对应的munmap()系统调用,释放相应空间。如果不是,转向下一步。
(3)将块放入到快速分配容器中,块放入到快速分配容器中时,并不修改块使用状态位P,也不与相邻的块进行合并,仅仅是简单的放入,这一步完成后,free()操作结束。
(4)由内存分配器定期回收和合并进程局部缓存区的数据。如将容器中相邻的较小的块合并后放入适当的容器中。
作为本发明的另一个优选实施例,在本发明的内存分配方法中,根据用户请求分配的内存的大小,内存分配管理器有可能会在两个地方为用户分配内存空间。在第一次分配内存时,一般情况下只存在一个中央资源池,进程局部缓存从中央资源池申请4KBytes空间,将其按照一定策略切割后,放入容器中。第一次后的分配就比较复杂了,简单说来,内存分配管理器首先会查找快速分配容器,如果不能找到匹配的块,则查找小容器。若还是不行,合并快速分配容器,把块加入未分类容器,在未分类容器中查找,若还是不行,把未分类容器中的块全加入大容器中,并查找大容器。在快速分配容器和小容器中的查找都需要精确匹配,而在大容器中查找时,则遵循“最小优先,最佳适应”的原则,不需要精确匹配。若以上方法都失败了,则内存分配管理器会考虑从中央缓冲区的中央资源池中获取块,进行切割后,将剩余的部分放置于容器中。若中央资源池也不能满足分配要求,而且所需块大小大于局部缓存区内存分配函数mmap()分配阈值,则使用mmap()进行分配。
以上所述的具体实施例,对本发明的目的、技术方案和有益效果进行了进一步详细说明,应理解的是,以上所述仅为本发明的具体实施例而已,并不用于限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (8)
1.一种键值数据库的内存分配方法,包括以下步骤:
接收用户内存分配请求;
判断所需分配的块的大小是否不大于快速分配容器中块大小的最大值MAX_FAST;如果不大于,则在快速分配容器中找一个所需大小的块分配给用户,如果找到则整个分配流程结束,如果找不到则继续下一步;如果大于,也继续下一步;
判断未分类容器中是否存在满足要求的块,如果满足,则给用户分配内存,整个分配流程结束;否则继续下一步;
判断所需分配的块是否存在于小容器中,如果存在于小容器中,则给用户分配内存,整个分配流程结束;否则继续下一步;
判断所需分配的块是否存在于大容器中,如果存在于大容器中,则给用户分配内存,整个分配流程结束;否则继续下一步;
直接从中央资源池中分配相适应的存储空间,整个分配流程结束。
2.根据权利要求1所述的内存分配方法,其中所述直接从中央资源池中分配相适应的存储空间的步骤按照“最小优先、最佳适应”的原则。
3.根据权利要求2所述的内存分配方法,其中所述直接从中央资源池中分配相适应的存储空间的步骤还包括从中央资源池中切割所需分配的块,并将切割剩余的部分存储到相适应的进程缓冲区的相应容器中。
4.根据权利要求1所述的内存分配方法,其中在所述判断未分类容器中是否存在满足要求的块的步骤之前还包括整理所述快速分配容器,将用户释放的大于MAX_FAST的块,或快速分配容器中的空闲块合并后,放到未分类容器队列中的步骤。
5.根据权利要求1所述的内存分配方法,其中所述大容器中存放的为块大小大于512字节的块,所述小容器中存放的为块大小小于等于512字节的块。
6.一种键值数据库的内存释放方法,包括以下步骤:
判断需要释放的内存是否直接由局部缓存区内存分配函数mmap()得来,如果是,则调用对应的释放函数munmap(),释放相应空间;
将块放入到快速分配容器中,块放入到快速分配容器中时,并不修改块使用状态位P,也不与相邻的块进行合并,仅仅是简单的放入。
7.根据权利要求6所述的内存释放方法,其中还包括内存分配器定期回收和合并快速分配容器中的块的步骤。
8.根据权利要求6所述的内存释放方法,其中当用户释放的块大于快速分配容器中块大小的最大值MAX_FAST,或者快速分配容器中的空闲块合并后,将所述块放到未分类容器队列中。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510194970.4A CN104778264A (zh) | 2015-04-22 | 2015-04-22 | 一种键值数据库的内存分配方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510194970.4A CN104778264A (zh) | 2015-04-22 | 2015-04-22 | 一种键值数据库的内存分配方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN104778264A true CN104778264A (zh) | 2015-07-15 |
Family
ID=53619728
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510194970.4A Pending CN104778264A (zh) | 2015-04-22 | 2015-04-22 | 一种键值数据库的内存分配方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104778264A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106897110A (zh) * | 2017-02-23 | 2017-06-27 | 郑州云海信息技术有限公司 | 一种容器调度方法及管理节点调度器 |
WO2020000734A1 (zh) * | 2018-06-28 | 2020-01-02 | 平安科技(深圳)有限公司 | 存储对象的空间管理方法、装置、计算机装置及存储介质 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1567250A (zh) * | 2003-06-11 | 2005-01-19 | 中兴通讯股份有限公司 | 一种高速零碎片的小对象内存结构及分配方法 |
CN1851676A (zh) * | 2006-05-25 | 2006-10-25 | 浙江大学 | 一种嵌入式系统缓冲式内存分配方法 |
CN101122883A (zh) * | 2006-08-09 | 2008-02-13 | 中兴通讯股份有限公司 | 一种避免内存碎片化的内存分配方法 |
US20080172429A1 (en) * | 2004-11-01 | 2008-07-17 | Sybase, Inc. | Distributed Database System Providing Data and Space Management Methodology |
CN103914265A (zh) * | 2014-04-09 | 2014-07-09 | 江苏物联网研究发展中心 | 集群细粒度内存管理方法 |
-
2015
- 2015-04-22 CN CN201510194970.4A patent/CN104778264A/zh active Pending
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1567250A (zh) * | 2003-06-11 | 2005-01-19 | 中兴通讯股份有限公司 | 一种高速零碎片的小对象内存结构及分配方法 |
US20080172429A1 (en) * | 2004-11-01 | 2008-07-17 | Sybase, Inc. | Distributed Database System Providing Data and Space Management Methodology |
CN1851676A (zh) * | 2006-05-25 | 2006-10-25 | 浙江大学 | 一种嵌入式系统缓冲式内存分配方法 |
CN101122883A (zh) * | 2006-08-09 | 2008-02-13 | 中兴通讯股份有限公司 | 一种避免内存碎片化的内存分配方法 |
CN103914265A (zh) * | 2014-04-09 | 2014-07-09 | 江苏物联网研究发展中心 | 集群细粒度内存管理方法 |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106897110A (zh) * | 2017-02-23 | 2017-06-27 | 郑州云海信息技术有限公司 | 一种容器调度方法及管理节点调度器 |
WO2020000734A1 (zh) * | 2018-06-28 | 2020-01-02 | 平安科技(深圳)有限公司 | 存储对象的空间管理方法、装置、计算机装置及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108132842A (zh) | 一种嵌入式软件内存管理系统 | |
CN104375899B (zh) | 高性能计算机numa感知的线程和内存资源优化方法与系统 | |
CN101968772B (zh) | 嵌入式系统高效内存池的实现方法 | |
CN108038002B (zh) | 一种嵌入式软件内存管理方法 | |
CN103399825B (zh) | 一种无锁化内存申请释放方法 | |
CN102999522B (zh) | 一种数据存储方法和装置 | |
US6427195B1 (en) | Thread local cache memory allocator in a multitasking operating system | |
US6539464B1 (en) | Memory allocator for multithread environment | |
CN101222510B (zh) | 一种实现CANopen主站的方法 | |
US9424070B2 (en) | Combining scalability across multiple resources in a transaction processing system having global serializability | |
CN102567107B (zh) | 高并行的实时内存资源管理调度方法 | |
US20130346378A1 (en) | Memory compaction mechanism for main memory databases | |
US11042477B2 (en) | Memory management using segregated free lists | |
US20080243966A1 (en) | System and method for managing temporary storage space of a database management system | |
CN101493787A (zh) | 一种内存操作的管理方法及系统 | |
CN106681829A (zh) | 一种内存管理方法及系统 | |
CN107544756B (zh) | 基于SCM的Key-Value日志型本地存储方法 | |
CN101470665A (zh) | 一种无mmu平台的应用系统内存管理的方法及系统 | |
CN103455433B (zh) | 内存管理方法及系统 | |
US11698893B2 (en) | System and method for use of lock-less techniques with a multidimensional database | |
CN105917319A (zh) | 存储器单元和方法 | |
CN106406762A (zh) | 一种重复数据删除方法及装置 | |
CN107133182A (zh) | 一种内存管理方法及装置 | |
CN106406748A (zh) | 存储器中心数据库架构 | |
CN105718319A (zh) | 一种内存池版图解析方法和内存池装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
EXSB | Decision made by sipo to initiate substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
AD01 | Patent right deemed abandoned |
Effective date of abandoning: 20190507 |
|
AD01 | Patent right deemed abandoned |