用于对跳跃表数据结构执行范围查询的系统和方法转让专利

申请号 : CN201680088770.3

文献号 : CN109643309B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 伊斯雷尔·戈尔德希勒尔·阿维尼

申请人 : 华为技术有限公司

摘要 :

本发明提供一种系统,包括:用于并行执行线程的处理器;存储部署为有序节点集的跳跃表的共享存储器;以及通过所述多个处理器中的至少一个执行的至少一个事务执行线程,所述处理器用于:执行范围查询操作以识别在第一较低密钥值和第二较高密钥值之间的所述有序节点集中的至少一个节点,所述密钥范围操作通过执行阶段和提交阶段执行,其中在所述执行阶段期间,所述至少一个事务执行线程在无锁状态中遍历所述跳跃表的节点,其中在所述提交阶段期间,所述至少一个事务执行线程执行提交协议,所述提交协议保证所述跳跃表结构的事务一致性并验证所述范围查询操作的一致性。

权利要求 :

1.一种跳跃表管理系统,其特征在于,包括:

多个处理器,所述多个处理器用于并行执行线程;

共享存储器,所述共享存储器存储可通过所述多个处理器的执行线程存取的跳跃表,部署所述跳跃表用于表示多个节点的有序集合,每一节点包含存储在一节点列表组件中的单个密钥,所述节点列表组件用于部署所述有序集合中的相应节点,每一节点列表组件包含针对所述有序集合中的下一节点列表的前向指针和一个节点子集,所述节点子集包含在所述节点列表组件上方的相应的多个塔,所述多个塔都具有至少一个层的高度,其中前向指针在相应的层连接所述有序集合的节点,从而在每一层处形成相应的索引列表;以及至少一个事务执行线程,所述至少一个事务执行线程通过所述多个处理器中的至少一个执行,所述处理器用于:执行范围查询操作以识别在第一较低密钥值和第二较高密钥值之间的所述有序集合中的至少一个节点,所述范围查询操作在执行阶段和提交阶段期间通过所述事务执行线程执行,其中在所述执行阶段期间,所述至少一个事务执行线程在无锁状态中遍历所述跳跃表的节点,其中在所述提交阶段期间,所述至少一个事务执行线程执行提交协议,所述提交协议保证所述跳跃表结构的事务一致性并验证所述范围查询操作的一致性。

2.根据权利要求1所述的系统,其特征在于,多个所述执行线程中的每一个在所述执行阶段期间并行执行以下中的一个:将新节点插入到所述跳跃表中的节点插入操作、从所述跳跃表中去除现有节点的节点删除操作和所述范围查询操作。

3.根据权利要求1所述的系统,其特征在于,所述至少一个事务执行线程用于当所述至少一个节点的参考插入到通过所述至少一个事务执行线程访问的扫描集合存储节点时,将所述跳跃表的至少一个节点指定为所述范围查询操作的密钥范围[A,B]的范围保护节点,其中密钥范围[A,B]的所述范围保护表示节点含有密钥A或含有最大密钥K,其中K

4.根据权利要求3所述的系统,其特征在于,所述至少一个事务执行线程进一步用于,在通过回收删除节点的存储空间中的至少一个延迟跳跃表清理器线程以从所述跳跃表结构中删除和去除所述扫描集中的范围保护节点的情况下,提交中止操作。

5.根据权利要求1至4中任一项所述的系统,其特征在于,所述跳跃表中的每一相应节点用于存储:表示每当修改所述相应节点的所述前向指针时递增的版本值的版本参数;

用于帮助维持所述事务一致性的状态参数,所述状态参数表示从包括以下各项的组中选择所述相应节点的状态:不存在、存在和清理;

记录标识(record-id)参数,所述记录标识参数标识与所述相应节点相关联的数据库记录;以及表示执行节点插入和节点删除操作中的至少一个的并行事务线程的数目的写入计数参数。

6.根据权利要求5所述的系统,其特征在于,当所述相应节点不存在于所述跳跃表中时,所述相应节点的所述状态参数的初始值表示为空,其中所述状态参数的不存在值指示所述相应节点具有无效记录标识,其中所述状态参数的存在值指示所述相应节点具有有效记录标识,其中当所述相应节点包含所述状态参数的所述不存在值时,所述相应节点保持在所述跳跃表中,其中当所述相应节点包含所述状态参数的清理值时,所述相应节点从所述跳跃表移动到指定用于删除的清理列表。

7.根据权利要求1至4中任一项所述的系统,其特征在于,所述至少一个执行线程用于通过执行以下阶段来执行将新节点插入到所述跳跃表中的操作:所述执行阶段,所述执行阶段将所述新节点以原子方式插入到所述跳跃表的所述节点列表组件中;以及所述提交阶段,所述提交阶段通过确保只有一个事务执行线程将新节点提交到跳跃表而其他事务执行线程失败,在验证事务一致性时,将新节点的塔的更高层链接到所述跳跃表的各个级别。

8.根据权利要求1至4中任一项所述的系统,其特征在于,当多个所述执行线程尝试执行对所述跳跃表中的一个现有节点的节点删除操作时,多个事务线程中的仅一个提交所述密钥删除,而所述多个事务线程中的其它事务线程失败。

9.根据权利要求8所述的系统,其特征在于,所述节点删除操作将所述现有节点的状态参数设置成不存在,而无需以物理方式从所述跳跃表中删除所述节点,并且进一步包括以物理方式从所述跳跃表中延迟地删除所述节点的至少一个跳跃表清理器线程。

10.根据权利要求1至4中任一项所述的系统,其特征在于,所述提交阶段通过以下操作来执行:以全局次序锁定写入集中的每一节点;

解决节点插入和节点删除冲突,并根据相应节点的状态参数来检测不一致范围查询操作,使得仅允许提交多个并行执行的事务线程中的一个。

11.根据权利要求10所述的系统,其特征在于,所述提交阶段通过以下操作来进一步执行:通过验证所述扫描集中的节点的版本保持不变和所述范围保护节点尚未被清理来保护范围查询操作免受插入假想节点的操作的影响。

12.根据权利要求11所述的系统,其特征在于,所述提交阶段通过以下操作来进一步执行:通过改变所述新节点的所述状态参数和记录标识以及解锁所述写入集来提交节点插入操作;以及将所述写入集中的每一节点的所述塔的较高层连接到所述跳跃表的相应层。

13.根据权利要求1至4中任一项所述的系统,其特征在于,进一步包括延迟节点链路管理器线程,其从最高层到所述节点列表层依序遍历在所述跳跃表的塔的各层处的节点,并执行:延迟节点连接线程,用于遍历在相应层的所述跳跃表的节点,连接指定有状态参数值“存在”的节点的所述节点列表组件,并将所述相应节点的所述塔连接到相应层,以及延迟节点链路断开线程,用于遍历在所述相应层的所述跳跃表的节点,断开具有指定有所述状态参数值“不存在”的节点列表组件的节点的塔,并使用回收删除节点的存储空间的延迟节点清理器线程从所述跳跃表中删除所述节点列表组件。

14.一种用于管理跳跃表的方法,

其特征在于,部署所述跳跃表用于表示多个节点的有序集合,每一节点包含存储在节点列表组件中的单个密钥,所述节点列表组件用于部署所述有序集合中的相应节点,每一节点列表组件包含针对所述有序集合中的下一节点列表的前向指针和一个节点子集,所述节点子集包含在所述节点列表组件上方的相应的多个塔,所述多个塔都具有至少一个层的高度,其中前向指针在相应的层连接所述有序集合的节点,从而在每一层处形成相应的索引列表;

所述方法包括以下步骤:

