坚不可摧的内存,坚不可摧的进程


看了最近(123)与被赋予什么困难“空间”的处理器,我不由自主地想,如果“价格”为稳定的铁是如此之高,也许这是值得考虑一步,而另一方面,制作“软件”特殊因素具有抗性?但不是应用程序软件,而是它的执行环境:编译器,OS。是否有可能在任何时候使程序的执行中断,重启系统并从相同(或几乎相同)的位置继续运行。最后,进入休眠状态

辐射效应


几乎所有从太空飞来的东西都能够破坏微电路的运行,这仅仅是“它”带来的能量的问题。即使光子具有伽玛射线的波长,它也可以克服几厘米的铝并使离子电离,甚至引起核光电效应。电子无法穿透任何密集的障碍物,但是如果电子加速得更厉害,则在制动时它将发出伽马量子,并随之而来。鉴于自由中子的半衰期约为10分钟,因此稀有(非常快)的中子会从太阳到达我们。但是,任何事物的原子核都会飞过并且也有能力做事。中微子可能不会以这种方式出现。

怎么不记得小猪和他在一起:“当你很小的时候,很难勇敢。”

宇宙辐射进入半导体的后果可能不同。这是原子的电离,违反了晶格和核反应。在此描述了当Si(30)转变为P(31)并实现所需的半导体性能时,原子反应堆中用中子掺杂的硅值得一提的是,我们不应该重复提及以下精彩文章,

  1. 有些影响具有短期影响,而没有长期影响。它们可能导致可以通过硬件或软件修复的错误。在最坏的情况下,重新启动会有所帮助。
  2. , . - .
  3. .

请注意,如果类型2和类型3的影响能够被阻止,则会导致微电路逐渐退化。例如,如果在超标量处理器中“烧毁”了(甚至4个)加法器之一,则您可以(至少在推测上并不困难)物理上禁用伤者的电源,而使用其余三个加法器,那么向外的性能只会明显下降。同样,如果内部池寄存器之一被损坏,则可能被标记为“总是忙”,并且将无法参与操作计划。内存单元可能不可用。 ……但是,如果某种无法弥补的事情恶化了,您将不得不提高冷藏储备。如果他是。

“顺便说一句,保持冷储备并不能保护微电路免受剂量累积的影响,甚至无法保护栅极绝缘体中电荷的累积。此外,已知微电路,其中在没有电源的情况下剂量降低甚至比在没有电源的情况下更严重。但是所有导致硬故障的单一影响都需要包括芯片。关闭电源后,可能会有偏置效应,但它们对数字逻辑并不重要。” 非理智学

因此,有两个因素

  • 在任何时候都可能会发生故障,可以通过重新启动来解决
  • 系统将逐渐退化(故障序列),大部分工作将在部分退化的条件下发生

您如何度过这一切?由于在整个功能块的层次结构中都具有保留/投票三倍的功能。三联本身并不是万能的灵丹妙药,有必要了解其中一个组件发生故障时哪个结果正确。然后,可以重新启动发生故障的组件,并使其与两名工人一起工作。但是在发生故障的情况下,当无法使组件处于工作状态时,只有冷储备(如果有)会有所帮助。

即使故障看起来并不严重,也可能导致严重的问题。假设我们有三台同步工作的计算机,其中一台(假设是上面提到的)加法器之一发生故障。从一直保持运行状态的计算机的角度来看,这不是问题,但是对于整个系统来说,这是一个问题。受影响的计算机将开始系统性地延迟,并且将需要进行认真的工作才能进行总体同步。

另一个例子,从单台计算机的角度来看,导致某个范围(甚至一页)变得不可用的内存故障并不是至关重要的。诊断后,操作系统无需使用该范围即可解决此问题。但是从特洛伊木马系统的角度来看,这是一场灾难。现在,如果出现故障(通过重新启动可以解决),我们将需要使故障计算机进入与其余任何计算机相同的状态,但这是不可能的,因为在其他计算机上,此范围有效并且可能已使用。原则上,可以在所有三台计算机上禁止此范围,但是,不依次启动所有计算机就可以做到这一点并不明显。

当上层木马程序的系统与可以适应逐步降级的单台计算机相比,可靠性较低时,这是一个自相矛盾的情况。

值得一提的是称为Lock-step的方法,当两个内核以一个或两个时钟周期的偏移执行同一任务时,然后比较结果。如果它们不相等,则将重新执行某些代码。如果内存或常规缓存中有错误,则此方法不起作用,但是它具有自己的保护。

