一种基于数据双版本的非易失内存更新方法

文档序号:1904298 发布日期:2021-11-30 浏览:23次 >En<

阅读说明:本技术 一种基于数据双版本的非易失内存更新方法 (Nonvolatile memory updating method based on data double versions ) 是由 王芳 冯丹 刘超杰 关天锦 邹晓敏 于 2021-08-23 设计创作,主要内容包括:本发明公开了一种基于数据双版本的非易失内存更新方法,包括:在非易失内存的一个数据单元中维护持久性事务内存中的数据的新旧两个版本;更新事务执行时使用DRAM中更新后的数据副本轮流更新这两个版本;本发明消除了冗余的NVM写操作,降低了缓存逐出指令和内存屏障指令调用的次数,从而缩短了单个更新事务的执行时间;本发明提出了基于数据双版本的只读事务读取数据的流程和更新事务读取数据的流程,从而避免了多线程环境下的读写冲突,减少了更新事务对只读事务的阻塞;本发明使用锁的方式解决多线程环境下的写写冲突;本发明还提供了两种基于数据双版本的数据一致性恢复机制,分别是基于全局扫描的数据恢复和基于更新地址写回的数据恢复。(The invention discloses a nonvolatile memory updating method based on data double versions, which comprises the following steps: maintaining old and new versions of data in a persistent transactional memory in a data unit of a non-volatile memory; when the update transaction is executed, the two versions are updated by using the updated data copy in the DRAM in turn; the invention eliminates redundant NVM write operation, reduces the times of calling cache eviction instruction and memory barrier instruction, thereby shortening the execution time of single update transaction; the invention provides a data dual-version-based read-only transaction data reading flow and a transaction data updating reading flow, thereby avoiding read-write conflict in a multi-thread environment and reducing the blockage of the read-only transaction caused by the updating transaction; the invention solves the write conflict in the multithreading environment by using a lock mode; the invention also provides two data consistency recovery mechanisms based on the data double versions, which are respectively data recovery based on global scanning and data recovery based on update address write-back.)

一种基于数据双版本的非易失内存更新方法

技术领域

本发明属于计算机数据存储领域,更具体地,涉及一种基于数据双版本的非易失内存更新方法。

背景技术

在目前的计算机系统中,大多使用DRAM(动态随机存取存储器,Dynamic RandomAccess Memory)作为计算机系统的内存,DRAM访问延迟低,但是容量小,并且在系统掉电后数据会丢失。近年来,内存技术快速发展,非易失内存(non-volatile memory,NVM)技术取得了长足的进步。NVM不仅具备硬盘级别的容量和掉电后的非易失性,同时具备和DRAM在同一数量级的访问延迟,且支持字节寻址。此外,NVM也有一些缺陷,比如其读写延迟仍然比DRAM要高,并且读写不对称,读比写快,以及有限的写次数等。

和传统磁盘相比,NVM上的原子写粒度仅有8字节,因此当写入到NVM的数据大于8字节时,就有可能由于系统的意外崩溃,导致NVM中的数据只有部分更新,从而破坏数据的一致性。除此之外,为了保证数据按照特定的顺序写到NVM上,还需要调用缓存写回指令和内存屏障指令。

持久性事务内存是基于传统的事务内存针对NVM做出的扩展,即在事务内存的基础上考虑了NVM的非易失性。持久性事务内存涉及两种事务:一种是只读事务,其不会写任何数据;另一种是更新事务,其会写某些数据。

在持久性事务内存中更新NVM上的数据时,不能够对数据直接进行修改。这是因为如果在修改过程中发生系统崩溃或者机器掉电,那么将会产生部分更新。通常的做法是采用undo或者redo日志协议来更新数据并保障数据的一致性。采用undo日志的更新事务写数据的流程包括如下步骤:

D0:将数据A写入到日志中,得到数据A的副本数据A’;日志存储在NVM上;

D1:调用缓存逐出指令和内存屏障指令确保数据A’被持久化;持久化操作完成之后,如果系统掉电或崩溃,数据A’不会丢失;如果该更新事务执行了对多个数据的写操作,则需要对多个数据单独调用缓存逐出指令和内存屏障指令。

D2:对数据A执行写操作:将数据A的值更新为D。

