Mémoire indestructible, processus indestructibles


Après avoir lu récemment ( 1 , 2 , 3 ) avec quelle difficulté les processeurs «spatiaux» sont donnés, je me suis involontairement demandé si le «prix» du fer stable est si élevé, peut-être qu'il vaut la peine de faire un pas et, d'autre part, de rendre le «logiciel» résistant à des facteurs spéciaux? Mais pas les logiciels d'application, mais plutôt son environnement d'exécution: compilateur, OS. Est-il possible de rendre l'exécution du programme à tout moment possible pour interrompre, redémarrer le système et continuer depuis le même (ou presque le même) endroit. En fin de compte, il y a hibernation .

Effets des radiations


Presque tout ce qui vole de l'espace est capable de perturber le fonctionnement du microcircuit, il ne s'agit que de la quantité d'énergie qu'il «emporte» avec lui. Même un photon, s'il a une longueur d'onde de rayons gamma, est capable de dépasser plusieurs centimètres d'aluminium et d'ioniser le ou les atomes ou même de provoquer un effet photoélectrique nucléaire . Un électron ne peut pas pénétrer à travers un obstacle dense, mais s'il est accéléré plus fortement, il émettra un quantum gamma lors du freinage avec toutes les conséquences qui en découlent. Étant donné que la demi-vie d'un neutron libre est d'environ 10 minutes, un neutron rare (et très rapide) nous parvient du Soleil. Mais les noyaux de n'importe quoi passent et sont également capables de faire des choses. Les neutrinos ne sont peut-être pas vus dans quelque chose comme ça.

Comment ne pas se souvenir de Piglet avec lui: "il est difficile d'être courageux quand on n'est qu'un tout petit être".

Les conséquences du rayonnement cosmique pénétrant dans un semi-conducteur peuvent être différentes. Il s'agit de l'ionisation des atomes et de la violation du réseau cristallin et des réactions nucléaires. Ici , le dopage au silicium avec des neutrons thermiques dans un réacteur atomique est décrit , lorsque Si (30) se transforme en P (31), et les propriétés semi-conductrices souhaitées sont atteintes. Il ne vaut pas la peine de raconter à nouveau les merveilleux articles mentionnés, nous ne noterons que les éléments suivants -

  1. Certains effets ont un effet à court terme et n'ont pas d'effets à long terme. Ils peuvent conduire à des erreurs qui peuvent être corrigées, soit matérielles soit logicielles. Dans le pire des cas, un redémarrage aide.
  2. , . - .
  3. .

A noter que les effets des types 2 et 3, s'ils ont pu être stoppés, conduisent à une dégradation progressive du microcircuit. Par exemple, si l' un des (même 4) additionneurs "grillé" dans le processeur superscalaire , vous pouvez (au moins pas spéculativement difficile) désactiver physiquement l'alimentation de la victime et utiliser les trois autres, extérieurement, seule une baisse des performances sera perceptible. De même, si l'un des registres du pool interne est endommagé, il peut être marqué comme «toujours occupé» et ne pourra pas participer à la planification des opérations. L'unité mémoire peut devenir indisponible. ... Mais si quelque chose d'irréparable s'est détérioré, vous devrez augmenter la réserve de froid. S'il l'est.

«Rester dans une réserve de froid, au fait, ne protège pas le microcircuit de l'accumulation de la dose, et même de l'accumulation de charge dans l'isolateur de grille. De plus, des microcircuits sont connus dans lesquels la dégradation de la dose sans alimentation est encore pire qu'avec elle. Mais tous les effets uniques qui provoquent des pannes graves nécessitent l'inclusion de la puce. Avec la mise hors tension, il peut y avoir des effets de biais, mais ils ne sont pas importants pour la logique numérique. » (amartologie)

Ainsi, il existe deux facteurs

  • à tout moment, une défaillance peut survenir, qui est traitée par un redémarrage
  • le système se dégradera progressivement (séquence de pannes), l'essentiel du travail se fera dans des conditions de dégradation partielle

Comment vivez-vous avec tout cela? En raison de la réservation / du triplement avec vote dans toute la hiérarchie des blocs fonctionnels. En soi, le triplement n'est pas une panacée, il est nécessaire pour comprendre lequel des résultats est correct lorsque l'un des composants tombe en panne. Ensuite, le composant défaillant peut être redémarré et aligné avec deux travailleurs. Mais en cas de défaillance, lorsque le composant ne peut pas être remis en état de fonctionnement, seule la réserve de froid, le cas échéant, sera utile.

