操作数据的方法和装置以及管理持久化跳表的方法和装置制造方法及图纸

技术编号:25438794 阅读:16 留言:0更新日期:2020-08-28 22:27
提供了一种操作数据的方法和装置以及管理持久化跳表的方法和装置。操作数据的方法包括:读取具有特定格式的第一指针sp,其中,所述特定格式至少包括地址部分和脏位;根据第一指针sp的脏位确定是否对第一指针sp执行flush操作;以及通过比较并交换CAS操作将第一指针sp修改为指向新地址。

【技术实现步骤摘要】
操作数据的方法和装置以及管理持久化跳表的方法和装置
本申请总体说来涉及持久化内存设备(PersistentMemory,PMEM)的数据操作的
,更具体地讲,涉及持久化内存设备的数据操作的方法和装置以及管理持久化跳表的方法和装置。
技术介绍
现有的并发无锁跳表都是基于比较并交换(CompareandSwap,CAS)操作实现的,但是PMEM不同于DRAM的地方在于持久化特性,即在断电时数据不会丢失。在现有计算机软硬件架构下,程序对内存的读写都会经过CPU中的缓存(基本单元叫做缓存行(Cacheline)),所以对于PMEM中的数据的写操作(包括CAS),并不能保证此被写入的新数据会被立刻写入PMEM。只有当新数据所在的Cacheline被写回PMEM中(即进行缓存行刷新(Cachelineflush),以下简称FLUSH)时,数据才被真正写入PMEM。FLUSH的顺序与数据被修改的顺序无关,由CPU自行决定,程序可以通过额外执行一次指令(CLFLUSH/CLWB)达到目的,但是这些指令无法与传统CAS组合成原子操作。因此在某些情况下,使用传统CAS在断电恢复后会造成数据不一致的问题。例如,如图1中所示,X由线程1控制,初始值为1,Y需要始终保持其值等于X+1,由线程2控制。由于CAS+FLUSH不是原子操作,因此线程1和2可能会按照图1的顺序执行,因此,如果在线程1的flush(X)前系统断电,则恢复后由于X的新值未被真正写入PMEM,因此会导致X的值仍为修改前的1,而Y的新值4已经写入PMEM,导致Y≠X+1,进而造成数据不一致的问题。所以现有的CAS无法运用到基于PMEM的持久化数据结构中。虽然,现有技术可利用读前刷新(flush-on-read)机制从正确性上解决以上问题,即在CAS前对所读数据进行一次FLUSH,但是在现今系统中,缺乏判断所读数据是否需要FLUSH的方法。此外,在无锁跳表的实现中大量使用了CAS,如果每个CAS前都进行FLUSH,则会产生大量的不必要的FLUSH,而FLUSH本身是一个非常耗时的操作。此外,现有技术还可利用Cachelineflush指令(CLFLUSH/CLWB)来解决以上问题,但是这些指令本身只有在flush的数据量≤64字节(64B)才是原子操作,这意味着如果在对于数据量>64B的数据执行flush操作的过程中发生断电,则在系统重启恢复后,涉及的数据量>64B的数据可能会出现只有部分数据被更新而导致的数据不一致的问题。
技术实现思路
本申请的示例性实施例在于提供一种操作数据的方法和装置以及管理持久化跳表的方法和装置,以至少解决现有技术存在的上述问题。根据本申请的示例性实施例,提供一种操作数据的方法,所述方法可包括:读取具有特定格式的第一指针sp,其中,所述特定格式至少包括地址部分和脏位;根据第一指针sp的脏位确定是否对第一指针sp执行flush操作;通过比较并交换CAS操作将第一指针sp修改为指向新地址。可选地,根据第一指针sp的脏位确定是否对第一指针sp执行flush操作的步骤可包括:确定第一指针sp的脏位是否为第一值;如果第一指针sp的脏位为第一值,则将第一指针sp的脏位设置为第二值并对第一指针sp执行flush操作,如果第一指针sp的脏位为第二值,则不对第一指针sp执行flush操作。可选地,所述特定格式中的脏位可以是指针的最低的3个位中的至少一位。可选地,通过比较并交换CAS操作将第一指针sp修改为指向所述新地址的步骤可包括:创建具有所述特定格式的第二指针sp_old和第三指针sp_new;将第二指针sp_old指向第一指针sp的地址部分,并将第二指针sp_old的脏位设置为第二值;将第三指针sp_new指向所述新地址,并将第三指针sp_new的脏位设置为第一值;对第一指针sp、第二指针sp_old和第三指针sp_new执行CAS操作。根据本申请的示例性实施例,提供一种操作数据的装置,所述装置可包括:读取模块,被配置为读取具有特定格式的第一指针sp,其中,所述特定格式至少包括地址部分和脏位;以及处理模块,被配置为:根据第一指针sp的脏位确定是否对第一指针sp执行flush操作;并且通过比较并交换CAS操作将第一指针sp修改为指向新地址。可选地,处理器可被配置为通过以下操作来确定是否对第一指针sp执行flush操作:确定第一指针sp的脏位是否为第一值;如果第一指针sp的脏位为第一值,则将第一指针sp的脏位设置为第二值并对第一指针sp执行flush操作,如果第一指针sp的脏位为第二值,则不对第一指针sp执行flush操作。可选地,所述特定格式中的脏位可以是指针的最低的3个位中的至少一位。可选地,处理模块可被配置为通过以下操作来将第一指针sp修改为指向所述新地址:创建具有所述特定格式的第二指针sp_old和第三指针sp_new;将第二指针sp_old指向第一指针sp的地址部分,并将第二指针sp_old的脏位设置为第二值;将第三指针sp_new指向所述新地址,并将第三指针sp_new的脏位设置为第一值;对第一指针sp、第二指针sp_old和第三指针sp_new执行CAS操作。根据本申请的示例性实施例,提供一种管理持久化跳表的方法,所述方法可包括:根据具有第一格式的指针和具有第二格式的指针来生成一个持久化跳表;并且将所述持久化跳表中的所有具有第一格式的指针以及所有节点的键值对和高度存储在持久化存储装置中,其中,第一格式至少包括地址部分和脏位,第二格式仅包括地址部分,所述脏位用于确定是否对具有第一格式的指针执行flush操作,其中,所述持久化跳表中的底层链表中的每个节点的next指针具有第一格式,并且所述持久化跳表中的除了所述底层链表之外的上层链表中的每个节点的next指针具有第二格式。可选地,第一格式中的脏位可以是指针的最低的3个位中的至少一位。可选地,当修改所述底层链表中的任意一个节点时,可进行以下操作:读取所述任意一个节点的next指针sp;确定所述任意一个节点的next指针sp的脏位是否为第一值;如果所述任意一个节点的next指针sp的脏位为第一值,则将所述任意一个节点的next指针sp的脏位设置为第二值并对所述任意一个节点的next指针sp执行flush操作,如果所述任意一个节点的next指针sp的脏位为第二值,则不对所述任意一个节点的next指针sp执行flush操作;通过比较并交换CAS操作将所述任意一个节点的next指针sp修改为指向新地址。可选地,通过比较并交换CAS操作将第一指针sp修改为指向所述新地址的步骤可包括:创建具有第一格式的指针sp_old和指针sp_new;将指针sp_old指向所述任意一个节点的next指针sp的地址部分,并将指针sp_old的脏位设置为第二值;将指针sp_new指向所述新地址,并将指针sp_new的脏位设置为第一值;对所述任意一个节点的next指针sp、指针sp_old和指针sp_new执行CAS操作。可选地本文档来自技高网
...

