掌桥专利:专业的专利平台
掌桥专利
首页

一种基于持久性内存的跳表结构及其访问方法

文献发布时间:2023-06-19 19:32:07


一种基于持久性内存的跳表结构及其访问方法

技术领域

本发明涉及持久性内存技术领域,特别是一种基于持久性内存的跳表结构及其访问方法。

背景技术

持久性内存:持久性内存(Persistent Memory)是一种新型的内存级存储硬件,支持字节粒度寻址,能够持久化存储数据,同时还有读写延迟低,带宽高,容量大等特点。持久性内存设备不仅具有与动态随机存取存储器(Dynamic Random Access Memory,DRAM)相近的读写性能,读写延迟在1微秒以内,还具备像磁盘等传统存储设备一样的持久化数据的能力,在断电的时候不会丢失数据。持久性内存的出现使研究人员着手设计基于持久性内存的存储结构,如数据库系统中的索引,旨在保证数据持久性的同时提升数据库系统的性能。

跳表是一种可以进行二分查找的有序链表,其在原有的有序链表上增加了多级索引,通过二分搜索的方法在索引上进行快速查找。跳表由于其良好的插入和删除性能,被广泛用作数据库的内存索引。现代计算机系统使用了CPU缓存用于加速对数据和指令的读写访问,CPU缓存对程序性能的影响非常大。而跳表由于其使用链表存储数据,链表节点之间的数据地址是跳跃式的,现有的跳表设计无法充分利用现代CPU缓存。

持久性内存设备内部是以4个缓存行(256Byte)为粒度来读取和存放的。一个小的写合并缓冲区被用来避免写放大,因为持久性内存和CPU之间的传输大小和DRAM一样,是64字节。因此,针对256字节进行优化是有必要的,只有当使用块大小的倍数时,才能达到峰值吞吐量。

发明内容

本发明的目的在于针对现有技术的不足,提供一种基于持久性内存的跳表结构及其访问方法,该跳表结构使用持久性内存和易失性内存的混合主存数据结构,以解决持久性跳表数据结构的CPU缓存利用率低的问题。

本发明的目的是通过以下技术方案来实现的:一种基于持久性内存的跳表结构,将跳表的最底层链表数据存储到持久性内存上,而其余的上层链表存储到易失性内存上,构成一种基于持久性内存的跳表结构。

进一步地,所述跳表的最底层链表的节点存储在一个能容纳多个节点空间的块上。

进一步地,所述跳表的最底层链表在持久性内存上的布局分为5个部分,分别为:元数据区、bitmap区、日志区、空闲队列区和数据区。

进一步地,所述元数据区用于记录单个数据的大小,bitmap区、日志区、空闲队列区和数据区的起始地址,元数据区、bitmap区、日志区、空闲队列区和数据区的大小,块大小的元数据。

进一步地,所述bitmap区用于标记数据区的各个块的各个数据是否被使用。

进一步地,所述日志区中存储操作的日志,用于在故障恢复时保证数据的一致性。

进一步地,所述空闲队列区用于管理删除数据后被标记空闲的数据块。

进一步地,所述数据区包含多个数据块,每个数据块包含多个数据;所述数据区包含已使用的文件和未使用的文件;所述已使用的文件和未使用的文件的边界用一个指针unused_ptr来标识。

一种基于上述任一项所述的一种基于持久性内存的跳表结构的访问方法,包括插入数据、删除数据和空闲空间管理步骤;

所述插入数据的步骤为:先通过易失性内存上的链表查找到最底层链表中第一个小于插入数据的节点,根据所述第一个小于插入数据的节点对应的bitmap位判断其所属块是否有空闲空间;若有,则选择所述的所属块准备插入数据,否则需要分配一个新的块;所述新的块优先从空闲队列区中获取,若空闲队列区存在空闲块,则取出,并更新空闲队列区的下一个读位置,若空闲队列区不存在空闲块,则从空闲队列区中分配一个新的块;分配好块后,将数据插入到所述分配好的块中,并且设置bitmap对应位为1;之后更新数据的指针,完成插入数据操作;

所述删除数据的步骤为:在跳表中查找待删除数据的地址,如果没找到,则结束操作,如果找到,则在数据所属块上将其删除,并且将bitmap上对应位设置为0;判断所述数据所属块是否所有数据都被清空,若是,则将所述数据所属块块添加到空闲队列区,否则结束操作;

所述空闲空间管理包括空闲块队列和数据区的未使用部分;

获取一个空闲块的步骤为:首先判断空闲队列区是否为空,若不为空,则从空闲队列区中取出一个空闲块并返回,若为空,则从数据区的未使用部分获取一个空闲块,然后更新unused_ptr指针,指向最新的未使用部分的起始位置。

本发明的有益效果是:本发明的结构设计使得持久性跳表在进行插入和搜索的时候充分利用了CPU缓存,能够有效降低持久性跳表插入和搜索操作的延迟,并将提高对持久性内存设备访问的带宽。

附图说明

为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1是本发明的跳表的数据结构的示意图;

图2本发明的跳表的最底层链表在持久性内存上的布局的示意图;

图3是本发明的数据块的结构示意图;

图4是本发明在跳表上插入数据操作方法的流程图;

图5是本发明在跳表上删除数据操作方法的流程图;

图6是本发明的空闲空间管理的示意图;

