Niveau d'usure en lecture et en écriture géré par logiciel pour la mémoire principale non volatile, partie 3
Aug 06, 2024
5.1.1 Échantillonnage de distribution d'écriture temporelle.
Pour générer une interruption après chaque Cwritesample et accès en écriture de l'application, nous utilisons le mécanisme de comptage des performances interne du CPU. L'événement BUS_ACCESS_ST dans ARMv8 compte le nombre total de requêtes de stockage sur le bus mémoire, et ainsi le nombre d'accès en écriture de l'application est enregistré. Pour les processeurs Intel, le même comportement pourrait être obtenu en utilisant un compteur de performances pour les réécritures du cache de dernier niveau.
Le cache et la mémoire sont deux concepts liés mais pas identiques. Le cache est un terme dans le domaine informatique qui décrit le mécanisme par lequel les ordinateurs stockent et traitent les données. Le cache peut aider les ordinateurs à accéder plus rapidement aux données et à améliorer la vitesse et l’efficacité du traitement. La mémoire, quant à elle, fait référence à la mémoire humaine, qui est la capacité du cerveau d'une personne à stocker des informations et à pouvoir les rappeler à tout moment.
Bien que le concept du cache et de la mémoire soit différent, il existe effectivement un certain lien entre eux. La mémoire humaine peut également être considérée comme un mécanisme de cache. Nous stockons les choses et les informations que nous avons vécues dans notre cerveau afin de pouvoir les rappeler plus rapidement lorsque nous en avons besoin. Cela ressemble au mécanisme de stockage en cache des ordinateurs, qui peut stocker des données temporaires pour améliorer l'efficacité du traitement informatique.
De plus, le cache, en particulier le cache à court terme, peut également nous aider à mieux comprendre et mémoriser de nouvelles informations. Si nous apprenons de nouveaux concepts ou points de connaissance, nous pouvons les stocker dans la mémoire cache de notre cerveau pendant une courte période pour nous aider à mieux nous en souvenir. Si nous parvenons à convertir rapidement de nouvelles informations en mémoire à long terme, nous pourrons alors mieux comprendre et maîtriser ces connaissances.
En général, le cache et la mémoire sont deux concepts étroitement liés et deux mécanismes qui se favorisent mutuellement. Le cache peut nous aider à accéder plus rapidement aux données et aux informations, tandis que la mémoire peut nous aider à mieux comprendre et mémoriser ces informations. Dans l’apprentissage et dans la vie quotidienne, nous pouvons tous utiliser des mécanismes de cache et de mémoire pour améliorer notre efficacité et notre capacité de mémoire. On voit que nous devons améliorer la mémoire, et Cistanche peut améliorer considérablement la mémoire car Cistanche peut également réguler l'équilibre des neurotransmetteurs, comme l'augmentation du niveau d'acétylcholine et des facteurs de croissance, qui sont très importants pour la mémoire et l'apprentissage. En outre, Cistanche peut également améliorer la circulation sanguine et favoriser l'apport d'oxygène, ce qui peut garantir que le cerveau reçoive suffisamment de nutrition et d'énergie, améliorant ainsi sa vitalité et son endurance.

Cliquez sur connaître les suppléments pour améliorer la mémoire
Si aucun compteur de performance de ce type n'est disponible dans certains systèmes, toute approximation (par exemple, le compteur de cycles ou une minuterie) peut toujours être envisagée. Le mécanisme de comptage de performances permet de générer un piège lorsque le compteur de performances déborde (c'est-à-dire dépasse la valeur de Cmax=232 −1).
Pour établir des interruptions sur chaque accès en écriture Cwritesample, le compteur de performances est défini sur Cmax -Cwritesampled lors de la gestion de l'interruption de débordement. Lors du choix de l'échantillon de réécriture, la surcharge introduite pour la gestion des interruptions doit être prise en compte.
5.1.2 Interception d'accès en écriture.
Comme la dernière adresse mémoire écrite ne peut pas être déterminée lors de la gestion des interruptions du dépassement du compteur de performances, une deuxième technique est mise en œuvre pour suivre l'adresse cible de la prochaine écriture mémoire.
Lors de la gestion de l'interruption de débordement, l'autorisation d'accès à la mémoire pour la région de mémoire suivie est définie sur READ_ONLY. Notez que l'architecture ARMv8 autorise des autorisations d'accès à la mémoire hiérarchiques, permettant de configurer des régions de mémoire d'une taille de 1-Go en LECTURE_UNIQUEMENT en modifiant uniquement l'entrée de table d'une page.
En raison de l'autorisation READ_ONLY, l'accès en écriture suivant provoque une interruption de violation d'autorisation, qui est traitée comme une interruption synchrone. L'adresse à l'origine de la violation est disponible pour le gestionnaire d'interruptions dans un registre dédié, qui est ensuite utilisé pour incrémenter le compteur correspondant dans l'approximation de la distribution d'écriture.1
Lors de la gestion du trap, les autorisations d'accès sont redéfinies sur READ_WRITE.2 Notez que ce mécanisme ne nécessite pas strictement une MMU ; il pourrait également être implémenté avec un MPU très léger sur un microcontrôleur.
Cependant, si une MMU est présente, le piégeage de l'accès en écriture pourrait être limité à un certain sous-ensemble de pages mémoire. Si, par exemple, une application à timing critique repose sur des accès mémoire rapides, le trapping d'accès en écriture peut être désactivé pour cette application au prix d'un mauvais niveau d'usure.
5.2 Échantillonnage d'accès en lecture
Pour enregistrer une approximation statistique des accès en lecture, nous suivons les deux mêmes étapes que celles décrites précédemment. Tout d'abord, nous avons mis en place un compteur de performances architecturales qui compte les accès en lecture sur le bus mémoire.
En définissant manuellement la valeur du compteur de performances C à sa valeur maximale Cmax =232 − 1 moins un taux d'échantillonnage configurable Creadsample chaque fois que le compteur déborde, un overflowtrap est généré pour chaque accès en lecture Creadsample.
Lors de la gestion du débordement, nous définissons les autorisations mémoire de toutes les pages mémoire observées sur NON _ACCÈS, ce qui conduit à un piège de violation d'autorisation sur les accès en lecture et en écriture. Ce piège de violation est utilisé pour enregistrer la cible du prochain accès en lecture.
Lors de la gestion des interruptions, les autorisations mémoire sont restaurées afin que l'exécution puisse continuer. En conséquence, ce mécanisme conduit à un échantillonnage de l'adresse de lecture actuelle à chaque accès en lecture par Creadsample.