执行范围查询操作以识别在第一较低密钥值和第二较高密钥值之间的所述有序集合中的至少一个节点,所述范围查询操作在执行阶段和提交阶段期间通过事务执行线程执行,其中在所述执行阶段期间,所述至少一个事务执行线程在无锁状态中遍历所述跳跃表的节点,其中在所述提交阶段期间,所述至少一个事务执行线程执行提交协议,所述提交协议保证所述跳跃表结构的事务一致性并验证所述范围查询操作的一致性。

15.一种计算机可读媒体,其存储有计算机程序,其特征在于,所述计算机程序在由计算机的处理器执行时运行权利要求14所述的任一种方法。

说明书 :

用于对跳跃表数据结构执行范围查询的系统和方法

背景技术

[0001] 本发明在其一些实施例中涉及用于管理跳跃表的系统和方法,并且更确切地但非排他地,涉及用于对跳跃表数据结构进行范围查询的系统和方法。
[0002] 跳跃表是一种提供预期O(Log(n))查找、插入和删除复杂度的有序数据结构。跳跃表提供这一效率水平,而不需要在使用其它有序数据结构(例如,B树、红黑树或AVL树)时所实施的复杂树平衡或页分裂。跳跃表是一种实施起来简单得多且更简洁的数据结构。
[0003] 跳跃表由附着到塔上的元素(在本文中有时被称作节点)组成。跳跃表中的每个塔在每一层处链接到处于相同高度的下一个塔,从而形成链表群,跳跃表的每一层具有一个链表群。塔通过开始于最高层并朝向底部,使用塔链来检查何时需要在表中向前移动或下移到塔的较低层来支持对分搜索。当有新节点插入到跳跃表中时,新节点的塔高度(在本文中有时被称作最高层)可随机确定(例如,高度为n的塔每2^n次出现一次)。新节点在跳跃表的每一层处进行链接。
[0004] 跳跃表可与存储在快速接入存储器(例如,主存储器)中的数据库关联使用。跳跃表可用作例如映射到数据库的简单、可扩展且计算效率高的索引结构。例如,跳跃表可用于快速搜索数据库。
[0005] 密钥范围查询是数据库系统中的常见读取操作,其利用在给定下限和上限之间的密钥值来检索所有记录。跳跃表节点(例如,不同于Masstree节点(B树变型))不具有密钥范围。每个跳跃表节点仅表示单个密钥。因此,对跳跃表进行一致范围查询是存在问题的,尤其是在多核环境中。

发明内容

[0006] 本发明的目标是提供一种用于管理有序列表的装置、系统、计算机程序产品和方法。
[0007] 前述目标和其它目标通过独立权利要求的特征实现。其它实施形式根据从属权利要求、说明书以及图式是显而易见的。
[0008] 根据第一方面,跳跃表管理系统包括:用于并行执行线程的处理器;共享存储器,其存储可通过处理器的执行线程接入的跳跃表,部署所述跳跃表用于表示多个节点的有序集合合,每一节点包含存储在节点列表组件中的单个密钥,所述节点列表组件用于部署有序集合中的相应节点,每一节点列表组件包含针对有序集合中的下一节点列表的前向指针和一个节点子集,所述节点子集包含在节点列表组件上方的相应的塔,所述塔具有至少一个层的高度,其中前向指针在相应层处连接有序集合的节点,从而在每一层处形成相应的索引列表;以及至少一个事务执行线程,其由所述多个处理器中的至少一个执行,所述处理器用于:执行范围查询操作以识别在第一较低密钥值和第二较高密钥值之间的有序节点集中的至少一个节点,所述密钥范围操作通过执行阶段和提交阶段执行,其中在执行阶段期间,所述至少一个事务执行线程在无锁状态中遍历跳跃表的节点,其中在提交阶段期间,所述至少一个事务执行线程执行提交协议,所述提交协议保证跳跃表结构的事务一致性并验证范围查询操作的一致性。
[0009] 本文中所描述的系统和/或方法(例如,通过由一个或多个处理器执行的代码指令实施)提供在不存在节点(例如,密钥范围)锁定的多核环境中可选地实施的基础乐观事务模型,以及基于跳跃表数据结构的一致事务执行。提供验证范围查询一致性作为假想问题的解决方案。当扫描特定的密钥范围时,在跟踪到在扫描期间存在的节点的情况下,范围内的成员可发生改变而不会被检测到,由此违反了事务一致性。本文中所描述的系统和/或方法(例如,通过由一个或多个处理器执行的代码指令实施)在技术上解决维持跳跃表数据结构的一致性且同时并行事务执行线程执行节点插入操作和/或节点删除操作的技术难题。通过检测假想密钥插入和/或删除来验证范围查询操作的一致性。与节点插入和密钥范围操作相关联的先前节点用于检测假想节点,如本文中所描述。
[0010] 本文中所描述的系统和/或方法(例如,通过由一个或多个处理器执行的代码指令实施)通过在事务执行阶段期间保持跟踪所扫描的节点集以及在提交阶段期间重新验证所扫描的集来提供密钥范围一致性,而无需节点锁定。在无锁状态中遍历通过防止或减少处理器竞争来实现与跳跃表相关联的内存数据库的可扩展性。应注意,相比之下,其它方法使用分配到树数据结构的每一节点的版本数值来重新验证所扫描的节点集(其中树节点的结构修改导致所有受影响的节点的版本数值改变)。本文中所描述的系统和/或方法未必以类似方式依赖于节点的版本数值,因为在跳跃表内实施所述版本的处理在计算上较为昂贵,在所述跳跃表中,每一节点表示单个密钥。
[0011] 在根据第一方面的系统的第一可能实施方案中,所述多个至少一个执行线程中的每一个在执行阶段期间并行执行以下中的一个:将新节点插入到跳跃表中的节点插入操作、从跳跃表中去除现有节点的节点删除操作和范围查询操作。
[0012] 在同样根据第一方面或根据第一方面的先前实施形式中的任一种的系统的第二可能实施形式中,至少一个事务执行线程用于当至少一个节点的参考插入到存储通过至少一个事务执行线程访问的节点的扫描集中时,将跳跃表的至少一个节点指定为范围查询操作的密钥范围[A,B]的范围保护节点,其中密钥范围[A,B]的范围保护表示节点含有密钥A或含有最大密钥K,使得K<A,其中扫描集表示在执行密钥范围操作时遍历的节点。
[0013] 在根据第一方面的先前第二实施形式的系统的第三可能实施形式中,系统进一步包括当通过回收删除节点的存储空间的至少一个延迟跳跃表清理器线程来删除和从跳跃表结构中去除扫描集中的范围保护节点时中止所述至少一个事务执行线程。
[0014] 在同样根据第一方面或根据第一方面的先前实施形式中的任一种的系统的第四可能实施形式中,跳跃表的每一相应节点存储:表示每当修改相应节点的前向指针时递增的版本值的版本参数;用于帮助维持事务一致性的状态参数,所述状态参数表示选自以下组成的组的相应节点的状态:不存在、存在和清理;表示与相应节点相关联的数据库记录的record-id参数;以及表示执行节点插入和节点删除操作中的至少一个的并行事务线程的数目的写入计数参数。
[0015] 具有absent值的节点的断开可分批一起处理,从而提高断开过程的计算效率。
[0016] 在根据第一方面的先前第四实施形式的系统的第五可能实施形式中,当相应节点不存在于跳跃表中时,相应节点的状态参数的初始值表示为空,其中状态参数的不存在值指示相应节点具有无效record-id,其中状态参数的存在值指示相应节点具有有效record-id,其中当相应节点包含状态参数的不存在值时,相应节点保持在跳跃表中,其中当相应节点包含状态参数的清理值时,相应节点从跳跃表移动到指定用于删除的清理列表。
[0017] 在同样根据第一方面或根据第一方面的先前实施形式中的任一种的系统的第六可能实施形式中,所述至少一个执行线程用于通过执行以下操作来进行新节点到跳跃表中的节点插入操作:将新节点在原子级上插入到跳跃表的节点列表组件中的执行阶段;以及当通过确保仅一个事务执行线程将新节点提交到跳跃表中且其它事务执行线程失败而证实事务一致性时将新节点的塔的较高层链接到跳跃表的相应层的提交阶段。
[0018] 验证成本与密钥范围中的节点数目成线性关系。
[0019] 在同样根据第一方面或根据第一方面的先前实施形式中的任一种的系统的第七可能实施形式中,当多个所述至少一个执行线程尝试进行现有节点从跳跃表中的节点删除操作时,所述多个至少一个事务线程中的仅一个提交密钥删除,而所述多个至少一个事务线程中的其它事务线程失败。
[0020] 在根据第一方面的先前第七实施形式的系统的第八可能实施形式中,节点删除操作将现有节点的状态参数设置成不存在,而无需以物理方式从跳跃表中删除所述节点,并且进一步包括以物理方式从跳跃表中延迟地删除所述节点的至少一个跳跃表清理器线程。
[0021] 在同样根据第一方面或根据第一方面的先前实施形式中的任一种的系统的第九可能实施形式中,通过以下操作来执行提交阶段:以全局次序锁定写入集中的每一节点;解决节点插入和节点删除冲突,并根据相应节点的状态参数来检测不一致范围查询操作,以使得仅允许提交多个并行执行的事务线程中的一个。
[0022] 在根据第一方面的先前第九实施形式的系统的第十可能实施形式中,通过以下操作来进一步执行提交阶段:通过验证扫描集中的节点的版本保持不变和范围保护节点尚未被清理来保护范围查询操作免受假想节点插入操作影响。
[0023] 在根据第一方面的先前第十实施形式的系统的第十一可能实施形式中,通过以下操作来进一步执行提交阶段:通过改变新节点的状态参数和record-id并解锁写入集来提交节点插入操作;以及将写入集中的每一节点的塔的较高层连接到跳跃表的相应层。
[0024] 在同样根据第一方面或根据第一方面的先前实施形式中的任一种的系统的第十二可能实施形式中,系统进一步包括:延迟节点链路管理器线程,其从最高层到节点列表层依序遍历在跳跃表的塔的各层处的节点,并执行:延迟节点连接线程,其遍历在相应层处的跳跃表的节点,连接指定有状态参数值“存在”的节点的节点列表组件,并将相应节点的塔连接到相应层;以及延迟节点链路断开线程,其遍历在相应层处的跳跃表的节点,断开具有指定有状态参数值“不存在”的节点列表组件的节点的塔,并使用回收删除节点的存储空间的延迟节点清理器线程从跳跃表中删除节点列表组件。
[0025] 分裂减小了节点插入和节点删除操作的时延。
[0026] 根据第二方面,提供一种用于管理跳跃表的方法。跳跃表部署为有序节点集,每一节点包含存储在节点列表组件中的单个密钥,所述节点列表组件用于部署有序集合中的相应节点,每一节点列表组件包含针对有序集合中的下一节点列表的前向指针和一个节点子集,所述节点子集包含在节点列表组件上方的相应的塔,所述塔具有至少一个层的高度,其中前向指针在相应层处连接有序集合的节点,从而在每一层处形成相应的索引列表。所述方法包括以下步骤:执行范围查询操作以识别在第一较低密钥值和第二较高密钥值之间的有序节点集中的至少一个节点,所述范围查询操作在执行阶段和提交阶段期间通过事务执行线程执行,其中在执行阶段期间,所述至少一个事务执行线程在无锁状态中遍历跳跃表的节点,其中在提交阶段期间,所述至少一个事务执行线程执行提交协议,所述提交协议保证跳跃表结构的事务一致性并验证范围查询操作的一致性。
[0027] 优选地,用于管理跳跃表的方法用于根据同样根据第一方面或根据第一方面的先前实施形式中的任一种的系统的先前实施形式中的任一种而在系统上操作。
[0028] 根据第三方面,存储在计算机可读媒体上的计算机程序在由计算机的处理器执行时运行根据第二方面的先前方法。
[0029] 除非另外定义,否则本文所使用的所有技术和/或科学术语都具有与本发明所涉及领域的技术人员通常所理解的相同的含义。尽管与本文中所描述的方法和材料类似或等效的材料和方法可以用于本发明的实施例的实践或测试,但下文描述了示例性方法和/或材料。倘若有冲突,包含定义的本说明书将占主导。此外,材料、方法和实例仅为说明性的,且不意欲为必定限制性的。