Même si l'échec ne semble pas critique, il peut entraîner de graves problèmes. Supposons que nous ayons trois ordinateurs fonctionnant de manière synchrone, dans l'un d'eux (hypothétique, mentionné ci-dessus), l'un des additionneurs a échoué. Ce n'est pas un problème du point de vue d'un ordinateur qui est resté opérationnel, mais c'est un problème pour l'ensemble du système puisque l'ordinateur affecté commencera à être systématiquement en retard et des efforts sérieux seront nécessaires pour la synchronisation globale.

Autre exemple, une défaillance de la mémoire, à la suite de laquelle une partie de sa plage (même une page) est devenue inutilisable, n'est pas critique du point de vue d'un seul ordinateur. Après le diagnostic, le système d'exploitation est capable de faire face à ce problème sans utiliser cette plage. Mais du point de vue du système des chevaux de Troie, c'est un désastre. Maintenant, s'il y a un échec (qui est traité par le redémarrage), nous devrons amener l'ordinateur en panne à un état identique à l'un des autres, mais cela est impossible car sur d'autres ordinateurs, cette plage fonctionne et est probablement utilisée. En principe, il est possible d'interdire cette plage sur les trois ordinateurs, cependant, il n'est pas évident qu'il sera possible de le faire sans redémarrer tous les ordinateurs tour à tour.

C'est une situation paradoxale quand un système qui est troyen au niveau supérieur est moins fiable par rapport à un seul ordinateur qui peut s'adapter à une dégradation progressive.

Il convient de mentionner l'approche appelée Lock-step , lorsque deux cœurs effectuent la même tâche avec un décalage d'un ou deux cycles d'horloge, puis que les résultats sont comparés. S'ils ne sont pas égaux, un morceau de code est réexécuté. Cela ne fonctionne pas s'il y a une erreur dans la mémoire ou le cache général, cependant, il a sa propre protection.

Il existe également une approche où le compilateur répète l'exécution d'une partie des commandes et compare les résultats. Une telle version douce de Lock-step.

Ces deux approches (merciamartologiepar astuce) - une tentative pour détecter une panne et essayer de la réparer avec "peu de sang", sans redémarrer. Nous considérerons plus probablement la situation lorsqu'une défaillance grave ou non critique se produit et qu'un redémarrage est inévitable. Comment s'assurer que le programme sans aucun effort particulier de sa part puisse être interrompu à tout moment, puis se poursuivre sans pertes graves.

Comment enseigner au matériel et au système d'exploitation à s'adapter à la dégradation progressive est un sujet pour une autre discussion.

Et qu'est-ce qui se passerait si


L'idée d'une mémoire stable / persistante n'est pas nouvelle en soi, donc le respecté Dmitry Zavalishin (dzavalishin) a proposé son concept de mémoire persistante . Dans ses mains, cela a donné naissance à un système d'exploitation Phantom persistant , en fait une machine virtuelle avec des frais généraux correspondants.

Peut-être qu'avec le temps, les technologies MRAM ou FRAM arriveront à maturité ... alors qu'elles sont brutes.

Il y a aussi une légende sur l'ordinateur de bord de la fusée R-36M (15L579?), Qui a pu lancer à travers un nuage radioactif immédiatement après une explosion nucléaire proche. La mémoire appliquée sur les noyaux de ferrite est immunisée contre les radiations. Le cycle d'enregistrement d'une telle mémoire est de l'ordre des unités msec, donc pendant le temps que la fusée vole de quelques décimètres, il y avait une opportunité physique de maintenir le contexte du processeur - le contenu des registres et des drapeaux. Se réveillant dans un environnement sûr, le processeur a continué de fonctionner.
Cela semble crédible.

Il y a quelques mais:

  1. L'hibernation dans sa forme actuelle ne convient pas. Cela demande un certain effort et du temps. Nous essayons de nous protéger contre un échec soudain. Il n'est pas évident qu'après cet échec le processeur soit physiquement capable de faire au moins quelque chose. De même, dans 15L579, le système reçoit un avertissement avant que les problèmes ne commencent et a le temps de se protéger contre eux.
  2. “” — , , — . , () , .
  3. , , . — -.

En général, la récupération après incident est essentiellement une contrepartie à la gestion des exceptions. En fait, l'échec lui-même dans la plupart des cas commence comme une interruption matérielle. La différence est qu'après l'exception, nous pouvons simplement continuer à travailler, et dans ce cas, nous devons d'abord restaurer le contexte de travail - la mémoire et l'état du noyau du système d'exploitation. Mais la dernière partie est la même.

