Unzerstörbares Gedächtnis, unzerstörbare Prozesse


Nachdem ich kürzlich gelesen hatte ( 1 , 2 , 3 ), mit welcher Schwierigkeit "Raum" -Prozessoren gegeben sind, fragte ich mich unwillkürlich, ob der "Preis" für stabiles Eisen so hoch ist, dass es sich vielleicht lohnt, einen Schritt zu machen und andererseits "Software" gegen spezielle Faktoren resistent zu machen? Aber keine Anwendungssoftware, sondern deren Ausführungsumgebung: Compiler, Betriebssystem. Ist es möglich, die Ausführung des Programms jederzeit zu unterbrechen, das System neu zu starten und an derselben (oder fast derselben) Stelle fortzufahren? Am Ende gibt es Winterschlaf .

Strahlungseffekte


Fast alles, was aus dem Weltraum fliegt, kann den Betrieb der Mikroschaltung stören. Es ist nur eine Frage der Energiemenge, die „sie“ mit sich gebracht hat. Selbst ein Photon kann, wenn es eine Gammastrahlenwellenlänge hat, mehrere Zentimeter Aluminium überwinden und die Atome ionisieren oder sogar einen nuklearen photoelektrischen Effekt verursachen . Ein Elektron kann kein dichtes Hindernis durchdringen, aber wenn es stärker beschleunigt wird, emittiert es beim Bremsen ein Gamma-Quantum mit allen daraus resultierenden Konsequenzen. Da die Halbwertszeit eines freien Neutrons etwa 10 Minuten beträgt, erreicht uns ein seltenes (und sehr schnelles) Neutron von der Sonne aus. Aber die Kerne von allem fliegen vorbei und sind auch in der Lage, Dinge zu tun. Die Neutrinos sind in so etwas vielleicht nicht zu sehen.

Wie kann man sich nicht an Ferkel mit ihm erinnern: "Es ist schwierig, mutig zu sein, wenn man nur ein sehr kleines Wesen ist."

Die Folgen der in einen Halbleiter eintretenden kosmischen Strahlung können unterschiedlich sein. Dies ist die Ionisierung von Atomen und die Verletzung des Kristallgitters und der Kernreaktionen. Dies ist in der Silizium - Dotierung mit thermischen Neutronen in einem Atomreaktor wird beschrieben , wenn Si (30) abwechselnd in P (31) und den gewünschten Halbleitereigenschaften erreicht werden. Es lohnt sich nicht, die erwähnten wunderbaren Artikel noch einmal zu erzählen. Wir werden nur Folgendes beachten:

  1. Einige Effekte wirken sich kurzfristig und langfristig nicht aus. Sie können zu Fehlern führen, die entweder durch Hardware oder Software behoben werden können. Im schlimmsten Fall hilft ein Neustart.
  2. , . - .
  3. .

Beachten Sie, dass Effekte der Typen 2 und 3, wenn sie gestoppt werden konnten, zu einer allmählichen Verschlechterung der Mikroschaltung führen. Wenn beispielsweise einer der (sogar 4) Addierer im superskalaren Prozessor "durchgebrannt" ist, können Sie (zumindest spekulativ nicht schwierig) die Stromversorgung des Opfers physisch deaktivieren und die verbleibenden drei verwenden. Äußerlich ist nur ein Leistungsabfall festzustellen. Wenn eines der internen Poolregister beschädigt ist, wird es möglicherweise als "immer beschäftigt" markiert und kann nicht an der Planung von Vorgängen teilnehmen. Die Speichereinheit ist möglicherweise nicht mehr verfügbar. ... Aber wenn sich etwas irreparables verschlechtert hat, müssen Sie die Kühlreserve erhöhen. Wenn er es ist.

„Ein Aufenthalt in einer Kühlreserve schützt den Mikrokreislauf übrigens nicht vor der Ansammlung der Dosis und sogar vor der Ansammlung von Ladung im Gate-Isolator. Darüber hinaus sind Mikroschaltungen bekannt, bei denen eine Dosisverschlechterung ohne Stromversorgung noch schlimmer ist als bei dieser. Alle Einzeleffekte, die zu schweren Ausfällen führen, erfordern jedoch die Einbeziehung des Chips. Bei ausgeschaltetem Gerät kann es zu Verzerrungseffekten kommen, die jedoch für die digitale Logik nicht wichtig sind. “ (Amartologie)