提交更新事务时,需要调用缓存逐出指令和内存屏障指令确保对数据A的写操作被持久化;持久化操作完成之后,如果系统掉电或崩溃,数据A更新后的值D不会丢失;如果该更新事务执行了对多个数据的写操作,则需要对多个数据单独调用缓存逐出指令。

如果在修改数据A时发生系统崩溃,便可以使用日志中的数据A’将数据A恢复到被执行写操作之前的状态,从而保障数据的一致性。

基于undo日志的更新事务在执行多个数据的写操作时需要对多个数据单独调用缓存逐出指令和内存屏障指令,这是因为undo日志在对数据执行写操作时,必须等待该数据的副本持久化到日志之后才可以执行写操作,每执行一个数据的写操作,都需要调用缓存逐出指令和内存屏障指令保证副本数据被持久化。

采用redo日志的更新事务修改数据的流程包括如下步骤:

T0:将数据B写入到日志中,得到数据B的副本数据B’;日志存储在NVM上;

T1:对数据B’执行写操作。

提交更新事务的流程包括如下步骤

S0:调用缓存逐出指令和内存屏障指令确保步骤T1的操作被持久化,如果该更新事务执行了对多个数据的写操作,则需要对多个数据单独调用缓存逐出指令;

S1:使用数据B’更新数据B;

S2:调用缓存逐出指令和内存屏障指令确保步骤S1的操作被持久化,如果该更新事务执行了对多个数据的写操作,则需要对多个数据单独调用缓存逐出指令。

如果在执行步骤S1时发生系统崩溃,便可以使用日志中的数据B’重新执行步骤S1,将数据B恢复到被执行写操作之后的状态,从而保障数据的一致性。

基于undo日志的更新事务在步骤D0存在一次冗余的NVM写操作,基于redo日志的更新事务在步骤T0和S1存在两次冗余的NVM写操作;且不管是基于undo日志还是基于redo日志的更新事务,都需要多次调用缓存逐出指令和内存屏障指令;冗余的NVM写操作和多次指令调用会增加了单个更新事务的执行时间。

发明内容

针对现有技术的缺陷,本发明的目的在于提供一种基于数据双版本的非易失内存更新方法,旨在解决更新事务执行时的时间延迟问题。

为实现上述目的,本发明在非易失内存的一个数据单元中维护持久性事务内存中的数据的新旧两个版本,一个数据单元的起始地址是非易失内存的缓存行大小的倍数,所述两个版本包括一个新版本和一个旧版本;每个版本有一个对应的更新时间戳,值较大的更新时间戳对应的版本是新版本,值较小的更新时间戳对应的版本是旧版本,当两个更新时间戳的值相等时,任选一个版本作为新版本;

更新事务对数据执行写操作时,直接对所述数据副本执行写操作;所述数据副本为更新事务第一次读或写数据时拷贝到DRAM中的数据的新版本的副本;

更新事务提交时,将当前的全局逻辑时钟加1并更新,将更新后的全局逻辑时钟赋值给旧版本的更新时间戳;使用所述数据副本更新数据的旧版本并持久化。

本发明通过将数据的新旧两个版本存储在同一个缓存行中并使用DRAM中更新后的数据副本轮流更新这两个版本的方法,消除了现有技术中冗余的NVM写操作,虽然NVM上的写操作延迟已经和DRAM上的写操作延迟在同一数量级,但是仍有数倍的差距,因此本发明提供的数据更新方法降低了更新事务的执行时间。同时,本发明的更新事务在执行写操作时不需要调用缓存逐出指令和内存屏障指令,在提交对单个数据的写操作时,需要调用缓存逐出指令和内存屏障指令确保写操作被持久化,如果更新事务执行了写多个数据的操作,则提交时需要对多个数据单独调用缓存逐出指令。相比现有技术,本发明降低了调用指令的次数,从而缩短了更新事务的执行时间。

优选地,所述数据单元包括五个字段:lock、v0、v1、ts0、ts1;lock为锁,锁为0表示未加锁,锁为1表示锁定v0,锁为2表示锁定v1;v0和v1为所述数据的两个版本;ts0为v0的更新时间戳,ts1为v1的更新时间戳。

优选地,更新事务对数据进行第一次写操作时,先锁定数据的旧版本;更新事务提交时,将所述数据的锁更新为0。