具体实施方式

这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本发明相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本发明的一些方面相一致的结构和方法的例子。

在本发明使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本发明。在本发明和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。

下面结合附图,对本发明进行详细说明。在不冲突的情况下,下述的实施例及实施方式中的特征可以相互组合。

如图1所示,一种基于持久性内存的跳表结构,将跳表的最底层链表数据存储到持久性内存上,而其余的上层链表存储到易失性内存上,构成一种基于持久性内存的跳表结构。

所述跳表的最底层链表的节点存储在一个能容纳多个节点空间的块上;

在一实施例中,跳表的最底层链表的节点存储在一个256字节的块上;可以理解的是,也可以存储在一个128字节、512字节或其他的块上。

具体地,该跳表共有9个key/value对,他们按照key的大小顺序存储,key为1的节点指向key为2的节点,key为2的节点指向key为3的节点,以此类推,得到一个有序的链表。在持久性内存设备上存储了最底层链表,从而在设备断电时能够保存数据,而易失性内存DRAM上则是基于持久性内存的顺序链表生成的索引,用于快速对底层的有序链表的节点进行索引。

如图2所示,一种基于持久性内存的跳表的最底层链表在持久性内存上的布局分为5个部分,分别是:元数据区,bitmap区,日志区,空闲队列区,数据区。

元数据记录单个数据的大小,其它各区的起始地址,各个区的大小,块大小等必要的元数据。具体地,在本发明实施例中,元数据区起始位置为0,大小为4KB,包含以下元数据:key大小为8字节,value大小为16字节,next指针为8字节;bitmap区大小为1GB;日志区大小为16GB;空闲队列区大小为16GB;数据区大小为256GB。每个区的起始位置可根据前一个区的起始位置和大小计算得到。

bitmap区用于标记数据区的各个块的各个数据是否被使用。

bitmap中1个bit表示一个数据,从左到右的位分别对应数据区从左到右的数据。如果对应bitmap位为0,表示该地址为空闲,如果对应bitmap位为1,表示该地址已经被使用。当bitmap所有位都为1时,表示该块不存在空闲空间;当bitmap所有位都为0时,表示该块是一个空闲块。具体地,假设有一个256Byte的块,该块中可存储8个32Byte的节点,那么它所对应的bitmap为8位,占用1Byte的空间。假设该bitmap的二进制表示为00110001,表示该块的第3,4,8个位置已经被使用,而其它位置则是空闲的。

日志区中存储操作的日志,用于在故障恢复时保证数据的一致性。

空闲队列区用于管理删除数据后被标记空闲的数据块。

数据区包含多个数据块,每个数据块包含多个数据。

如图3所示,每个数据块包含多个数据,数据由[key,value,next指针]这样的结构组成。数据块的组织形式为:[key1,value1,next指针1;key2,value2,next指针2;key3,value3,next指针3......]。在本实施例中数据块的大小为256字节,key的大小为8字节,value的大小为16字节,next指针的大小为8字节。因此单个数据的大小为32字节,一个数据块中包含8个数据。

如图4所示,本发明的跳表上插入数据的步骤为:

先通过易失性内存上的链表查找到最底层链表中第一个小于插入数据的节点,根据该数据节点对应的bitmap位判断其所属块是否有空闲空间,如果有空闲空间那么选择该块准备插入数据。具体地,如果节点所属块对应的bitmap的二进制为00111100,说明有4个空闲空间,分别是第1,2,7,8个位置。

如果没有空闲空间,那么分配一个新的块。需要分配的块优先从空闲队列区中获取,如果空闲队列区存在空闲块,那么取出,并更新空闲队列区的下一个读位置。如果空闲队列区为空,那么从未使用的文件中分配一个新的块,未使用的文件属于数据区,数据区内,已使用的文件和未使用的文件的边界用一个指针unused_ptr来标识。

选择好块后,将该数据插入到该块中,并且设置bitmap对应位为1。之后更新数据的指针,完成插入操作。

如图5所示,本发明的跳表上删除数据的步骤为:

在跳表中查找待删除数据的地址,如果没找到,结束操作。如果找到了,在数据所属块上将其删除,并且将bitmap上对应位设置为0。判断其所属块是否所有数据都被清空,如果是,那么将该块添加到空闲队列区,否则结束操作。

如图6所示,本发明实施例的空闲空间管理分为两个部分,一部分是空闲块队列,另一部分是数据区的未使用部分,一个unused_ptr指针指向数据区已使用部分和未使用部分。

获取一个空闲块的步骤为:

判断空闲队列区是否为空。如果空闲队列区不为空,那么从空闲队列区中取出一个空闲块并返回。如果空闲队列区为空,那么从数据区的未使用部分获取一个块的空间,然后更新unused_ptr指针,指向最新的未使用部分的起始位置。

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。

以上实施例仅用于说明本发明的设计思想和特点,其目的在于使本领域内的技术人员能够了解本发明的内容并据以实施,本发明的保护范围不限于上述实施例。所以,凡依据本发明所揭示的原理、设计思路所作的等同变化或修饰,均在本发明的保护范围之内。

本领域技术人员在考虑说明书及实践这里公开的内容后,将容易想到本申请的其它实施方案。本申请旨在涵盖本申请的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本申请的一般性原理并包括本申请未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的。

应当理解的是,本申请并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。

技术分类

06120115940457