附图说明

[0030] 此处仅作为示例,结合附图描述了本发明的一些实施例。现在具体结合附图,需要强调的是所示的项目作为示例,为了说明性地讨论本发明的实施例。这样,根据附图说明,如何实践本发明实施例对本领域技术人员而言是显而易见的。
[0031] 在附图中:
[0032] 图1是根据本发明的一些实施例的包含事务执行线程的系统的组件的框图,所述事务执行线程对跳跃表进行范围查询、节点插入和/或节点删除操作;
[0033] 图2是根据本发明的一些实施例的通过事务执行线程对跳跃表实施一致范围查询操作的方法的流程图;
[0034] 图3是根据本发明的一些实施例的描绘节点的state参数的值之间的转变的示例性数据流图式;
[0035] 图4A是根据本发明的一些实施例的用于实施节点插入操作的示例性方法的流程图;
[0036] 图4B是根据本发明的一些实施例的用于实施节点插入操作的执行阶段的另一示例性方法的流程图;
[0037] 图5是根据本发明的一些实施例的用于实施节点删除操作的示例性方法的流程图;
[0038] 图6包含根据本发明的一些实施例的提交阶段的示例性实施方案的伪码;以及[0039] 图7是根据本发明的一些实施例的描绘用于执行范围查询、节点插入和/或节点删除操作的示例性实施方案的框图。

具体实施方式

