首页 > 解决方案 > 区分易失性和持久性变量,它会影响正确性吗?

问题描述

根据我对持久性编程模型的理解,正确区分易失性变量和持久性变量取决于程序员。持久变量将需要某种原子更新,以便在发生电源故障时,恢复程序可以将程序的数据清理到一致的状态。

例如,如果我将一个节点插入到具有持久内存支持程序的链表的开头,我将不得不执行以下操作:

  1. 使用其中的新数据创建新节点
  2. 将“next”指针链接到链表的当前头
  3. 然后更新头指针以指向新节点。

每个步骤都必须使用 undo-log 或 redo-log 执行,以帮助恢复程序保持数据的一致状态。此外,每个步骤都必须通过冲洗和栅栏来坚持。

程序员想要确定哪些变量必须在故障中幸存下来,哪些不重要,以便它们不需要开销(“日志记录”和“刷新和围栏”)。这比听起来要困难得多,并且有很多关于它的研究和工具。

现在这是我的问题。假设我对持久性编程模型的理解是正确的,那么将所有易失性变量(例如循环计数器)视为持久性变量是否不正确?我知道这会导致大量开销,并被确定为“性能错误”。如果在任何情况下持久化 volatile 变量会影响恢复程序的正确性,我将不胜感激。

谢谢你。

标签: persistent-memory

解决方案


从持久内存分配易失性变量是完全正常的。通常,您希望从持久内存中分配对性能不敏感的易失性变量,以利用其更高的容量。与 DRAM 相比,性能开销主要来自持久内存的低延迟和带宽。不经常访问或具有高时间局部性的对象是持久内存的良好候选者。那些不常访问的可能对性能的影响很小或可以忽略不计。那些具有高时间局部性的很可能从缓存层次结构中访问,因此持久内存的性能在启动阶段之后是无关紧要的。

不过,您必须使用正确的 API。支持易失语义的持久内存编程模型将提供不同于用于持久语义的内存分配和释放 API。这个重要的区别是必需的,因为持久内存中的易失区域应该在应用程序终止时由系统自动回收。

如果持久内存硬件没有对加密的内置支持,则安全性可能是一个问题。恶意用户或应用程序可以访问“易失”状态。


推荐阅读