一种键值数据库的内存分配方法

文档序号:8457363阅读:356来源:国知局
一种键值数据库的内存分配方法
【技术领域】
[0001]本发明涉及数据库设计领域,更具体地涉及一种键值数据库的内存分配方法。
【背景技术】
[0002]内存分配器(Memory Allocator)介于内核与用户程序之间,负责处理用户的分配请求,其根据一定的规则向操作系统申请内存,然后将适合的内存空间返回给请求进程。
[0003]内存分配器的职责概括为:向操作系统申请大块内存,并通过一定的策略管理这些内存,将这些内存分为两部分:已分配内存和空闲内存,对每种内存进行特定管理。当用户进程提出内存分配需求时,内存分配器首先在空闲空间中寻找是否存在合适的内存,如果找不到合适的内存,则分配一块新的内存。更具体地,当某一线程需要调用mallocO分配内存空间时,该线程先查看线程私有变量中是否已经存在一个分配区,如果存在,尝试对该分配区加锁,如果加锁成功,使用该分配区分配内存;如果失败,该线程搜索循环链表试图获得一个没有加锁的分配区。如果所有的分配区都已经加锁,那么mallocO会开辟一个新的分配区,把该分配区加入到全局分配区循环链表并加锁,然后使用该分配区进行分配内存操作。在释放操作中,线程同样试图获得待释放内存块所在分配区的锁,如果该分配区正在被别的线程使用,则需要等待直到其他线程释放该分配区的互斥锁之后才可以进行释放操作。
[0004]对于高并发的需求,数据库申请内存的需求非常频繁,而若使用传统的malloc-free函数来分配和释放内存,则会带来大量的锁操作,而且会受到数据库运行环境上其他进程的影响。通过测试发现,使用传统的malloc-free函数进行内存申请和释放,消耗的时间为数据写入MemTable总时间的15_40%。这一情形尤其是应用于处理物联网数据时更甚,物联网数据大多来自无线传感器,其主要特点是数据条数多,但每条数据较短,并且具有时序性。由此,如何优化内存分配是迫切需要解决的一个技术问题。

【发明内容】