Tout d'abord, à quoi cela devrait ressembler du côté du programmeur d'application.

Un regard extérieur au noyau du système d'exploitation


Étant donné que la récupération après des échecs est similaire à la récupération après le lancement d'une exception, son utilisation peut sembler similaire. Par exemple, en C ++, nous héritons de la classe std :: tremendous_error de std :: exception, l'attrapons dans un bloc try / catch normal et organisons le traitement.

Cependant, l'auteur aime plus la sémantique de setjmp / longjmp (SJLJ) parce que:

  • c'est concis, il suffit d'appeler le setjmp analogique (& buf) et de reprendre le travail au même endroit
  • même aucun «& buf» n'est requis, il suffit d'appeler une fonction système qui stocke l'état actuel
  • en plus de C ++, il existe d'autres langages géniaux, pas partout où il y a une gestion des exceptions, mais partout où il y a un appel aux fonctions système
  • et il n'y a pas besoin de modifier la langue, car à l'origine nous allions agir aussi invasivement que possible

À un moment donné, SJLJ a perdu la technique DWARF (à proprement parler, le nain n'est qu'un format d'enregistrement d'informations) dans la gestion des exceptions en raison de performances médiocres, les performances ne sont pas si importantes ici. Dans tous les cas, le maintien de l'État ne sera pas bon marché, il faut l'approcher de manière responsable.

Un aperçu de l'intérieur du noyau du système d'exploitation


Qu'est-ce qui doit être sauvegardé, en quoi consiste le contexte de l'exécution du processus?

  1. Pour chaque thread en mode utilisateur - le "jmp_buf" actuel avec les registres nécessaires, cela signifie que le système d'exploitation doit arrêter tous les threads du processus appelant avant d'enregistrer les données
  2. , — . (: ), (ex: ).
  3. . (ex: ), (ex: TCP ). .
  4. , . ,
  5. . , . , — . .. .

    , , . .
  6. , .

Aucune information n'est requise pour le transcodage de la mémoire virtuelle vers la physique et vice versa; au redémarrage, ces informations seront recréées par elles-mêmes, éventuellement d'une manière différente.

Quant à travailler avec le système de fichiers. Parmi les systèmes de fichiers, il existe des systèmes transactionnels. Si l'application nécessite un comportement transactionnel précis, la préservation du contexte du processus doit être synchronisée avec la confirmation de la transaction du système de fichiers. D'un autre côté, par exemple, pour enregistrer des journaux de texte, il est logique d'utiliser un système de fichiers standard, la transactionnalité ici serait étrange.

De tout ce qui précède, les plus grandes questions sont causées par la préservation du contenu de la mémoire; le volume de tout le reste est insignifiant par rapport à cela.
Par exemple, runtimela bibliothèque met en mémoire tampon les allocations de mémoire, les demande au système en segments relativement importants et se distribue. Par conséquent, la création / suppression de segments est relativement peu importante.

Mais les programmes fonctionnent en continu avec la mémoire, c'est essentiellement le sous-système de mémoire qui est généralement le goulot d'étranglement dans les calculs. Et tout ce qui peut simplifier nos vies, c'est le support matériel pour les drapeaux des pages modifiées. Il est prévu qu'entre les sauvegardes d'état, pas trop de pages modifiées apparaissent.

Sur cette base, nous traiterons à l'avenir du contenu de la mémoire.

Sauvegarde du contenu de la mémoire


Le comportement souhaité est proche des bases de données - le SGBD peut «tomber» à tout moment, mais le travail effectué se poursuivra jusqu'au dernier commit. Ceci est réalisé en maintenant un journal des transactions, en entrant dans lequel les enregistrements de validation légaliseront toutes les modifications apportées à la transaction.

Mais, puisque le terme « mémoire transactionnelle » est occupé, nous en introduirons un autre - «mémoire indestructible».

Offhand, vous pouvez voir deux méthodes par lesquelles cette mémoire indestructible peut être implémentée.Option

une , appelons-la «sans prétention».
L'idée principale est que toutes les données modifiées dans une transaction doivent être placées dans la RAM. Ceux. pendant le fonctionnement, le mécanisme de swap n'enregistre rien sur le disque, mais pendant la validation, toutes les pages modifiées sont enregistrées dans le fichier de swap.