[0040] 本发明在其一些实施例中涉及用于管理跳跃表的系统和方法,并且更确切地但非排他地,设计用于对跳跃表数据结构进行范围查询的系统和方法。
[0041] 本发明的一些实施例的方面涉及系统和/或方法(例如,通过由一个或多个处理器执行的代码指令实施),其包含至少一个事务执行线程(任选地通过用于并行执行线程的处理器执行),所述事务执行线程对存储在可通过并行处理器接入的共享存储器中的跳跃表执行范围查询操作。基于执行阶段和提交阶段来执行范围查询。在执行阶段期间,事务执行线程在无锁状态中遍历跳跃表的节点。在无锁状态中遍历通过防止或减少处理器竞争来实现与跳跃表相关联的内存数据库的可扩展性。在提交阶段期间,事务执行线程执行提交协议,所述提交协议提供跳跃表的事务一致性并验证范围查询操作的一致性。
[0042] 本文中所描述的系统和/或方法(例如,通过由一个或多个处理器执行的代码指令实施)提供在不存在节点(例如,密钥范围)锁定的多核环境中可选地实施的基础乐观事务模型,以及基于跳跃表数据结构的一致事务执行。提供验证范围查询一致性作为假想问题的解决方案。当扫描特定的密钥范围时,在跟踪到在扫描期间存在的节点的情况下,范围内的成员可发生改变而不会被检测到,由此违反了事务一致性。本文中所描述的系统和/或方法(例如,通过由一个或多个处理器执行的代码指令实施)在技术上解决维持跳跃表数据结构的一致性且同时并行事务执行线程执行节点插入操作和/或节点删除操作的技术难题。通过检测假想密钥插入和/或删除来验证范围查询操作的一致性。与节点插入和密钥范围操作相关联的先前节点用于检测假想节点,如本文中所描述。
[0043] 本文中所描述的系统和/或方法(例如,通过由一个或多个处理器执行的代码指令实施)通过在事务执行阶段期间保持跟踪所扫描的节点集以及在提交阶段期间重新验证所扫描的集来提供密钥范围一致性,而无需节点锁定。应注意,相比之下,其它方法使用分配到树数据结构的每一节点的版本数值来重新验证所扫描的节点集(其中树节点的结构修改导致所有受影响的节点的版本数值改变)。本文中所描述的系统和/或方法未必以类似方式依赖于节点的版本数值,因为在跳跃表内实施所述版本的处理在计算上较为昂贵,在所述跳跃表中,每一节点表示单个密钥。
[0044] 在详细解释本发明的至少一个实施例之前,应理解,本发明在其申请中不必限于在以下描述中阐述和/或在附图和/或实例中所说明的组件和/或方法的建构以及部署的细节。本发明能够具有其它实施例或以各种方式实践或进行。
[0045] 本发明可以是一种系统、方法和/或计算机程序产品。计算机程序产品可包含一个或多个计算机可读存储媒体,其上具有计算机可读程序指令以使处理器执行本发明的各方面。
[0046] 计算机可读存储媒体可以是能够保持和存储供指令执行设备使用的指令的有形设备。计算机可读存储媒体可以是例如但不限于:电子存储设备、磁性存储设备、光学存储设备、电磁存储设备、半导体存储设备或前述各项的任何合适组合。
[0047] 本文中所描述的计算机可读程序指令可以从计算机可读存储媒体下载到相应计算/处理设备,或通过因特网、局域网、广域网和/或无线网络等网络下载到外部计算机或外部存储设备。
[0048] 计算机可读程序指令可完全在用户的计算机上执行、部分地在用户的计算机上执行、作为独立软件包执行、部分地在用户的计算机上且部分地在远程计算机上执行,或完全在远程计算机或服务器上执行。在后一种情况下,远程计算机可以通过包含局域网(local area network,LAN)或广域网(wide area network,WAN)的任何类型的网络而连接到用户的计算机,或者可以对外部计算机进行连接(例如,使用因特网服务提供方通过因特网连接)。在一些实施例中,包含例如可编程逻辑电路、现场可编程门阵列(field-programmable gate array,FPGA)或可编程逻辑阵列(programmable logic array,PLA)的电子电路可以通过利用计算机可读程序指令的状态信息将电子电路个人化而执行计算机可读程序指令,以便执行本发明的各方面。
[0049] 本文参看根据本发明的实施例的方法、装置(系统)和计算机程序产品的流程图说明和/或框图来描述本发明的各方面。应理解,可以通过计算机可读程序指令来实施流程图说明和/或框图中的每个框,以及流程图说明和/或框图中的框的组合。
[0050] 图中的流程图和框图说明根据本发明的各种实施例的系统、方法和计算机程序产品的可能实施方案的架构、功能性和操作。这样,流程图或框图中的每个框可表示模块、区段或指令的部分,其包括用于实施指定逻辑功能的一个或多个可执行指令。在一些替代实施方案中,框中提及的功能可以不按图中所提及的次序发生。例如,根据所涉及的功能性,连续示出的两个框实际上可以大体上同时执行,或这些框有时可以相反次序执行。还应注意,框图和/或流程图说明中的每个框,以及框图和/或流程图说明中的框的组合可以通过专用的基于硬件的系统实施,所述系统执行指定功能或动作,或实行专用硬件和计算机指令的组合。
[0051] 如本文所使用,术语节点A(其中A是值,例如,整数、实数)有时是指与密钥A相关联的节点。
[0052] 现在参考图1,图1是根据本发明的一些实施例的包含事务执行线程102的系统100的组件的框图,所述事务执行线程102对跳跃表104进行范围查询、节点插入和/或节点删除操作。事务执行线程102在多核环境中对跳跃表104执行一致范围查询操作。还参考图2,图2是根据本发明的一些实施例的通过事务执行线程对跳跃表实施一致范围查询操作的方法的流程图。
[0053] 系统100包含设计用于并行执行线程的多个处理器110。处理器110可部署为例如一个或多个多核处理器和/或处理器集合和/或用于并行处理器的计算节点。处理器110可实施为同构处理器和/或异构处理器。处理器110可以是独立处理器110。每一处理器110被实施为例如中央处理单元(central processing unit,CPU)、图形处理单元(graphics processing unit,GPU)、现场可编程门阵列(field programmable gate array,FPGA)、数字信号处理器(digital signal processor,DSP)和专用集成电路(application specific integrated circuit,ASIC)。
[0054] 处理器110接入存储跳跃表104的共享存储器112,并且可存储事务执行线程102。共享存储器112可存储以下各项中的一个或多个:扫描集存储库106,其存储在范围查询操作处理期间事务执行线程所访问的节点(任选地通过每一密钥范围的先前密钥范围扩增);
写入集存储库108,其存储涉及节点插入和节点删除操作的节点集,且包含在每一节点上执行的节点state参数和operation-type参数(即,节点插入或节点删除);节点清理器114(例如,代码指令),其恢复供删除节点使用的内存;以及节点链路管理器116(例如,代码指令),其处理所插入和/或删除的节点,如本文中所描述。
[0055] 事务执行线程102可存储在共享存储器112和/或另一存储器设备中,和/或实施为通过处理器110执行的代码和/或通过另一处理器执行的代码,和/或实施在硬件中。事务执行线程102的指令可存储例如在共享存储器112中、在主存储器中、在存储设备上,和/或在其它设备中。
[0056] 共享存储器112可实施为计算单元120的主存储器,和/或另一快速接入存储器设备。共享存储器112可存储通过相应的处理器110执行的代码指令。共享存储器112可实施为例如随机接入存储器(random access memory,RAM)、只读存储器(read-only memory,ROM)和/或存储设备,例如,非易失性存储器、磁性媒体、半导体存储器设备、硬盘驱动器、移动存储装置和光学媒体(例如,DVD、CD-ROM)。
[0057] 事务执行线程102可实施在计算单元120内,例如,网络服务器、web服务器、计算云、本地服务器、远程服务器、客户端终端运行代码、移动设备、静止设备、服务器、智能手机、笔记本电脑、平板电脑、可穿戴计算设备、眼镜计算设备、手表计算设备、台式电脑,以及查询一体机。计算单元120可实施为单个计算设备、计算设备网络、互连节点的分布式系统,或其它架构。
[0058] 计算单元120可实施为硬件组件(例如,独立计算单元)、软件组件(例如,在现有计算单元内实施),和/或插入到现有计算单元中的硬件组件(例如,插卡、可附接单元)。服务器建构可向客户端终端122提供服务,例如通过提供软件即服务(software as a service,SAAS),提供可安装在与计算单元120的服务器建构通信的相应的客户端终端122上的应用程序,和/或使用远程接入会话来提供功能(例如,使用安装在客户端终端122上的网页浏览器来接入计算单元120)。
[0059] 计算单元120可包含用于与外部设备通信,例如与客户端终端122、外部存储单元和/或远程服务器通信的数据接口124。数据接口124可包含例如以下各项中的一个或多个:网络接口(例如,硬件和/或虚拟)、电缆接口和/或无线接口。客户端终端122可通过例如因特网、无线网络、蜂窝式网络、专用网络、虚拟专用网络和局域网的网络126接入计算单元
120。
[0060] 计算单元120可包含存储单元128,其充当用于存储数据的数据存储库,例如,存储器、硬盘驱动器、光学光盘、临时存储单元、内部存储单元和外部存储单元(任选地,移动存储单元)。
[0061] 计算单元120可与一个或多个用户接口130相关联。示例性用户接口130(其可与显示器集成,或实施为单独的设备)包含以下各项中的一个或多个:触摸屏、键盘、鼠标,以及使用扬声器和麦克风操作的语音激活软件。
[0062] 参考图2描述的一个或多个动作可例如通过事务执行线程102实施,由执行存储在存储器112中(和/或在另一存储器设备中)的代码指令的计算单元120的一个或多个处理器110(和/或其它处理器)执行。
[0063] 在202处,接入跳跃表104。跳跃表104可与数据库118相关联,例如,跳跃表104存储与数据库118相关联的索引。数据库118任选地是存储在共享存储器112中和/或另一快速接入存储器中的内存数据库,并且可由处理器110中的一个或多个并行接入。任选地,数据库118使用开放式并发控制机构,例如,SILO。应注意,如本文所使用,术语内存是指整个数据库都位于快速接入时间存储器内的数据库。
[0064] 跳跃表104可包含映射到数据库118中的一个或多个条目的标识符。例如,关键词和/或数值(例如,整数、实数)映射到包含所述关键词和/或根据所述数值分类的文档和/或数据库条目。数据库可通过客户端终端122接入计算单元120进行查询。数据库118可存储数据实例。每一数据实例可包含一个或多个数据条目。数据实例可包含基于文本的文档,例如,文档、电子邮件、文字处理文档、演示、电子数据表、应用程序确定的数据库条目、记录、医疗记录和便携式文档格式(portable document format,PDF)文件。数据实例可包含文件,例如,图像、音乐文件、其它音频文件、视频、应用程序定义的文件,以及其它数据。数据条目可以是例如词、段落、元数据、页以及相关文件。例如,用户可使用用户接口130(和/或客户端终端122)接入计算单元120,从而进入范围搜索查询以使用跳跃表104在整个数据库118中进行搜索,和/或使用跳跃表104对数据库118执行其它功能,例如添加额外行、添加额外列、移除行、移除列、添加新数据实例、移除现有数据实例,和/或对数据执行其它查询和/或操作。
[0065] 跳跃表104部署为有序节点集。每一节点包含存储在节点列表组件中的单个密钥,所述节点列表组件用于部署有序集合中的相应节点。每一节点列表组件包含针对有序集合中的下一节点列表的前向指针。节点子集包含在节点列表组件上方的相应的塔。塔具有可变高度(其可根据跳跃表的定义限定,例如,随机限定)。塔的每一层包含前向指针,其在塔的相应层处连接有序集合的节点,从而在每一层处形成相应的索引列表。
[0066] 跳跃表的每一节点可存储以下示例性基本参数中的一个或多个:
[0067] *Key-表示与节点相关联的密钥值。
[0068] *Top-level-表示跳跃表结构中的最高节点层的值(例如,8位整数)。
[0069] *Lock-表示促进对节点的同步接入的锁。
[0070] *Next-表示前向节点链路阵列。
[0071] 跳跃表的每一节点可存储以下示例性净荷参数中的一个或多个:
[0072] *Version-表示每当修改相应节点的前向指针时递增的值。版本参数的数值有助于检测由节点插入操作和/或节点删除操作而导致的跳跃表结构中的假想节点。版本值可在一开始设置成零,并在修改节点的next链路阵列时递增。
[0073] *State-当执行密钥范围、节点插入和/或节点删除操作时用于帮助维持事务一致性。状态参数表示选自不存在、存在和清理的相应节点的状态(如本文中所描述)。
[0074] *Record-id-表示与相应节点相关联的数据库记录。record-id的值是基于数据库的建构和/或跳跃表的节点和数据库的记录之间的映射。例如,record-id可实施为针对数据库中的一个或多个记录的指针。
[0075] *Write-count-表示执行节点插入和/或节点删除操作的并行事务执行线程的数目。非零计数指示节点与有效节点插入和/或节点删除操作相关联。
[0076] *Connect-level-表示节点连接的最高节点层的值(例如,8位整数)。当断开节点与跳跃表时可通过延迟节点清理器来更新connect-level参数(如本文中所描述)。
[0077] 任选地,限定一个或多个先前节点。先前节点与范围查询相关联以检测假想节点。先前节点可表示为predecessor(A),其中密钥A的先前节点是存储最大密钥K,其中K<A节点。跳跃表的结构保证如果存在节点A,那么节点A在层0处连接到节点K。
[0078] 在204处,计算单元接收指令以进行以下各项中的一个或多个:将新数据插入到数据库中、从数据库中删除现有数据,和/或范围查询以搜索存储在数据库中的数据。例如,可使用数据库并基于用户输入的数据而例如从客户端终端和/或用户接口接收指令。
[0079] 用于数据库的操作的较高层指令可转化(例如,通过数据库管理代码)成用于跳跃表的操作的较低层指令(或接收较低层的指令)。较低层的指令包含以下各项中的一个或多个:将新节点插入到跳跃表中的节点插入操作、从跳跃表中去除现有节点的节点删除操作,和识别在较低密钥值和较高密钥值之间的跳跃表的一个或多个节点的范围查询操作。
[0080] 较低层的指令通过事务执行线程实施,任选地通过多核处理器和/或并行处理器同时实施。
[0081] 在206处,跟踪和/或更新跳跃表中的每一节点的state参数的值。可通过可存储在存储器112或另一存储设备中的状态图跟踪跳跃表中的每一节点的state参数的值。跳跃表的节点的状态可作为本文中所描述的state参数而存储在节点本身内。
[0082] 可在框208到214的处理期间更新state参数的值,如本文中所描述。在框208到214期间可接入state参数的当前值,如本文中所描述。
[0083] 跳跃表可实施为映射图(k→v),其中现有密钥映射使用当k映射到v的无效值时分配到state参数的值absent表示,且当k映射到v的有效值时表示为present(分配到state参数)。
[0084] 现在参考图3,图3是根据本发明的一些实施例的描绘在节点的state参数的值之间的转变的示例性数据流图式。节点的state参数的值之间的有效转变由于以下操作而发生:节点插入、节点删除、提交、中止和清理。存储在节点的state参数中的值表示节点状态。
[0085] 针对相应节点,在节点插入操作的执行期间和在节点删除操作的执行期间,发生每一节点的state参数的值之间的转变,如本文中所描述。
[0086] 可例如使用两个位来建构每一节点的state参数。一个位表示state参数的absent值。当这个位设置好,状态参数的值表示absent。当这个位未设置时,状态参数的值表示present。另一个位表示state参数的clean值。当且仅当设置此位时,状态参数的值才表示clean。
[0087] 在302处,相应节点的state参数的初始值被分配值free。free值表示节点不存在于跳跃表中。节点可与空闲内存池(例如,存储在共享存储器112和/或另一存储设备中)相关联。
[0088] 跳跃表的表头节点(即第一节点,又称为前哨节点)的state参数的初始值被设置成present,其中version参数为零值。
[0089] 在304处,state参数的absent值指示节点具有无效record-id。
[0090] 当执行节点删除操作的提交阶段时,和/或当执行节点插入操作时,将absent值分配到节点的state参数。
[0091] 由于提交节点删除操作而具有absent值的节点保持在跳跃表中。节点保持在跳跃表中,以便不打破跳跃表结构。通过节点清理器(如本文中所描述)去除节点以回收节点的空间。
[0092] 在306处,state参数的当前值指示节点具有record-id的有效值。
[0093] 在308处,当节点包含state参数的清理值时,节点从跳跃表移动到指定用于删除的清理列表。
[0094] 当节点与有效节点插入操作不关联(即,具有write-count参数的零值)时,节点清理器将state参数为absent值的节点移动到清理列表(例如,存储在共享存储器和/或另一存储设备中)。移动到清理列表的节点在移动之前,其state参数被分配clean值。清理列表中的节点对新事务执行线程来说不再可见。当节点对有效事务执行线程不可见且不再与有效范围查询操作相关联时,清理过程回收清理列表中的节点的存储空间。本文中例如参考框214描述节点清理器的额外细节。
[0095] 现返回参考图2,在208处,实施执行阶段。执行线程可并行执行和/或以任意次序执行以下各项中的一个或多个:范围查询操作(如参考框208A所描述)、将新节点插入到跳跃表中的节点插入操作(如参考框208B所描述)和从跳跃表中去除现有节点的节点删除操作(如参考框208C所描述)。
[0096] 事务执行线程在无锁状态中遍历跳跃表的节点。应注意,可强制某些事务执行线程一直等到其它事务执行线程解除它们的锁。
[0097] 收集关于所遍历的节点的信息。
[0098] 在208A处,通过事务执行线程执行范围查询操作以识别跳跃表的节点。所识别的节点包含由范围查询操作限定的在较低密钥值和较高密钥值之间的密钥值。
[0099] 事务执行线程所访问的节点存储在扫描集存储库中。扫描集用于在提交阶段时验证范围查询扫描的一致性。
[0100] 事务执行线程将跳跃表中的一个或多个节点指定为范围查询操作的密钥范围[A,B]的范围保护节点。节点的参考插入到存储通过事务执行线程访问的节点的扫描集中。
[0101] 密钥范围[A,B]的扫描集表示为在具有密钥K的节点的扫描期间通过事务执行线程遍历的节点,以使得A<=K<=B,而不管节点的状态参数的值是什么。当key A不存在于跳跃表中时,密钥范围[A,B]的扫描集任选地通过predecessor(A)进行扩增。密钥[A,B]的范围保护是节点含有A(当存在时)或predecessor(A)。添加到扫描集中的节点与节点的version、state和range-guard参数相关联。
[0102] 应注意,将节点添加到扫描集中,而不管它们的state参数的值是什么。范围查询操作忽略了与state参数为absent值的节点相关联的无效record_id值。
[0103] 在提交阶段(例如,如参考框210所描述)期间,事务执行线程检测扫描集中的每一节点并验证所述节点,如本文中所描述。验证成本与密钥范围中的节点数目成线性关系。
[0104] 通过事务执行线程执行的扫描可在跳跃表的最低层(即,层0)处实施,所述跳跃表存储密钥值的连续有序序列。对于[A,B]的范围查询操作,标记所扫描的每一节点,而不管所述节点在所述节点插入到扫描集中时是否表示范围保护。
[0105] 在208B处,执行线程进行新节点到跳跃表中的节点插入操作。在执行阶段期间,将新节点在原子级上插入到跳跃表的节点列表组件中。
[0106] 假想节点可由新密钥的节点插入操作产生,所述节点插入操作使跳跃表的结构发生结构改变。应注意,节点删除操作影响现有节点,但不会使跳跃表发生结构改变。返回参考图3,节点的state参数的值的状态图指示所提交的节点删除操作将节点的state参数的值设置成absent,而无需实际地从跳跃表结构中删除所述节点。节点的实际物理删除(和存储空间的回收)以及到空闲列表的添加可通过节点清理器延迟完成。
[0107] 非现有密钥K的节点插入操作包含使K的先前节点的version参数的数值递增。任选地,实施乐观方法以使节点的version参数的值递增。当新节点插入到跳跃表结构中时,先前节点的version参数的值递增。假定执行事务将最终提交,将递增作为节点插入操作的部分来执行。
[0108] 应注意,用于给定范围查询的扫描集中的每一节点在所述节点被添加到扫描集中时与state、version和range-guard参数相关联。现在使用存储密钥(A,D,E)的跳跃表描述实例,其中节点N存储密钥A。以下三个事务执行线程(表示为T1、T2、T3)在跳跃表上并行执行:T1执行针对[B,E]的范围查询操作;T2执行B的节点插入操作;以及T3执行C的节点插入操作。事务T1的扫描集包含作为具有密钥范围[B,E]的先前节点的节点N。当插入到扫描集中时,N标记为范围保护。无论节点插入(B)和节点插入(C)操作的次序是什么,最终结果都是节点N的version参数的值递增,因为N是B和/或C的先前节点。通过观察节点N的version参数的值的改变,事务T1检测假想节点插入操作,并中止。
[0109] 密钥K的节点插入操作可实施如下:当K映射到state参数为present值的节点时,节点插入操作失败,且事务中止。
[0110] 当K未映射到节点时,从(例如,存储器112的)空闲空间池分配新节点,并且新节点的state参数的值被设置为值absent。最新分配的节点的参数version、record-id和connect-level被设置成零,且write-count参数的值被设置成1。新节点插入到跳跃表结构中,并添加到事务的写入集中。insert-if-non-existing原语确保针对跳跃表结构中的给定密钥从不存在超过一个节点。具有absent值的节点插入到跳跃表结构的层0(即,底层)中,从而触发K的先前节点的version参数的值递增。在事务提交时间完成到塔的较高层中的插入(即,框210)。
[0111] 当K已经映射到具有值absent的节点时,事务执行线程递增节点的write-count参数,并且节点被添加到事务执行线程的写入集中。
[0112] 应注意,多个事务执行线程可并行尝试将同一密钥插入到跳跃表中。提交协议(例如,如本文中参考框210所描述)确保仅一个事务执行线程提交所插入的密钥,并且其它事务执行线程失败。
[0113] 当事务执行线程执行提交阶段时,所插入的节点的state参数的值被修改为值present,并且record-id参数被分配有效值。基于所插入的密钥值,节点的塔链接到跳跃表的较高层。insert-if-non-existing原语确保当节点已经存在于某一层时,事务确实失败。
[0114] 应注意,提交协议确保事务执行线程通过提交事务而取代record-id集。在事务提交/中止后,节点的write-count参数递减。
[0115] 在208C处,一个或多个事务执行线程进行节点删除操作以从跳跃表中删除现有节点。
[0116] 事务执行线程将现有节点的state参数的值设置成absent,而无需以物理方式从跳跃表删除所述节点。任选地通过执行清理线程,节点清理器以物理方式从跳跃表中延迟地删除节点。
[0117] 密钥K上的节点删除操作可实施如下:当K未映射到跳跃表的节点,或映射到节点的state参数为值absent的节点时,节点删除操作失败,且事务执行线程中止。否则,事务执行线程使节点的write-count参数的值递增,并将所述节点添加到与事务执行线程相关联的写入集中。
[0118] 应注意,多个事务执行线程可尝试并行删除同一密钥。提交协议(例如,如参考框210所描述)确保仅一个事务执行线程提交密钥删除,并且其它事务执行线程失败。
[0119] 当事务执行线程执行提交阶段时,(例如,如参考框210所描述)删除节点的state参数的值被修改为absent,并且record_id的值被设置成NULL。在事务提交/中止后,节点的write-count参数递减。
[0120] 在210处,执行提交阶段。在提交阶段期间,事务执行线程执行提交协议,所述提交协议提供跳跃表结构的事务一致性并验证范围查询操作的一致性。提交协议确保针对同一密钥并行执行节点插入和节点删除操作具有单个获胜者(winner)。
[0121] 应注意,单个事务执行线程可执行多个节点插入、节点删除和范围查询操作。
[0122] 当通过确保仅一个事务执行线程将新节点提交到所述跳跃表中且其它事务执行线程失败而证实事务一致性时,提交阶段将所述新节点的塔的较高层链接到跳跃表的相应层。
[0123] 提交阶段可基于四个阶段而实施。
[0124] 在阶段1中,每一节点锁定在写入集中。以全局次序进行锁定以避免死锁。基于增加的节点存储器地址而限定示例性全局次序。
[0125] 在阶段2中,事务执行线程解决节点插入和节点删除冲突,和/或根据节点的state参数来检测不一致范围查询操作。仅允许提交多个并行执行事务线程中的一个。由于在执行阶段期间没有锁,所以执行冲突解决和/或不一致操作检测,从而实现通过不同事务执行线程并行执行的对同一密钥的多个插入节点操作和/或对同一密钥的多个删除节点操作。
[0126] 执行范围查询操作的事务执行线程忽略了进行中的操作,并且仅考虑有效的record-id值。提交协议确保在事务执行阶段期间尚未提交进行中的并行事务的节点插入和/或节点删除操作。
[0127] 在阶段3中,事务执行线程保护范围查询操作免受假想节点插入操作影响。通过验证扫描集中的节点的version参数的值保持不变和范围保护节点尚未被清理来进行保护。不变的version参数值指示在范围查询处理期间未对跳跃表进行任何结构改变。标记为范围保护的节点保护特定密钥范围免受假想节点插入操作影响。当节点从跳跃表中去除并被添加到清理列表中(例如,通过节点清理器过程)时,范围查询一致性受到损害,且事务执行线程中止。
[0128] 在阶段4中,通过改变新节点的state参数和record-id的值来提交节点插入操作和/或中止操作。事务执行阶段可解锁写入集。
[0129] 应注意,当在事务提交阶段期间,检测到标记为范围保护的节点已经通过节点清理器处理器清理时,假想节点的检测受到破坏且事务中止。
[0130] 在212处,任选地以延迟方式任选地在后台通过节点链路管理器116处理最新插入和/或最新删除的节点的链路。
[0131] 基于对可分裂成不同阶段的节点插入操作和节点删除操作的执行来实施节点链路管理器116。节点插入操作可分裂成第一插入状态,其中节点插入到跳跃表的层0中,且其state参数标记为present。第二阶段将最新插入的节点的塔的链路向上连接到层L,其中connect-level<L<top-level。节点删除操作可分裂成第一逻辑删除阶段,其中通过将state参数的值变成absent而在逻辑上标记节点。第二阶段断开所有层处的节点的塔的链路,任选地从top-level开始向下到层0。第三状态以物理方式从跳跃表结构中去除删除节点。
[0132] 分裂减小了节点插入和节点删除操作的时延。
[0133] 写入集中的每一节点的塔的较高层通过节点链路管理器过程116(例如,存储在存储器112中的代码指令)而连接到跳跃表的相应层,任选地例如在后台中执行,所述节点链路管理器过程116遍历跳跃表的层0(即,最低层),并连接具有state参数的当前值的最新插入的节点的缺失链路。
[0134] 节点链路管理器112(例如,实施为线程)可从最高层到节点列表层(即,最低层0)依序遍历在跳跃表的塔的各层处的节点。
[0135] 节点链路管理器112可执行节点连接器过程,任选地延迟节点连接线程,所述节点连接器过程遍历在相应层处的跳跃表的节点,连接指定有state参数值present的节点的节点列表组件,并将相应节点的塔连接到相应层。
[0136] 可检查在跳跃表的层0处的每一节点n以确定相应节点是否具有state参数的present值和零write-count。此类节点的链路从low-level=n.current-level+1开始向上直到high-level=n.top-level-1依序连接。从low-level到high level的链路连接的次序确保正确性。当连接链路时,节点的connect-level参数被设置成最高层的值。write-count参数的零值有助于确保当前节点不是由有效事务参考,所述有效事务可改变state参数的值。
[0137] 节点链路管理器112可执行节点链路断开过程,任选地延迟节点链路断开线程,所述节点链路断开过程遍历在相应层处的跳跃表的节点,断开具有state参数值absent的节点的塔,并从跳跃表中删除其余节点列表组件,任选地使用回收删除节点的存储空间的延迟节点清理器线程(其可通过节点清理器114执行)。从最高层往下到层1依序进行断开。所述依序断开有助于确保正确性。具有absent值的节点的断开可分批一起处理,从而提高断开过程的计算效率。
[0138] 当节点的state参数的值变为absent时,节点的存储空间并不是立即回收。并行执行事务执行线程可接入节点。通过首先断开塔(即,在高于层0的层处)且接着断开最低层来断开节点。
[0139] 当处理层L的链表时,检测列表中的每一节点的状态。当节点的state参数为absent值且write-count参数为零值时,节点从列表断开,且connect-level参数的值递减。write-count参数的零值有助于确保节点不是由有效事务参考,所述有效事务可改变节点的state参数的值。
[0140] 应注意,在层L处已经断开的节点可接着通过所提交的节点插入操作将state参数的值变成present,由此将节点链路层保持在小于L。节点连接过程的调用修正了缺失节点链路。
[0141] 在214处,任选地通过节点清理器114来回收逻辑上删除的节点所占用的存储空间。具有分配到state参数的absent值的节点在逻辑上删除,且它们的存储空间可进行回收。然而,具有absent值的节点无法立即回收,因为并行事务执行线程可能正在接入节点。
[0142] 任选地,当通过节点清理器删除和从跳跃表结构中去除扫描集中的范围保护节点时,事务执行线程中止。
[0143] 节点清理器114从大于0的所有跳跃表层断开具有值absent(分配到state参数)的节点,且接着在层0处将state参数的值从absent变为clean。节点移动到其中回收节点的存储空间的清理列表。
[0144] 任选地,节点清理器114是延迟节点清理器,任选地基于纪元机制进行操作。节点清理器可例如根据时间(例如,每特定时间量)、根据具有absent值的节点的阈值(例如,百分比)或其它事件进行调度。
[0145] 节点清理器可与全局cleaner-epoch-number参数(其可存储在共享存储器112和/或另一存储设备中)相关联,所述参数每当执行节点清理器时递增。
[0146] 任选地,根据以下特征中的一个或多个设计节点清理器:
[0147] *以无阻塞方式操作。节点清理器可用作与事务执行线程并行执行的后台进程。节点清理器不会使有效事务执行线程的处理停止。
[0148] *节点清理可任意开始和停止,例如,根据可用处理资源。
[0149] *节点清理器可用作并行执行的两个或更多个单独的线程。一个线程(或一组线程)从跳跃表断开state参数为absent值的节点。另一线程(或另一组线程)回收存储空间。
[0150] 清理可实施为清除阶段214A和回收阶段214B,它们在每一清理纪元重复。应注意,为了阐明,首先描述清除阶段214A。然而,实际上,回收阶段214B可在清除阶段214A之前执行以回收在先前纪元中清理的节点的空间。
[0151] 在214A处,值absent分配到state参数的节点从跳跃表的最低层(即,层0)中去除,并被添加到清理列表(其可存储在存储器112和/或另一存储设备中)。state参数的值变为clean。
[0152] 分析节点以基于具有absent值、write-count参数的零值和connect-level参数的零值进行去除。应注意,如本文中所描述,节点链路管理器(即,116)断开具有值absent的节点的链路,并将connect-level参数的值设置成零。
[0153] 具有值absent的节点的去除与state参数的值变成clean相关联,同时保持节点和先前节点上的锁。当具有值clean的节点从跳跃表断开并被添加到清理列表中时,节点与cleaner-epoch-number参数的当前值相关联。
[0154] 在214B处,回收存储在清理列表中的节点的存储空间。使用代码指令的回收存储空间的示例性实施方案是基于全局纪元数,并使用包含每一执行线程的条目的全局active-transaction阵列(例如,存储在共享存储器112和/或另一存储设备中)。N个线程中的每一个与相应的ID[0...N-1]相关联,并且线程K与条目active-transaction[K]相关联。active-transaction阵列的大小是执行线程的核心(和/或处理器)的数目的函数。
[0155] 特定事务执行线程的条目存储正通过特定事务执行线程执行的操作的上下文。每一上下文可包含纪元相关的变量,其可表示为:
[0156] 在一开始分配(例如,64位)最大值的tx_epoch_number(例如,64位整数)。当事务执行线程开始时,tx_epoch_number被设置成全局cleaner_epoch_number的当前值。当事务执行线程结束时,值又被设置回最大值。
[0157] 有效事务执行线程无法看见待回收的节点。检测active-transaction阵列,并且值min_tx_epoch_number计算为执行事务执行线程的最小tx_epoch_number,这根据以下关系式进行:
[0158] min_tx_epoch_number=MIN(active-transaction[k]→tx_epoch_number,其中0<=k<=N)
[0159] 其中tx_epoch_number<min_tx_epoch_number的节点可从清理列表中安全删除,并且可回收节点的存储空间。
[0160] 在216处,重复进行一个或多个框204到214。可通过多个处理器同时执行来并行进行重复。
[0161] 现在参考图4A,图4A是根据本发明的一些实施例的用于实施节点插入操作的示例性方法的流程图。参考图2的框208B和/或框210描述的方法可基于参考图4A描述的方法而实施。
[0162] 在402处,接收插入密钥K的指令。
[0163] 在404处,执行执行阶段,任选地基于参考图2的框208B描述的实施方案。从空闲空间池分配节点n。节点n的key参数被设置成K,并且state参数的值被设置成absent。insert-if-non-existing()原语用于将节点n在原子级上插入到跳跃表的层0中。K的先前节点的version参数的值递增。
[0164] 在406处,执行提交阶段,任选地基于参考图2的框210描述的实施方案。当不存在提交时,事务执行线程中止。否则,节点n的state参数的值被设置成present。节点n连接到跳跃表的较高层。
[0165] 现在参考图4B,图4B是根据本发明的一些实施例的用于实施节点插入操作的执行阶段的另一示例性方法的流程图。参考图2的框描述的方法可基于参考图4B描述的方法来实施。
[0166] 在450处,接收插入密钥K的指令。
[0167] 在452处,当K映射到具有分配到state参数的值present的跳跃表中的节点时,事务执行线程中止。
[0168] 在454处,当K映射到具有分配到state参数的值absent的节点时,从空闲空间池分配节点n。节点n的key参数被设置成K,并且state参数的值被设置成absent。version参数的值被设置成0。write-count参数的值被设置成0。record-id参数的值被设置成NULL。insert-if-non-existing()原语用于将节点n在原子级上插入到跳跃表的层0中。K的先前节点的version参数的值递增。
[0169] 可替代地或另外,节点的write-count参数的值在原子级上递增。节点被添加到事务执行线程的写入集中。
[0170] 现在参考图5,图5是根据本发明的一些实施例的用于实施节点删除操作的示例性方法的流程图。参考图2的框208C和/或框210描述的方法可基于参考图5描述的方法而实施。
[0171] 在502处,接收删除密钥K的指令。
[0172] 在504处,当K未映射到跳跃表中的节点和/或映射到state参数为值absent的跳跃表中的节点时,事务执行线程中止。可替代地,节点的write-count参数的值在原子级上递增。节点被添加到事务执行线程的写入集中。
[0173] 现在参考图6,图6包含根据本发明的一些实施例的提交阶段(例如,参考图2的框210描述)的示例性实施方案的伪码。
[0174] 现在参考图7,图7是根据本发明的一些实施例的描绘用于执行范围查询、节点插入和/或节点删除操作的模型的示例性实施方案的框图。
[0175] 基于执行阶段704和提交阶段706而执行事务702(即,范围查询、节点插入和/或节点删除操作),如本文中所描述。在跳跃表处于无锁状态708的情况下进行所述执行。state参数的值进行更新,如本文中所描述,例如,存储在事务状态表710中。基于提交协议712来实施提交阶段706,如本文中所描述。
[0176] 对本发明各个实施例的描述只是为了说明的目的,而这些描述并不旨在穷举或限于所公开的实施例。在不脱离所描述的实施例的范围和精神的情况下,本领域技术人员可以清楚理解许多修改和变化。相比于市场上可找到的技术,选择此处使用的术语可最好地解释本实施例的原理、实际应用或技术进步,或使本领域其他技术人员理解此处公开的实施例。
[0177] 期望在从本申请案成长的专利的有效期期间,将开发出许多相关多核处理器和共享存储器且术语“处理器和存储器”的范围意图先验地包含所有此类新技术。
[0178] 本文所使用的术语,“大约”是指±10%。
[0179] 术语“包括”、“包含”、“具有”以及其变化形式表示“包含但不限于”。这个术语包括了术语“由……组成”和“主要由……组成”。
[0180] 短语“主要由...组成”意指组成物或方法可以包含额外成分和/或步骤,但前提是所述额外成分和/或步骤不会实质上改变所要求的组成物或方法的基本和新颖特性。
[0181] 除非上下文中另有明确说明,此处使用的单数形式“一个”和“所述”包含复数含义。例如,术语“化合物”或“至少一个化合物”可以包含多个化合物,包含其混合物。
[0182] 此处使用的词“示例性”表示“作为一个实例、例子或说明”。任何“示例性”实施例并不一定理解为优先于或优越于其他实施例,和/或并不排除其他实施例特点的结合。
[0183] 此处使用的词语“任选地”表示“在一些实施例中提供且在其他实施例中没有提供”。本发明的任意特定的实施例可以包含多个“任选的”特征,除非这些特征相互矛盾。
[0184] 在整个本申请案中,本发明的各种实施例可以范围格式呈现。应理解,范围格式的描述仅为了方便和简洁起见,并且不应该被解释为对本发明范围的固定限制。因此,对范围的描述应被认为是已经具体地公开所有可能的子范围以及所述范围内的个别数值。例如,对例如从1到6的范围的描述应被认为是已经具体地公开子范围,例如从1到3、从1到4、从1到5、从2到4、从2到6、从3到6等,以及所述范围内的个别数字,例如1、2、3、4、5和6。不管范围的宽度如何,这都适用。
[0185] 当此处指出一个数字范围时,表示包含了在指出的这个范围内的任意所列举的数字(分数或整数)。短语“在第一个所指示的数和第二个所指示的数范围内”以及“从第一个所指示的数到第二个所指示的数范围内”和在这里互换使用,表示包含第一个和第二个所指示的数以及二者之间所有的分数和整数。
[0186] 应了解,为简洁起见在单独实施例的上下文中描述的本发明的某些特征还可以组合提供于单个实施例中。相反地,为简洁起见在单个实施例的上下文中描述的本发明的各个特征也可以单独地或以任何合适的子组合或作为本发明的任何合适的其它实施例提供。在各个实施例的上下文中描述的某些特征不应被视为那些实施例的基本特征,除非没有这些元素所述实施例无效。
[0187] 此处,本说明书中提及的所有出版物、专利和专利说明书都通过引用本说明书结合在本说明书中,同样,每个单独的出版物、专利或专利说明书也具体且单独地结合在此。此外,对本申请的任何参考的引用或识别不可当做是允许这样的参考在现有技术中优先于本发明。就使用节标题而言,不应该将节标题理解成必要的限定。