Dans notre système de test, l'approximation de lecture est utilisée parallèlement à l'approximation d'écriture. Par conséquent, les deux méthodes interfèrent l'une avec l'autre, puisqu'elles utilisent toutes deux le système d'autorisation mémoire pour piéger un accès mémoire ultérieur. L'approximation d'écriture utilise uniquement l'autorisation READ_ONLY, et par conséquent les accès en lecture se poursuivent et l'approximation de lecture n'est pas perturbée.
En revanche, l'approximation de lecture utilise l'autorisation NO_ACCESS, et donc un accès en écriture ultérieur provoque également une interruption de violation d'autorisation, même si actuellement aucun échantillon pour l'approximation d'écriture ne doit être enregistré.
Cela nécessite une coopération étroite entre les deux approximateurs pour ignorer ces pièges d'écriture. Cependant, si l'approximateur de lecture vise à enregistrer un échantillon de lecture mais que l'accès mémoire suivant est un accès en écriture, l'accès en écriture doit être terminé pour continuer l'exécution et atteindre finalement la requête de lecture. Pour terminer l'accès en écriture, les autorisations mémoire doivent être détendu pour autoriser à nouveau l'accès en écriture.
Pour continuer à intercepter le prochain accès en lecture, nous utilisons un mécanisme de débogage qui redéfinit les autorisations de mémoire sur NO_ACCESS une fois l'accès en écriture terminé. Par conséquent, nous remplaçons l’instruction après l’instruction d’écriture par une instruction de point d’arrêt.3
Tant que les instructions d'écriture ne peuvent pas manipuler le compteur du programme,4 l'instruction suivante est garantie d'être exécutée. Le gestionnaire de point d'arrêt remplace ensuite le point d'arrêt par l'instruction d'origine, réinitialise l'autorisation de mémoire sur NO_ACCESS et poursuit l'exécution.
5.2.1 Échantillonnage de l’exécution des instructions.
Lorsque les accès en lecture à la mémoire principale sont approximés, les instructions de récupération du code source compilé doivent également être échantillonnées, car ce sont également des accès en lecture à la mémoire.
Cependant, l'utilisation du mécanisme précédent entraînerait la capture de seules les récupérations d'instructions, puisque la première chose que fait le processeur après le retour du gestionnaire d'interruptions qui a modifié les autorisations de mémoire est de récupérer l'instruction suivante.
Par conséquent, seul l'accès au segment de texte serait capturé dans l'approximation de lecture. Pour surmonter ce problème, nous n'observons pas les pages de section de texte pour l'approximation de lecture et ne modifions donc pas les autorisations pour ces pages.
Au lieu de cela, nous prenons un échantillon séparé du compteur de programme à chaque débordement du compteur de performances (Creadsample ), ce qui conduit à une approximation distincte et indépendante du segment de texte.