Les informations sur les segments sélectionnés et leur connexion avec l'emplacement dans le fichier d'échange sont écrites dans le journal. Pendant le fonctionnement, ces informations sont accumulées et enregistrées lors de la validation. Au redémarrage, le système a la possibilité de recréer des segments. Le mécanisme d'échange pourra les tirer vers le haut et le programme interrompu recevra comme par magie ses données.

Cependant, dans ce mode, il est impossible, par exemple, d'allouer un tableau de callocth plus grand que la mémoire disponible ( mallocth , soit dit en passant, est possible). Cependant, ce ne serait en tout cas pas une très bonne idée.

Même si un tel régime ne s'applique qu'aux processus qui se sont déclarés «indestructibles», la quantité de mémoire occupée par les transactions actuelles de tous ces processus ne peut pas dépasser la capacité physique disponible. Le mécanisme de swap arrête en fait le swap et se transforme en mécanisme de stockage des transactions récentes.

Tout cela impose une certaine discipline aux développeurs d'applications, peut conduire à une charge inégale sur le disque, en général, ce n'est pas tout à fait ce que nous voulions, mais cela peut fonctionner dans les systèmes embarqués.

Un inconvénient important de cette option est qu'une erreur fatale lors de la validation, lorsque seule une partie des pages a été écrite, conduit le processus correspondant à un état instable, après quoi il devra être arrêté.
Il s'avère une sorte d'inviolabilité à 50%.

Deuxième option , «Shadow»
Pour agir en tant que gestionnaire de transactions, vous devez être un gestionnaire de transactions.

Définissons les entités:

  1. Le fichier d'échange contient des pages de données. La taille est donc un multiple de la taille de la page. Nous disons le fichier, nous entendons plutôt la section, parce que une taille fixe améliore la stabilité du système.
  2. Allocateur de page de fichier d' échange . Il est nécessaire de sélectionner une page non seulement pour les données utilisateur, mais aussi, par exemple, pour enregistrer l'état de l'allocateur lui-même. Ainsi que tout ce qui a été mentionné ci-dessus.
  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.


Il est regrettable qu'aucun appareil de stockage ne soit totalement résistant à un fonctionnement à long terme dans des conditions spatiales. Les noyaux de ferrite étaient résistants aux radiations, mais avaient leurs propres problèmes spécifiques en raison du grand nombre de joints soudés. Plus faible capacité, faible vitesse et grande complexité de fabrication.

Néanmoins, vous devez pouvoir écrire et lire ces données de manière fiable.

Un candidat évident est la mémoire flash. Flash n'était pas initialement très fiable en raison du faible nombre de cycles d'écriture valides, des méthodes spéciales ont donc été développées pour fonctionner avec .

Il a été mentionné précédemment que le triplement est utilisé pour travailler avec des éléments non fiables, RAID1 suffit iciparce que si l'enregistrement échoue en raison des valeurs de contrôle, on sait laquelle des deux pages a été écrite incorrectement et doit être écrasée.

Total


Eh bien, nous avons maintenant entre nos mains les quatre lettres du mot ACID .

A - atomicité, atteinte
C - consistance, il y a
I - isolement, réalisé naturellement. Si vous ne considérez pas le cas de la mémoire partagée. Et pour le moment, nous n'y pensons pas.

D - persistance, la seule fois où nous avons essayé de tricher lorsque nous avons libéré le processus après un commit sans attendre l'enregistrement physique de toutes les données de sa mémoire sur disque. Dans le pire des cas, cela entraînera un retour à la transaction précédente. On ne sait pas à quel point cela est critique pour les performances et la durabilité.

PS. Juste une petite note. Nous n'avons pas de mécanisme pour les transactions de restauration, la restauration ne peut être qu'une erreur fatale. Techniquement (il semble), il est facile d'implémenter un programme de restauration de transaction en tant qu'analogue de longjmp. Mais ceci est une version beaucoup plus avancée de longjmp depuis restaure complètement l'état interne du processus au moment de «setjmp», en évitant les fuites de mémoire, permet la transition non seulement du bas vers le haut de la pile ...

PPS . Peut-être, le serveur SGBD OpenLink Virtouso , également disponible sous forme de logiciel gratuit , peut être considéré comme le prototype du gestionnaire de transactions .

PPPS . Merci à Valery Shunkov (amartologie) et Anton Bondarev (abondarev) pour une discussion significative et très utile.

PPPPS . Illustration d' Anna Rusakova .

All Articles