还有一种方法,使编译器重复执行部分命令并比较结果。锁步的这种软版本。

这两种方法(感谢非理智学每个提示)-尝试检测故障并尝试用“少量鲜血”修复它,而无需重新启动。我们将更可能考虑出现严重故障或非严重故障而不可避免地需要重新启动的情况。如何确保无需付出任何特殊努力的程序就可以随时中断,然后继续进行而不会造成重大损失。

如何教硬件和操作系统以适应逐渐退化是另一个讨论的主题。

如果


稳定/持久记忆的概念本身并不新鲜,因此备受尊敬的Dmitry Zavalishin(扎伐林新提出了他的持久记忆的概念。在他手中,这产生了一个完整的持久化Phantom OS,实际上是一个具有相应开销的虚拟机。

也许,随着时间的流逝,MRAMFRAM技术将逐渐成熟……尽管它们还很原始。

关于R-36M火箭(15L579?)的机载计算机,还有一个传说,它在近距离核爆炸后能够通过放射性云发射。在铁氧体磁芯上施加的记忆不受辐射的影响。这种存储器的记录周期约为微秒单位。,因此在火箭飞行几分米的时间内,有一个物理上的机会来维护处理器的上下文-寄存器和标志的内容。在安全的环境中醒来后,处理器继续工作。
听起来很可信。

有一些缺点:

  1. 目前的休眠方式不适合。这需要一些努力和时间。我们正在努力保护自己免受突然失败的影响。在此故障之后,处理器在物理上至少能够执行某些操作并不明显。同样,在15L579中,系统在故障开始之前会收到警告,并有时间进行防范。
  2. “” — , , — . , () , .
  3. , , . — -.

通常,崩溃恢复本质上是与异常处理相对应的。实际上,故障本身在大多数情况下是从硬件中断开始的。区别在于,异常之后,我们可以继续工作,在这种情况下,我们首先需要还原工作上下文-操作系统内核的内存和状态。但是最后一部分看起来是一样的。

首先,它应该从应用程序程序员的角度看。

操作系统内核之外的外观


由于从故障中恢复类似于从引发异常中恢复,因此使用它看起来可能类似。例如,在C ++中,我们从std :: exception继承std :: greater_error类,将其捕获在常规try / catch块中并组织处理。

但是,作者更喜欢setjmp / longjmp(SJLJ)的语义,因为:

  • 这很简洁,只需调用模拟setjmp(&buf)并从同一位置恢复工作
  • 甚至不需要“&buf”,只需调用存储当前状态的系统函数
  • 除了C ++外,还有其他很棒的语言,不是到处都有异常处理,但是到处都有对系统函数的调用
  • 无需修改语言,因为我们原本打算尽可能采取侵入性的行动

一次,SJLJ 由于性能较差而在异常处理中迷失DWARF技术(严格来说,矮级只是记录信息的一种格式),性能在这里并不是很重要。在任何情况下,维持国家都不是一件容易的事;必须以负责任的态度来对待它。

操作系统内核内部的外观


需要保存什么,流程执行的上下文由什么组成?

  1. 对于处于用户模式的每个线程-具有必要寄存器的当前“ jmp_buf”,这意味着OS必须在保存数据之前停止调用进程的所有线程
  2. , — . (: ), (ex: ).
  3. . (ex: ), (ex: TCP ). .
  4. , . ,
  5. . , . , — . .. .

    , , . .
  6. , .

从虚拟内存到物理代码的转换不需要信息,反之亦然;重新启动后,该信息将由自己重新创建,可能以其他方式重新创建。

至于使用文件系统。在文件系统中,有事务系统。如果应用程序需要精确的事务行为,则应将流程上下文的保存与文件系统事务的确认同步。另一方面,例如,对于记录文本日志,使用常规文件系统是合乎逻辑的,这里的事务性很奇怪。

在上述所有问题中,最大的问题是由内存内容的保存引起的;与之相比,其他所有内容的数量都微不足道。
例如,运行时该库缓冲内存分配,以较大的块从系统中请求它们,然后自行分发。因此,创建/删除段相对较少。

但是程序与内存连续工作,从本质上讲,内存子系统通常是计算的瓶颈。而所有可以简化我们生活的就是对已修改页面的标志的硬件支持。预计在状态保存之间,不会出现太多修改的页面。

基于此,将来我们将处理内存的内容。

保存内存内容


所需的行为接近数据库-DBMS可以随时“下降”,但是所做的工作将一直持续到最后一次提交为止。这是通过维护事务日志来实现的,提交记录将使对该事务所做的所有更改合法化,该日志将进入该日志。

但是,由于“ 事务性内存 ”一词很忙,因此我们将引入另一个“不可破坏的内存”。

从旁可以看到实现这种不可破坏的内存的两种方法:方法

,我们称其为“朴实无华”。
主要思想是,事务中所有更改的数据都应放在RAM中。那些。在操作期间,交换机制不会将任何内容保存到磁盘,但是在提交期间,所有更改的页面都将保存到交换文件中。

有关所选段及其与交换文件中位置的关系的信息将写入日志。在操作期间,此信息将在提交期间进行累积和记录。重新启动时,系统可以重新创建段。交换机制将能够拉起它们,被中断的程序将神奇地接收其数据。

但是,在这种模式下,例如,不可能分配大于可用内存callocth数组(顺便说一下,mallocth是可能的)。但是,无论如何这都不是一个好主意。

即使这样的机制仅适用于声明自己是“不可破坏的”进程,所有这些进程的当前事务所占用的内存量也不能超过物理可用空间。交换机制实际上停止了交换,而变成了用于存储最近交易的机制。

所有这些都对应用程序开发人员施加了一定的约束,可能导致磁盘上的负载不均衡,通常这并不是我们想要的,但是它可以在嵌入式系统中工作。

此选项的主要缺点是,在提交过程中发生致命错误(仅写入部分页面),导致相应进程进入不稳定状态,此后必须将其停止。
事实证明某种形式的50%不可侵犯性。

选项二,“影子”
要充当事务管理器,您需要成为事务管理器。

让我们定义实体:

  1. 页面文件包含数据页面,因此大小是页面大小的倍数。我们说文件,我们指的是该部分,因为 固定大小可提高系统稳定性。
  2. 分页文件页面分配器必须选择一个页面,不仅用于用户数据,而且还必须例如记录记录分配器本身的状态。以及上面提到的所有内容。
  3. . , . , ,
    (= , ).
  4. . —
    • ID
    • ( )
    • ID .

    - TLB, .. .

    ( ) . . , ex: (Buddy Allocator) .

    , . .
  5. . COW (copy on write) . , . COW, - , . .

    — - , “dirty”. .
  6. (). .

    : , .

    . , . . , , . . , ? , .

    , .

    (= , , , ).


    (=, ). .

    . , . , , , .

    , . , . .

    — . , , , , .
    , , .

    .
  7. . , , — . , ?

    — . , . , . , .. .

    — , SSD ! , SSD ( “” ) .

    , .

    — . , . , . ( ).

    , , , . , , . , , , . , — . .
  8. Checkpoint.

    , , , , . — . , . checkpoint. .

    . . - checkpoint- . .

    , . - .

    checkpoint-. , / .

    -, - /, . , ( ...). .

    . . . , . — , checkpoint.


遗憾的是,没有在空间条件下能够完全抵抗长期运行的存储设备。铁氧体磁芯具有抗辐射性,但由于焊接接头数量众多,它们也有其自身的特殊问题。加上低容量,低速度和高制造复杂性。

但是,您必须能够可靠地写入和读取该数据。

一个明显的候选人是闪存。最初,由于有效写入周期的数量较少,Flash并不是很可靠,因此开发了特殊的方法来使用它

前面提到过,三重用于处理不可靠的元素,这里使用RAID1就足够了因为 如果由于控制值而导致记录失败,则可以知道两页中的哪一页被错误地写入,因此必须将其覆盖。


好吧,现在我们手上有了ACID一词的所有四个字母自然实现

A-原子性,
C-一致性,
I-隔离性。如果不考虑共享内存的情况。目前,我们尚未考虑。

D-持久性,这是我们在提交后释放进程而没有等待将其内存中的所有数据物理记录到磁盘的唯一尝试作弊的时间。在最坏的情况下,这将导致回滚到先前的事务。目前尚不清楚这对性能和耐用性有多重要。

聚苯乙烯只是一个简短的说明。我们没有回滚事务处理机制,回滚只能是一个致命错误。从技术上(似乎),很容易实现事务回滚程序,就像longjmp一样。但这是longjmp的高级版本,因为 完全恢复“ setjmp”时进程的内部状态,避免内存泄漏,不仅允许从下至上的过渡...

PPS也许可以将OpenLink Virtouso DBMS服务器(也可以作为免费软件获得)视为事务管理器的原型

PPPS感谢Valery Shunkov(非理智学)和Anton Bondarev(阿邦达列夫)进行有意义且非常有用的讨论。

PPPPS安娜·鲁萨科娃Anna Rusakova)的插图

All Articles