优选地,只读事务读取数据的流程包括以下步骤:

A0:检查数据的锁和新版本的更新时间戳,如果新版本被锁定或者时间戳检查失败,则执行步骤A3;否则,执行步骤A1;

A1:读取数据的新版本;

A2:再次检查数据的锁和新版本的更新时间戳,如果新版本被锁定或者时间戳检查失败,步骤A1的读取操作失败,执行步骤A3;否则,数据读取成功;

A3:检查数据的锁和旧版本的更新时间戳,如果旧版本被锁定或者时间戳检查失败,则数据读取失败;否则,执行步骤A4;

A4:读取数据的旧版本;

A5:再次检查数据的锁和旧版本的更新时间戳,如果旧版本被锁定或者时间戳检查失败,则数据读取失败;否则,数据读取成功;

所述时间戳检查失败是指更新时间戳大于事务开始执行时记录的全局逻辑时钟的值。

本发明提供的只读事务读取数据的流程中,如果数据被锁定,说明写线程正在对该数据执行写操作;如果数据未被锁定,时间戳检查失败,说明写线程对该数据的写操作已提交;当数据被锁定或时间戳检查失败时,判定数据读取失败,可以有效避免读写冲突。

优选地,更新事务读取数据的流程包括以下步骤:

B0:检查数据的锁和新版本的更新时间戳,如果数据被锁定或者新版本的时间戳检查失败,则数据读取失败;否则,执行步骤B1;

B1:读取数据的新版本;

B2:再次检查数据的锁和新版本的更新时间戳,如果数据被锁定或者新版本的时间戳检查失败,则数据读取失败;否则,数据读取成功;

所述时间戳检查失败是指更新时间戳大于事务开始执行时记录的全局逻辑时钟的值。

优选地,更新事务执行被中断后,不一致数据的检测机制为:

更新事务在对数据执行写操作之前,将提交时间戳持久化到日志中;所述日志存储在非易失内存中;

如果所述更新事务执行时被中断,在进行数据恢复操作时,对非易失内存中的所有数据进行扫描操作,如果数据的ts0或ts1等于日志中的提交时间戳,则表示该数据是不一致数据;

所述不一致数据为被所述更新事务执行过写操作的数据;

所述提交时间戳为当前的全局逻辑时钟加1后的值。

优选地,如果所述更新事务执行时未被中断,则在所述更新事务提交之后,将日志中的提交时间戳删除。

优选地,更新事务执行被中断后,不一致数据的检测机制为:

E0:更新事务在对数据执行更新操作之前,将所述数据的地址持久化到日志中;所述日志存储在非易失内存中;

E1:如果所述更新事务执行时被中断,在进行数据恢复操作时,日志中的数据地址所指向的数据是不一致数据;

所述不一致数据为被所述更新事务执行过写操作的数据。

优选地,如果所述更新事务执行时未被中断,则在所述更新事务提交后,将日志中的数据地址删除。

优选地,在进行数据恢复操作时,使用不一致数据的旧版本覆盖新版本;并使用旧版本的更新时间戳覆盖新版本的更新时间戳。

通过本发明所构思的以上技术方案,与现有技术相比,由于消除了冗余的NVM写操作,降低了缓存逐出指令和内存屏障指令的调用次数,因此能够取得缩短更新事务的执行时间的有益效果;本发明提出了基于数据双版本的只读事务读取数据的流程和更新事务读取数据的流程,从而避免了多线程环境下的读写冲突,减少了更新事务对只读事务的阻塞;本发明使用锁的方式解决多线程环境下的写写冲突;本发明还提供了两种基于数据双版本的数据一致性恢复机制,分别是基于全局扫描的数据恢复和基于更新地址写回的数据恢复。

附图说明

图1是本发明实施例提供的基于数据双版本的数据单元的结构图;

图2是本发明实施例提供的基于数据双版本的更新事务对数据执行第一次写操作的流程图;

图3是本发明实施例提供的基于数据双版本的更新事务提交的流程图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