[0005]有鉴于此,本发明的主要目的在于提供一种键值数据库的快速内存分配方法,以适应高并发数据频繁内存分配的需求,实现快速有效的内存分配。
[0006]为了实现上述目的,作为本发明的一个方面,本发明提供一种键值数据库的内存分配方法,包括以下步骤:
[0007]接收用户内存分配请求;
[0008]判断所需分配的块的大小是否不大于快速分配容器中块大小的最大值MAX_FAST ;如果不大于,则在快速分配容器中找一个所需大小的块分配给用户,如果找到则整个分配流程结束,如果找不到则继续下一步;如果大于,也继续下一步;
[0009]判断未分类容器中是否存在满足要求的块,如果满足,则给用户分配内存,整个分配流程结束;否则继续下一步;
[0010]判断所需分配的块是否存在于小容器中,如果存在于小容器中,则给用户分配内存,整个分配流程结束;否则继续下一步;
[0011]判断所需分配的块是否存在于大容器中,如果存在于大容器中,则给用户分配内存,整个分配流程结束;否则继续下一步;
[0012]直接从中央资源池中分配相适应的存储空间,整个分配流程结束。
[0013]其中,所述直接从中央资源池中分配相适应的存储空间的步骤按照“最小优先、最佳适应”的原则。
[0014]其中,所述直接从中央资源池中分配相适应的存储空间的步骤还包括从中央资源池中切割所需分配的块,并将切割剩余的部分存储到相适应的进程缓冲区的相应容器中。
[0015]其中,在所述判断未分类容器中是否存在满足要求的块的步骤之前还包括整理所述快速分配容器,将用户释放的大于MAX_FAST的块,或快速分配容器中的空闲块合并后,放到未分类容器队列中的步骤。
[0016]其中,所述大容器中存放的为块大小大于512字节的块,所述小容器中存放的为块大小小于等于512字节的块。
[0017]作为本发明的另一个方面,本发明还提供了一种键值数据库的内存释放方法,包括以下步骤:
[0018]判断需要释放的内存是否直接由局部缓存区内存分配函数_ap O得来,如果是,则调用对应的释放函数munmap O,释放相应空间;
[0019]将块放入到快速分配容器中,块放入到快速分配容器中时,并不修改块使用状态位P,也不与相邻的块进行合并,仅仅是简单的放入。
[0020]其中,还包括内存分配器定期回收和合并快速分配容器中的块的步骤。
[0021]其中,当用户释放的块大于快速分配容器中块大小的最大值MAX_FAST,或者快速分配容器中的空闲块合并后,将所述块放到未分类容器队列中。
[0022]基于上述技术方案可知,本发明的内存分配方法采用进程局部缓存技术来解决加锁问题,用户请求的分配空间用块来表示,小内存空间的分配可以直接由进程局部缓存来返回,从而可以减少大量的内存锁操作,提高内存分配进度和有效性,更加适合于高并发数据的处理;本发明的内存释放时,优先放到快速分配容器中,可在出现新的请求时直接应用,减少了合并空闲资源再重新分配的冗余操作;定期进行容器整理,合并快速分配容器中的块,并将合并后的块归入适当的容器中,可以保证内存分配方法有序执行。
【附图说明】
[0023]图1是本发明的内存分配器存储管理结构的框架示意图;
[0024]图2是本发明的内存中块结构的示意图;
[0025]图3是本发明的内存分配管理器响应用户内存分配要求的具体步骤的流程图。
【具体实施方式】
[0026]为使本发明的目的、技术方案和优点更加清楚明白,以下结合具体实施例,并参照附图,对本发明作进一步的详细说明。
[0027]本发明采用进程局部缓存技术来解决内存中加锁的问题,其主要思想是:小内存空间的分配可以直接由进程局部缓存来返回;当进程局部缓存中不存在进程请求的空间时,将相应的内存对象从中央资源池移动到进程局部缓存中,同时定期的垃圾回收机制负责把内存从局部缓存迀移回中央资源池。下面对此进行详细的阐述。
[0028]用户请求分配的空间在内存分配器中都使用一个块(chunk)来表示。用户调用free O函数释放掉的内存也并不是立即就归还给操作系统,而是将它们也用块来表示,内存分配器使用特定的数据结构来管理这些空闲的块,并给用户分配空间的前后加上一些控制信息,用这样的方法来记录分配的信息,以便完成分配和释放工作。
[0029]块的结构如图2所示,为了使得块所占用的空间最小,内存分配器使用了空间复用,一个块或者正在被使用,或者已经被释放(free),所以块中的一些域可以在使用状态和空闲状态表示不同的意义,来达到空间复用的效果。
[0030]进程局部缓存将相似大小的块用双向链表链接起来,这样的一个链表被称为一个容器(bin)。容器类型按容量大小分为3种:快速分配容器(fast bin)、未分类容器(unsorted bin)和普通容器(bin),其中普通容器又可以分为小容器(small bin)和大容器(large bin)。
[0031 ] 块的操作包括释放和分配两种操作。在分配过程中不大于MAX_FAST (默认值为64字节,如果为方便物联网传感器数据存储,则可以将其设置为200字节)的块被释放后,首先会被放入到快速分配容器中。当需要给用户分配的块小于或等于MAX_FAST时,内存分配器首先会在快速分配容器中查找相应的空闲块。在某个特定的时候,内存分配器会遍历快速分配容器中的块,将相邻的空闲块进行合并,并将合并后的块加入到未分类容器中。
[0032]如果被用户释放的块大于MAX_FAST,或者快速分配容器中的空闲块合并后,这些块会被放到未分类容器队列中。在进行内存分配操作的时候,如果在快速分配容器中没有找到合适的块,则内存分配器会先在未分类容器中查找合适的空闲块,然后才查找普通容器。
[0033]如果未分类容器不能满足分配要求,内存分配器便会将未分类容器中的块加入到普通容器中。然后再从普通容器中继续进行查找和分配过程。从这个过程可以看出来
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1