Somit gibt es zwei Faktoren

  • Es kann jederzeit ein Fehler auftreten, der durch einen Neustart behoben wird
  • Das System wird sich allmählich verschlechtern (Folge von Fehlern), der größte Teil der Arbeit wird unter Bedingungen einer teilweisen Verschlechterung ausgeführt

Wie lebst du mit all dem? Aufgrund von Vorbehalt / Verdreifachung mit Abstimmung in der gesamten Hierarchie der Funktionsblöcke. Das Verdreifachen ist an sich kein Allheilmittel, es ist notwendig zu verstehen, welches der Ergebnisse korrekt ist, wenn eine der Komponenten ausfällt. Dann kann die ausgefallene Komponente neu gestartet und mit zwei Arbeitern in Einklang gebracht werden. Im Falle eines Ausfalls, wenn das Bauteil nicht in einen funktionsfähigen Zustand gebracht werden kann, hilft jedoch nur eine eventuell vorhandene Kühlreserve.

Auch wenn der Fehler nicht kritisch erscheint, kann er schwerwiegende Probleme verursachen. Angenommen, wir haben drei synchron arbeitende Computer, in einem von ihnen (hypothetisch, oben erwähnt) ist einer der Addierer ausgefallen. Dies ist aus Sicht eines Computers, der betriebsbereit geblieben ist, kein Problem, aber seitdem ein Problem für das gesamte System Der betroffene Computer wird systematisch spät dran sein und es werden ernsthafte Anstrengungen für die Gesamtsynchronisation erforderlich sein.

Ein anderes Beispiel, ein Speicherfehler, aufgrund dessen ein Teil seines Bereichs (sogar eine Seite) unbrauchbar geworden ist, ist aus Sicht eines einzelnen Computers nicht kritisch. Nach der Diagnose kann das Betriebssystem dieses Problem lösen, ohne diesen Bereich zu verwenden. Aus Sicht des Trojanersystems ist dies jedoch eine Katastrophe. Wenn nun ein Fehler auftritt (der durch einen Neustart behoben wird), müssen wir den ausgefallenen Computer in einen Zustand versetzen, der mit einem der verbleibenden identisch ist. Dies ist jedoch unmöglich, da Auf anderen Computern funktioniert dieser Bereich und wird wahrscheinlich verwendet. Grundsätzlich ist es möglich, diesen Bereich auf allen drei Computern zu verbieten. Es ist jedoch nicht offensichtlich, dass dies möglich ist, ohne alle Computer der Reihe nach neu zu starten.

Es ist eine paradoxe Situation, wenn ein System, das auf der oberen Ebene trojanisiert wird, weniger zuverlässig ist als ein einzelner Computer, der sich an eine allmähliche Verschlechterung anpassen kann.

Erwähnenswert ist der als Lock-Step bezeichnete Ansatz , bei dem zwei Kerne dieselbe Aufgabe mit einer Verschiebung von einem oder zwei Taktzyklen ausführen und anschließend die Ergebnisse verglichen werden. Wenn sie nicht gleich sind, wird ein Teil des Codes erneut ausgeführt. Dies funktioniert nicht, wenn ein Fehler im Speicher oder im allgemeinen Cache vorliegt. Es verfügt jedoch über einen eigenen Schutz.

Es gibt auch einen Ansatz, bei dem der Compiler die Ausführung eines Teils der Befehle wiederholt und die Ergebnisse vergleicht. Solch eine weiche Version von Lock-Step.

Beide Ansätze (dankeAmartologieper tip) - ein Versuch, einen Fehler zu erkennen und mit "wenig Blut" zu beheben, ohne neu zu starten. Wir werden eher die Situation berücksichtigen, in der ein schwerwiegender oder unkritischer Fehler auftritt und ein Neustart unvermeidlich ist. So stellen Sie sicher, dass das Programm ohne besondere Anstrengungen jederzeit unterbrochen werden kann, und fahren Sie dann ohne ernsthafte Verluste fort.

Ein weiteres Thema ist das Erlernen der Anpassung von Hardware und Betriebssystem an die allmähliche Verschlechterung.

Was, wenn