如图1所示,本发明实施例在非易失内存的一个数据单元中维护持久性事务内存中的数据A的新旧两个版本,该数据单元的起始地址是非易失内存的缓存行大小的倍数,数据单元包括五个字段:lock、v0、v1、ts0、ts1;lock占用1个字节,lock为锁,锁为0表示未加锁,锁为1表示锁定v0,锁为2表示锁定v1;v0和v1为数据A的两个版本,v0和v1的大小与数据实际大小相适应;ts0为v0的更新时间戳,ts1为v1的更新时间戳,ts0和ts1分别占用8个字节;如果ts0>ts1,则v0是新版本,v1是旧版本;如果ts0<ts1,则v1是新版本,v0是旧版本。如果ts0=ts1,则可以任选v0或者v1作为新版本。

本实施例中,lock为0,v0为100,ts0为3,v1为200,ts1为5;ts0<ts1,因此v1是新版本,v0是旧版本;更新事务开始执行时的全局逻辑时钟的值为10,记为sc=10;如图2所示,更新事务对数据A执行第一次写操作的流程包括:

(1)锁定v0:将lock更新为1;数据A被锁定后,其他的更新事务便无法再锁定数据A,也无法访问所述数据A,直到数据A的锁被更新为0;检查ts1是否小于等于sc,ts1为5小于sc,更新事务继续执行;否则,更新事务执行失败;

(2)读取v1,并将v1拷贝到DRAM作为数据副本;

(3)检查ts1是否小于等于sc,ts1为5小于sc,更新事务继续执行;否则,更新事务执行失败;

(4)将数据副本的值修改为300。

更新事务对数据A再次执行写操作的流程包括:直接访问DRAM中的数据副本,修改数据副本的值。

如图3所示,更新事务提交的流程包括:当前全局逻辑时钟的值为10,将当前全局逻辑时钟的值加1并更新,将更新后的值11赋值给ts0;使用数据副本的值300更新v0,并调用缓存逐出指令和内存屏障指令确保对v0的更新被持久化。

如果更新事务执行了写多个数据的操作,则提交时需要对这多个数据单独调用缓存逐出指令确保这多个写操作被持久化。

如果更新事务执行时,未对数据副本执行写操作,则在事务提交时,释放该数据副本在DRAM上占据的空间。

与现有技术相比,本发明的有益效果包括以下两方面:

(1)现有技术中冗余的NVM写操作主要发生在副本数据拷贝和副本数据写回中,本发明通过在非易失内存的一个数据单元中维护持久性事务内存中的数据的新旧两个版本并使用DRAM中更新后的数据副本循环更新这两个版本的方法,消除了现有技术中冗余的NVM写操作,从而缩短了更新事务的执行时间。

(2)本发明仅在提交时需要调用缓存逐出指令和内存屏障指令,如果更新事务执行了写一个数据的操作,则提交时需要对这单个数据调用缓存逐出指令和内存屏障指令确保写操作被持久化;如果更新事务执行了写多个数据的操作,则提交时需要对这多个数据单独调用缓存逐出指令确保写操作被持久化。与现有技术相比,本发明降低了指令调用的次数,从而缩短了更新事务的执行时间。

持久性事务内存在多线程环境下存在读写冲突和写写冲突,执行读操作的读线程读取到了执行写操作的写线程部分更新的数据,这就发生了读写冲突;当两个写线程同时更新同一数据时,就发生了写写冲突。

为解决读写冲突,本发明设计了只读事务读取数据的流程和更新事务读取数据的流程。不论是只读事务读取数据还是更新事务读取数据,都需要检查数据的锁和数据某一版本的更新时间戳,如果检查通过,则表示数据是一致的,即数据不是被写线程部分更新数据,也不是更新事务提交的数据;检查通过的标准是数据的某一版本没有被锁定,并且这一版本的更新时间戳小于等于事务开始执行时记录的全局逻辑时钟的值。这是因为如果数据的某一版本被锁定,说明写线程正在对该数据执行写操作;如果数据的某一版本未被锁定,并且这一版本的更新时间戳大于事务开始执行时记录的全局逻辑时钟的值,则说明写线程对该数据的写操作已提交。

本实施例中,数据A的lock为0,v0为100,ts0为3,v1为200,ts1为5。更新事务开始执行时的全局逻辑时钟的值为10,记为sc=10;只读事务需要对数据A执行读操作,只读事务读取的数据可能不是新版本的数据,而是旧版本的数据,但是数据是一致的。只读事务执行的流程包括:

