NBTree: a Lock-free PM-friendly Persistent B -Tree for eADR-enab(4)
使用eADR,可以确保CPU缓存中全局可见的数据被持久化。因此,可以原子地修改和持久化数据。
2.2 The Design Challenges of Lock-free Persistent Data Structures 在PM中设计无锁数据结构(LFD)并非易事,因为它们不仅需要处理微妙的竞态条件(如易失性索引),还需要确保写入在任何依赖的读取之前被持久化。以下两个硬件限制使我们无法在PM中设计高效的lfd。(1)内存加载和存储的原子性粒度为1个字,即8个字节。许多lfd中使用的原子性CPU硬件原语,例如比较与交换(compare-and-swap, CAS),只能原子性地修改一个字。然而,在非平凡的数据结构中,一个操作需要读写多个单词。因此,lfd很可能将中间状态暴露给并发线程。此外,当一个线程正在执行一个操作时,数据结构可能会被其他线程更改。这些问题可能会导致更新丢失、读取过期和读取不一致等异常。
(2)基于adr的PM系统不支持原子原语对数据进行修改和持久化。更新首先被发送到CPU缓存,然后使用fush指令和内存屏障进行持久化。由于CPU缓存中的全局可见数据是不稳定的,其他线程很容易读取非持久化数据,从而导致脏读异常。在下面的例子中,我们将使用持久化的B -树来指定上述异常是如何发生的。