Die Idee eines stabilen / beständigen Gedächtnisses ist an sich nicht neu, so der angesehene Dmitry Zavalishin (Dzavalishin) schlug sein Konzept des persistenten Gedächtnisses vor . In seinen Händen entstand ein ganzes beständiges Phantom-Betriebssystem , eigentlich eine virtuelle Maschine mit entsprechendem Overhead.

Vielleicht werden MRAM- oder FRAM- Technologien im Laufe der Zeit reifen ... während sie roh sind.

Es gibt auch eine Legende über den Bordcomputer der R-36M- Rakete (15L579?), Die unmittelbar nach einer nuklearen Explosion durch eine radioaktive Wolke starten konnte. Angewandtes Gedächtnis auf Ferritkernen ist strahlungsunempfindlich. Der Aufzeichnungszyklus eines solchen Speichers liegt in der Größenordnung von Einheiten von MikrosekundenWährend der Zeit, in der die Rakete einige Dezimeter fliegt, gab es eine physische Gelegenheit, den Kontext des Prozessors beizubehalten - den Inhalt von Registern und Flags. Der Prozessor wachte in einer sicheren Umgebung auf und arbeitete weiter.
Klingt glaubwürdig.

Es gibt einige Buts:

  1. Der Winterschlaf in seiner jetzigen Form ist nicht geeignet. Es braucht etwas Mühe und Zeit. Wir versuchen uns vor einem plötzlichen Versagen zu schützen. Es ist nicht offensichtlich, dass der Prozessor nach diesem Fehler physisch in der Lage ist, zumindest etwas zu tun. In ähnlicher Weise erhält das System in 15L579 eine Warnung, bevor die Probleme beginnen, und hat Zeit, sich vor ihnen zu schützen.
  2. “” — , , — . , () , .
  3. , , . — -.

Im Allgemeinen ist die Wiederherstellung nach einem Absturz im Wesentlichen ein Gegenstück zur Ausnahmebehandlung. Tatsächlich beginnt der Fehler selbst in den meisten Fällen als Hardware-Interrupt. Der Unterschied besteht darin, dass wir nach der Ausnahme einfach weiterarbeiten können. In diesem Fall müssen wir zuerst den Arbeitskontext wiederherstellen - den Speicher und den Status des Kernels des Betriebssystems. Aber der letzte Teil sieht genauso aus.

Zunächst, wie es von der Seite des Anwendungsprogrammierers aussehen sollte.

Ein Blick von außerhalb des Betriebssystemkerns


Da die Wiederherstellung nach Fehlern der Wiederherstellung nach dem Auslösen einer Ausnahme ähnlich ist, kann die Arbeit damit ähnlich aussehen. In C ++ erben wir beispielsweise die Klasse std :: enorm_error von std :: exception, fangen sie in einem regulären try / catch-Block ab und organisieren die Verarbeitung.

Der Autor mag jedoch die Semantik von setjmp / longjmp (SJLJ) mehr, weil:

  • Dies ist kurz und bündig. Rufen Sie einfach das analoge setjmp (& buf) auf und setzen Sie die Arbeit an derselben Stelle fort
  • Es ist sogar kein "& buf" erforderlich, sondern nur eine Systemfunktion, die den aktuellen Status speichert
  • Neben C ++ gibt es noch andere großartige Sprachen, nicht überall, wo Ausnahmen behandelt werden, sondern überall, wo Systemfunktionen aufgerufen werden
  • und es besteht keine Notwendigkeit, die Sprache zu ändern, da wir ursprünglich so invasiv wie möglich handeln wollten

Zu einer Zeit verlor SJLJ bei der Ausnahmebehandlung aufgrund der schlechteren Leistung gegen die DWARF- Technik (genau genommen ist Zwerg nur ein Informationsaufzeichnungsformat). Die Leistung ist hier nicht so wichtig. In jedem Fall wird die Aufrechterhaltung des Staates nicht billig sein, man muss verantwortungsbewusst vorgehen.

Ein Blick aus dem OS-Kernel