【技术保护点】
1.一种操作数据的方法,所述方法包括:/n读取具有特定格式的第一指针sp,其中,所述特定格式至少包括地址部分和脏位;/n根据第一指针sp的脏位确定是否对第一指针sp执行flush操作;/n通过比较并交换CAS操作将第一指针sp修改为指向新地址。/n

【技术特征摘要】
1.一种操作数据的方法,所述方法包括:
读取具有特定格式的第一指针sp,其中,所述特定格式至少包括地址部分和脏位;
根据第一指针sp的脏位确定是否对第一指针sp执行flush操作;
通过比较并交换CAS操作将第一指针sp修改为指向新地址。


2.如权利要求1所述的方法,其中,根据第一指针sp的脏位确定是否对第一指针sp执行flush操作的步骤包括:
确定第一指针sp的脏位是否为第一值;
如果第一指针sp的脏位为第一值,则将第一指针sp的脏位设置为第二值并对第一指针sp执行flush操作,如果第一指针sp的脏位为第二值,则不对第一指针sp执行flush操作。


3.如权利要求1所述的方法,其中,所述特定格式中的脏位是指针的最低的3个位中的至少一位。


4.如权利要求2所述的方法,其中,通过比较并交换CAS操作将第一指针sp修改为指向所述新地址的步骤包括:
创建具有所述特定格式的第二指针sp_old和第三指针sp_new;
将第二指针sp_old指向第一指针sp的地址部分,并将第二指针sp_old的脏位设置为第二值;
将第三指针sp_new指向所述新地址,并将第三指针sp_new的脏位设置为第一值;
对第一指针sp、第二指针sp_old和第三指针sp_new执行CAS操作。


5.一种操作数据的装置,所述装置包括:
读取模块,被配置为读取具有特定格式的第一指针sp,其中,所述特定格式至少包括地址部分和脏位;以及
处理模块,被配置为:
根据第一指针sp的脏位确定是否对第一指针sp执行flush操作;并且
通过比较并交换CAS操作将第一指针sp修改为指向新地址。


6.一种管理持久化跳表...

【专利技术属性】
技术研发人员:杨俊陈宬卢冕
申请(专利权)人:第四范式北京技术有限公司
类型:发明
国别省市:北京;11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1