【问题标题】:Is there a way to have a block of code executed atomically? (language does not matter)有没有办法让代码块原子地执行? (语言不重要)
【发布时间】:2017-08-01 03:51:17
【问题描述】:

我正在阅读一些关于分布式系统的论文。作者声称能够以原子方式执行一系列操作(所有操作都成功执行或不执行,即使发生系统故障)。我想知道它是如何实现的。提前致谢!

【问题讨论】:

  • 从我的回答和 madscientist159 的回答的差异可以看出,这是一个相当广泛的问题。您是专门研究分布式系统中的原子性,还是只关注一般的原子性?
  • 您是否介意至少引用源论文,以便将您问题的完整背景引入?

标签: atomic distributed-system fault-tolerance


【解决方案1】:

这一直都在做,虽然关键(也可能是这里的混淆)是指令在中断时部分执行,但数据的原始状态仍然是已知的,并且可以在检测时自动恢复的系统故障。对于众所周知的示例,只需查看数据库和日志文件系统即可。

简而言之,可以确保所有操作都存储在一个临时缓冲区中,该缓冲区可以以真正原子的方式合并到永久存储中。例如,可以使用临时缓冲区以原子方式编辑文件以存储更改,然后在文件系统级别使用原子移动将这些更改提交到原始文件。如果编辑过程中断,原始文件保持不变。

一旦理解了所涉及的基本概念,剩下的就变成了简单的实现,因为您将层次结构向下移动到硬件本身。现代 CPU 提供特定指令,以保证硬件级别本身的原子性;这些用于通过信号量和日志等机制在更高级别“引导”原子性。

【讨论】:

  • 恕我直言,您是否有任何公认的计算机科学论文引用支持提议的术语交换 - 仅指向一个交易 { 提交 | rollback } 终端状态 一致性 概念,而不是 执行的原子性,它是 O/P 的主题?感谢您向我们指出相关来源。
  • OP 不太清楚他们具体要寻找什么。我做了一个(并非不合理的)假设,即最终数据状态很重要,因为即使在发生故障的情况下,任何系统都需要部分执行指令(作为甚至能够发生故障的先决条件中间处理)。如果 OP 澄清这不是我想要的,我将删除答案。
  • 还有另一种原子性——即保证相互不干预的机制——任何和所有计算都以相同的方式反映“之前”的状态+它们不不干预(修改)任何变量/状态“在”它们的协同处理过程中,不管排序/调度限制。这是更难的部分。
【解决方案2】:

绝对可以以原子方式执行一段代码。

尝试查看semaphore,它通常被认为是原子性的“构建块”。本质上,当代码尝试运行时,它会尝试获取一个虚拟标志。如果它不能这样做,它会等待(或什么都不做,取决于实现)。因此,一个极其幼稚的实现看起来像这样(假设在任何给定时间可能有任意数量的 A 或 B 在运行):

int semaphore = 1;

void processA() {
  while (semaphore <= 0)
    ;
  semaphore--;

  //do something atomically

  semaphore++;
}

void processB() {
  while (semaphore <= 0)
    ;

  semaphore--;

  //do something atomically

  semaphore++;
}

正如我所提到的,这是一个非常幼稚的实现——看看你是否能看到这里描述的内容可能会失败。提示:考虑每个操作实际需要多少步。比如A = B + C其实就是4步:读B,读C,加B和C,存入A。

【讨论】:

    【解决方案3】:

    主要解决方案:

    无需等待任何更广泛的背景,我的实现赌注将直接在主要 (M + N) 故障安全基础设施中使用 FPGA-s,从而系统地避免故障中的任何单点故障- 容错系统周界。

    就我的经验而言,很难以比使用这种架构方法更便宜的方式实现代码块范围的原子性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-28
      • 1970-01-01
      • 2021-05-07
      • 2022-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多