Was muss gespeichert werden, woraus besteht der Kontext der Prozessausführung?

  1. Für jeden Thread im Benutzermodus - das aktuelle "jmp_buf" mit den erforderlichen Registern - bedeutet dies, dass das Betriebssystem alle Threads des aufrufenden Prozesses stoppen muss, bevor die Daten gespeichert werden
  2. , — . (: ), (ex: ).
  3. . (ex: ), (ex: TCP ). .
  4. , . ,
  5. . , . , — . .. .

    , , . .
  6. , .

Informationen sind für die Transcodierung vom virtuellen Speicher in den physischen und umgekehrt nicht erforderlich. Beim Neustart werden diese Informationen möglicherweise auf andere Weise von selbst neu erstellt.

Wie für die Arbeit mit dem Dateisystem. Unter den Dateisystemen gibt es Transaktionssysteme. Wenn die Anwendung ein genaues Transaktionsverhalten erfordert, sollte die Beibehaltung des Prozesskontexts mit der Bestätigung der Dateisystemtransaktion synchronisiert werden. Andererseits ist es zum Beispiel für die Aufzeichnung von Textprotokollen logisch, ein reguläres Dateisystem zu verwenden. Die Transaktionsfähigkeit wäre hier seltsam.

Von alledem werden die größten Fragen durch die Erhaltung des Erinnerungsinhalts verursacht, wobei das Volumen von allem anderen im Vergleich dazu unbedeutend ist.
Zum Beispiel LaufzeitDie Bibliothek puffert Speicherzuordnungen, fordert sie in relativ großen Blöcken vom System ab und verteilt sich selbst. Daher ist das Erstellen / Löschen von Segmenten relativ selten.

Programme arbeiten jedoch kontinuierlich mit dem Speicher. Im Wesentlichen ist es das Speichersubsystem, das normalerweise den Engpass bei den Berechnungen darstellt. Und alles, was unser Leben vereinfachen kann, ist die Hardwareunterstützung für Flags geänderter Seiten. Es wird erwartet, dass zwischen dem Speichern des Status nicht zu viele geänderte Seiten angezeigt werden.

Auf dieser Grundlage werden wir uns in Zukunft mit dem Inhalt des Gedächtnisses befassen.

Speichern des Speicherinhalts


Das gewünschte Verhalten liegt in der Nähe von Datenbanken - das DBMS kann jederzeit „fallen“, die geleistete Arbeit wird jedoch bis zum letzten Festschreiben fortgesetzt. Dies wird erreicht, indem ein Transaktionsprotokoll geführt wird, in dem festgeschrieben wird, in welche Festschreibungsdatensätze alle an der Transaktion vorgenommenen Änderungen legalisiert werden.

Da der Begriff " Transaktionsgedächtnis " jedoch beschäftigt ist, werden wir ein anderes einführen - "unzerstörbares Gedächtnis".

Nebenbei sehen Sie zwei Methoden, mit denen dieser unzerstörbare Speicher implementiert werden kann.

Option eins , nennen wir es "unprätentiös".
Die Hauptidee ist, dass alle in einer Transaktion geänderten Daten im RAM abgelegt werden sollten. Jene. Während des Betriebs speichert der Auslagerungsmechanismus nichts auf der Festplatte, aber während des Festschreibens werden alle geänderten Seiten in der Auslagerungsdatei gespeichert.

Informationen zu den ausgewählten Segmenten und deren Verbindung mit dem Ort in der Auslagerungsdatei werden in das Protokoll geschrieben. Während des Betriebs werden diese Informationen während des Festschreibens gesammelt und aufgezeichnet. Beim Neustart kann das System Segmente neu erstellen. Der Swap-Mechanismus kann sie hochziehen und das unterbrochene Programm empfängt seine Daten auf magische Weise.

In diesem Modus ist es jedoch beispielsweise unmöglich, ein Calloc -Array zuzuweisen , das größer als der verfügbare Speicher ist ( Mallocth ist übrigens möglich). Dies wäre jedoch auf keinen Fall eine sehr gute Idee.

Selbst wenn ein solches Regime nur für Prozesse gilt, die sich als "unzerstörbar" deklariert haben, kann die von den aktuellen Transaktionen aller dieser Prozesse belegte Speichermenge die physisch verfügbare Menge nicht überschreiten. Der Auslagerungsmechanismus stoppt tatsächlich das Auslagern und wird zu einem Mechanismus zum Speichern der letzten Transaktionen.