(1)检查数据A的锁和新版本v1的更新时间戳ts1,lock为0,新版本未被锁定;ts1为5小于sc,时间戳检查成功;事务继续执行;

(2)读取v1;

(3)再次检查数据A的锁和更新时间戳ts1,lock为0,新版本未被锁定;此时ts1为15大于sc,时间戳检查失败,步骤(2)的读取操作失败;

(4)检查数据A的锁和旧版本v0的更新时间戳ts0,lock为0,旧版本未被锁定;ts0为3小于sc,时间戳检查成功;事务继续执行;

(5)读取v0;

(6)再次检查数据A的锁和旧版本v0的更新时间戳ts0,lock为0,旧版本未被锁定;ts0为3小于sc,时间戳检查成功;数据读取成功。

更新事务中的读操作不需要检查旧版本的更新时间戳,这是因为,如果更新事务要执行读取数据A,然后使用数据A的值更新数据B的操作,那么对于更新事务来说,只能基于最新的数据A进行更新操作,因此,只需要检查数据A的新版本的更新时间戳。

本实施例中,数据A的lock为0,v0为100,ts0为3,v1为200,ts1为5。更新事务开始执行时的全局逻辑时钟的值为10,记为sc=10;更新事务需要对数据A执行读操作,更新事务执行的流程包括:

(1)检查数据A的锁和新版本v1的更新时间戳ts1,lock为0,数据未被锁定;ts1为5小于sc,时间戳检查成功;事务继续执行;

(2)读取v1;

(3)再次检查数据A的锁和新版本的更新时间戳,此时lock为2,数据被锁定,数据读取失败。

系统崩溃可能会导致基于数据双版本的事务内存中存在不一致数据,比如一个更新事务完成了对部分数据的修改,如果这时发生系统崩溃等意外事件导致更新事务执行中断,在系统重启后便残留着这个没有完成的更新事务,被这个更新事务执行过写操作的数据为不一致数据。

本发明可以利用数据双版本中处于一致状态的版本覆盖被更新事务修改过的版本,进而将NVM中的不一致数据恢复到修改前的状态,从而保障更新事务中断后的数据一致性。这里存在的主要问题是,在更新事务中断后无法得知哪些数据是不一致数据。本发明针对这一问题设计了两种数据一致性的恢复机制:基于全局扫描的数据恢复、基于更新地址写回的数据恢复。

本实施例中,数据A的lock为0,v0为100,ts0为3,v1为200,ts1为5。当前的全局逻辑时钟的值为10,记为t=10;数据A在DRAM中的数据副本为AA;基于全局扫描的数据恢复的流程包括:

(1)将t加1并更新,记为t=11,将更新后的值11作为提交时间戳,然后将提交时间戳持久化到日志中,日志存储在NVM中;

(2)ts0<ts1,v0是旧版本,将步骤(1)中更新后的t的值赋值给ts0,记为ts0=11;

(3)使用更新后的AA对v0执行写操作,此时发生系统崩溃,更新事务被中断;在进行数据恢复操作时,对非易失内存中的所有数据进行扫描操作,结果发现数据A的ts0等于日志中的提交时间戳,说明数据A是不一致数据;

(4)此时ts1=5,ts1<ts0,v0是新版本,v1是旧版本,使用v1的值覆盖v0;并使用ts1的值覆盖ts0。

如果更新事务执行时未被中断,则在更新事务提交之后,将日志中的提交时间戳删除。

本实施例中,数据A的lock为0,v0为100,ts0为3,v1为200,ts1为5;当前的全局逻辑时钟的值为10,记为t=10;基于更新地址写回的数据恢复的流程包括:

(1)将数据A的地址持久化到日志中;日志存储在NVM中;

(2)ts0<ts1,v0是旧版本,将t加1并更新,将更新后的t的值赋值给ts0,记为ts0=11;使用更新后的AA对v0执行写操作,此时发生系统崩溃,更新事务被中断;在进行数据恢复操作时,日志中的数据地址所指向的数据A是不一致数据;

(3)此时ts1=5,ts1<ts0,v0是新版本,v1是旧版本,使用v1的值覆盖v0;并使用ts1的值覆盖ts0。

如果更新事务执行时未被中断,则在更新事务提交之后,将日志中的数据A的地址删除。

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

11页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:一种资源管理方法、装置以及计算机存储介质

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!