5.2.2 Mise à l'échelle d'approximation.
Comme indiqué précédemment, les approximations de lecture et d'écriture sont utilisées pour estimer l'âge des régions de mémoire et sont transmises à un algorithme de nivellement d'usure à gros grain.
Pour maintenir la qualité de l'algorithme de nivellement d'usure tenant compte du vieillissement, il est essentiel de mettre à l'échelle l'approximation de lecture en fonction de l'approximation d'écriture. L'approximation de lecture peut s'exécuter avec une fréquence d'échantillonnage Creadsample différente de celle de l'approximation d'écriture Cwritesample pour des raisons de performances.
L'algorithme de nivellement d'usure, cependant, n'obtient que l'âge estimé de la cellule en entrée, qui est l'approximation d'écriture pour une NVM non destructrice en lecture et l'approximation de lecture plus l'approximation d'écriture pour une NVM destructrice en lecture. Ainsi, l'approximation de lecture et d'écriture doit avoir le même poids.
L'approximation de lecture mise à l'échelle peut être calculée de la manière suivante : le facteur d'échelle requis x, qui doit être multiplié par l'approximation de lecture avant d'être soumis à l'algorithme de nivellement d'usure, est calculé selon l'équation (1).
X=CreadsampleCwritesample(1)
5.3 Algorithme de nivellement de l'usure à gros grains
L'approximation de la distribution d'accès permet des algorithmes arbitraires de nivellement d'usure tenant compte du vieillissement. L'algorithme n'a pas besoin de savoir s'il s'exécute ou non sur une NVM destructrice en lecture, car les accès en lecture ont les mêmes influences destructrices que les accès en écriture.
Ainsi, l'algorithme peut prendre l'âge comme entrée, qui est calculé à partir de la somme des accès en lecture et en écriture. Nous alimentons l'algorithme avec un indicateur d'approximation d'accès, qui estime l'âge de chaque page. Notez que le système d'approximation fonctionne uniquement sur la mémoire virtuelle et ne prend pas en compte le mappage vers les pages de mémoire physique. Ceci est maintenu par l’algorithme de nivellement d’usure lui-même.
L'algorithme de nivellement d'usure décide quelles pages de mémoire virtuelle sont déplacées vers d'autres pages de mémoire physique et maintient donc l'âge global de la mémoire physique. Cependant, l'interface entre le système d'approximation et l'algorithme de nivellement d'usure doit être bien définie. Nous entrelacons davantage notre algorithme de nivellement d'usure avec la mise en œuvre d'approximation pour réduire les données stockées de manière redondante.
Notre algorithme de nivellement d'usure utilise un arbre rouge-noir pour conserver toutes les pages de mémoire physique gérées ainsi que leur âge estimé [10]. Comme l'âge estimé est déjà présent à l'intérieur des nœuds de l'arbre, il n'est pas non plus nécessaire de stocker ces valeurs dans l'implémentation de l'approximation.
L'arbre est illustré à la section 5.3.1. Chaque page est stockée dans l'arborescence concernant l'âge estimé, et ainsi une recherche et une extraction de la page la plus récente sont possibles de manière efficace.
Le système d'approximation maintient une page de mémoire virtuelle de compteur de lecture et d'écriture temporaire et notifie l'algorithme de nivellement d'usure avec une action d'incrément d'âge si l'un de ces compteurs dépasse un certain seuil. En conséquence, l'algorithme de nivellement d'usure augmente la valeur d'âge interne et déplace le contenu de la mémoire physique vers une autre page.
5.3.1 Gestion des pages mémoire.
Chaque fois qu'une page de mémoire virtuelle doit être déplacée vers une autre page de mémoire physique, le minimum actuel (c'est-à-dire la page de mémoire physique avec l'âge supposé le plus bas) est extrait de l'arborescence en tant que page physique cible et les âges estimés sont ajustés en conséquence.
Le choix de la page la plus jeune comme victime du wear-leveling conduit à un wear-leveling incrémental, où chaque page devient la page la plus jeune après un certain temps.
Concernant la surcharge, l'algorithme de nivellement d'usure n'est appelé dans cette configuration que lorsqu'une page mémoire doit être déplacée. Concernant la politique de sélection des décisions de nivellement d'usure, l'âge estimé de toutes les pages physiques est équilibré de manière égale dans le temps, car chaque page sera la page minimale actuelle à un certain moment.
Cela établit un nivellement d'usure incrémentiel sans état, et la mémoire est supposée être nivelée par usure à tout moment et est maintenue par rapport à l'usure. Par conséquent, le système n’a pas besoin de stocker les âges au fil des cycles d’alimentation.
Les structures de données de l'approximation d'accès et l'algorithme de wear-leveling eux-mêmes doivent être ciblés par le wear-leveling lui-même, ce qui nécessite une implémentation particulière.
Ces détails techniques sortent cependant du cadre de ce travail. Finalement, cette intégration de l'algorithme de nivellement d'usure et du système d'approximation conduit à un paramètre de configuration supplémentaire, en plus de la granularité temporelle et spatiale de l'approximation du nombre d'écritures, c'est-à-dire la relique du seuil, après quoi le nombre estimé d'écritures ou de lectures doit être effectué.

Ce paramètre de configuration fournit un compromis entre la surcharge de relocalisation de page et la fréquence, et respectivement la qualité résultante, des actions de nivellement d'usure sans influencer la qualité de l'approximation d'accès.
For more information:1950477648nn@gmail.com