All dies erlegt Anwendungsentwicklern eine gewisse Disziplin auf, kann zu einer ungleichmäßigen Belastung der Festplatte führen. Im Allgemeinen ist dies nicht ganz das, was wir wollten, aber es kann in eingebetteten Systemen funktionieren.

Ein wesentlicher Nachteil dieser Option besteht darin, dass ein schwerwiegender Fehler während des Festschreibens, wenn nur ein Teil der Seiten geschrieben wurde, den entsprechenden Prozess in einen instabilen Zustand führt, nach dem er gestoppt werden muss.
Es stellt sich eine Art Unverletzlichkeit von 50% heraus.

Option 2 , „Schatten“
Um als Transaktionsmanager zu fungieren, müssen Sie ein Transaktionsmanager sein.

Definieren wir Entitäten:

  1. Die Auslagerungsdatei enthält Datenseiten, sodass die Größe ein Vielfaches der Seitengröße beträgt. Wir sagen die Datei, wir meinen eher den Abschnitt, weil Eine feste Größe verbessert die Systemstabilität.
  2. Paging- Dateiseitenzuordnung. Es ist notwendig, eine Seite nicht nur für Benutzerdaten auszuwählen, sondern beispielsweise auch den Status des Allokators selbst aufzuzeichnen. Sowie alles, was oben erwähnt wurde.
  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.


Es ist schade, dass es keine Speichergeräte gibt, die unter Weltraumbedingungen vollständig gegen Langzeitbetrieb beständig sind. Ferritkerne waren strahlungsbeständig, hatten jedoch aufgrund der großen Anzahl von Lötstellen ihre eigenen spezifischen Probleme. Plus niedrige Kapazität, niedrige Geschwindigkeit und hohe Komplexität der Herstellung.

Trotzdem müssen Sie diese Daten zuverlässig schreiben und lesen können.

Ein offensichtlicher Kandidat ist der Flash-Speicher. Da Flash anfangs aufgrund der geringen Anzahl gültiger Schreibzyklen nicht sehr zuverlässig war, wurden spezielle Methoden entwickelt, um damit zu arbeiten .

Es wurde bereits erwähnt, dass Tripling verwendet wird, um mit unzuverlässigen Elementen zu arbeiten. RAID1 reicht hier ausda Wenn die Aufzeichnung aufgrund der Kontrollwerte fehlschlägt, ist bekannt, welche der beiden Seiten falsch geschrieben wurde und überschrieben werden muss.

Gesamt


Nun haben wir alle vier Buchstaben des Wortes ACID in unseren Händen .

A - Atomizität, erreichte
C - Konsistenz,
I - Isolation ist offensichtlich , wird natürlich erreicht. Wenn Sie den Fall des gemeinsam genutzten Speichers nicht berücksichtigen. Und im Moment denken wir nicht darüber nach.

D - Persistenz, das einzige Mal, dass wir versucht haben zu betrügen, als wir den Prozess nach einem Commit freigegeben haben, ohne auf die physische Aufzeichnung aller Daten in seinem Speicher auf der Festplatte zu warten. Im schlimmsten Fall führt dies zu einem Rollback auf die vorherige Transaktion. Es ist unklar, wie wichtig dies sowohl für die Leistung als auch für die Haltbarkeit ist.

PS. Nur eine schnelle Anmerkung. Wir haben keinen Mechanismus für Rollback-Transaktionen, Rollback kann nur ein schwerwiegender Fehler sein. Technisch (so scheint es) ist es einfach, ein Transaktions-Rollback-Programm als Analogon zu longjmp zu implementieren. Aber dies ist seitdem eine viel fortgeschrittenere Version von longjmp stellt den internen Status des Prozesses zum Zeitpunkt von "setjmp" vollständig wieder her, um Speicherlecks zu vermeiden, und ermöglicht den Übergang nicht nur von unten nach oben ...

PPS . Möglicherweise kann der OpenLink Virtouso DBMS-Server , der auch als freie Software verfügbar ist, als Prototyp des Transaktionsmanagers angesehen werden .

PPPS . Vielen Dank an Valery Shunkov (Amartologie) und Anton Bondarev (abondarev) für eine aussagekräftige und sehr nützliche Diskussion.

PPPPS . Illustration von Anna Rusakova .

All Articles