【问题标题】:Distinguishing volatile vs persistent variable, does it affect correctness?区分易失性和持久性变量,它会影响正确性吗?
【发布时间】:2020-05-11 09:59:24
【问题描述】:

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

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

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

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

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

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

谢谢。

【问题讨论】:

    标签: persistent-memory


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多