Je comprends que la mémoire virtuelle trompe le programme en affichant plus de mémoire que ce qui est réellement disponible.
Mais en fin de compte, il doit mapper l'adresse logique sur l'adresse réellement physique. Maintenant, comment augmente-t-il la mémoire?
Il n'augmente pas physique mémoire du tout. Son but est tout autre chose. Ce qu'il peut faire, c'est mettre à disposition d'autres magasins de support qui permettent aux programmes d'utiliser plus de mémoire que ce qui est physiquement disponible.
La mémoire virtuelle est utilisée pour séparer et isoler les processus les uns des autres et permet également de détourner l’accès à la mémoire vers d’autres emplacements.
La mémoire virtuelle permet au système de donner à chaque processus son propre espace mémoire isolé des autres processus. Avec des programmes fonctionnant efficacement dans leur propre espace, cela leur donne un accès complet à l'ensemble de l'espace d'adressage au lieu de devoir contourner d'autres programmes qui pourraient également avoir besoin d'utiliser les "mêmes" adresses. Cela a pour effet secondaire d'accroître la fiabilité et la sécurité, car les processus ne peuvent pas facilement interférer les uns avec les autres.
L'espace mémoire virtuel d'une application est construit selon les besoins. Une application semble (pour elle-même) se trouver dans un seul bloc de mémoire contigu, mais pourrait en réalité être complètement dispersée dans la mémoire physique.
La mémoire virtuelle permet également de piéger et de détourner des accès à la mémoire, ce qui nous permet d'utiliser des fonctionnalités telles qu'un fichier d'échange. Cela signifie que nous pouvons transférer des parties de la mémoire qui n'ont pas été récemment utilisées sur le disque et définir un pointeur indiquant que "ce bloc de mémoire se trouve dans le fichier x à l'emplacement y" et que nous pouvons ensuite libérer la mémoire physique. zone à utiliser par une autre application. Lorsqu'une application a besoin de cette mémoire, elle peut être relue sur le disque, placée à un emplacement physique RAM (potentiellement différent de ce qu'elle était auparavant) et mappée dans le même emplacement de mémoire virtuelle qu'auparavant.
De la même manière que le fichier de page est utilisé, la mémoire virtuelle peut également permettre au système d’exploitation de procéder à un chargement "paresseux" des bibliothèques partagées pour un programme. Lorsque le programme principal indique au système d'exploitation qu'il souhaite utiliser une bibliothèque particulière, il peut gagner du temps en vérifiant les exigences de la bibliothèque, en allouant de l'espace dans la zone de mémoire virtuelle de l'application, mais en ne chargeant pas la bibliothèque entière. dedans il peut différer le chargement des pages de la bibliothèque depuis le disque jusqu'à ce qu'elles soient réellement nécessaires. De cette manière, les seules parties de la bibliothèque chargées dans RAM sont celles réellement utilisées par le programme. Les parties inutilisées ne sont jamais chargées et ne gaspillent donc pas de RAM.
En utilisant ces techniques, nous améliorons la stabilité du système et permettons à davantage de processus de s'exécuter dans un espace confiné sans qu'ils se gênent mutuellement. Cela n'augmente pas la mémoire, mais nous permet d'utiliser plus efficacement ce que nous avons.
Le fichier d'échange est activé par les systèmes de mémoire virtuelle, mais il était auparavant confondu en tant que being la mémoire virtuelle.
Le système devra mapper chaque adresse virtuelle sur une adresse physique lorsque cette mémoire est utilisée, mais toute la mémoire n'est pas utilisée simultanément . Par exemple, supposons que vous ayez 20 onglets dans votre navigateur, chacun prenant 1 Go de mémoire. Dans le système d'exploitation sans prise en charge de mémoire virtuelle, vous avez besoin de 20 Go de RAM pour que cela fonctionne. Le truc, c’est que vous ne parcourez pas les 20 onglets en même temps, de sorte que le système d’exploitation avec mémoire virtuelle vous permettra d’utiliser votre navigateur de cette manière avec seulement quelques Go de RAM, en permutant les onglets inactifs sur le disque.
La mémoire virtuelle n'est pas utilisée exclusivement pour l'échange. Son objectif principal est en fait d'éviter la fragmentation RAM, ce qui pose un gros problème sur les systèmes ne disposant pas de gestion de mémoire virtuelle: vous pouvez disposer de 1 Go de RAM libre, mais si elle se présente par morceaux de 10 Mo, une application demandant 100 Mo ne pourra pas fonctionner.
Au fil du temps, la mémoire virtuelle a trouvé encore plus d'utilisations, notamment l'accès aléatoire aux fichiers: de nombreuses applications, telles que les bases de données, deviendront péniblement lentes si elles sont obligées de lire les fichiers de manière séquentielle, et fonctionnent beaucoup plus rapidement si le système d'exploitation leur permet de prétendre que tout le fichier se trouve ) mémoire et optimiser le disque IO et la mise en cache en fonction des modèles d’accès.
La mémoire virtuelle n'augmente pas la mémoire, au sens d'ajouter plus de matériel de mémoire principale. Mais cela peut augmenter la gamme d'adresses utilisables . Ainsi, un programme en cours d'exécution composé d'un segment de code et d'un segment de données (pile et tas) pourrait occuper une plage d'adresses virtual supérieures à celle de physical adresses fournies par l'espace de stockage physiquement réel de la machine. Le truc, c'est que seule une petite fraction de ces adresses virtuelles est sauvegardée par la mémoire principale physique à tout moment [mais tout est finalement sauvegardé par le stockage sur disque] . Cela fonctionne à cause du phénomène localité de référence : à tout moment, seules les instructions d’une ou plusieurs petites sections contiguës du segment de programme sont exécutées et seules les données contenues dans une ou plusieurs petites sections contiguës de les segments de données sont exploités sur [le comportement est bien sûr plus complexe, mais il suit ce modèle pendant une grande partie du temps]
Je comprends que la mémoire virtuelle trompe le programme en affichant plus de mémoire que ce qui est réellement disponible.
La motivation initiale de la mémoire virtuelle était une forme de gestion de la mémoire visant à fournir un espace d'adressage plus grand que la mémoire physique.
Le logiciel pourrait utiliser l’espace adresse complet de la CPU (par exemple, 2 ^ 32) tandis que la mémoire physique réellement installée ne représente qu’une fraction de ce nombre.
Les grands programmes pourraient être portables parmi les ordinateurs utilisant la mémoire virtuelle sans imposer d’énormes besoins en mémoire (installés).
Cette utilisation de la mémoire virtuelle remonte au temps des ordinateurs centraux et de la mémoire centrale en ferrite (faible densité physique et coûteuse).
Mais en fin de compte, il doit mapper l'adresse logique sur l'adresse réelle. Maintenant, comment augmente-t-il la mémoire?
La mémoire virtuelle a évolué d'une technique visant à fournir plus d'espace d'adressage au programme.
La mémoire virtuelle est un élément clé de la sécurité de chaque processus dans les systèmes d'exploitation modernes, de sorte qu'un processus ne peut pas interférer avec un autre processus ni être compromis par un autre processus.
Mais le multitraitement (ne confondez pas avec le multitraitement ors ) avec la mémoire virtuelle fournit toujours plus de mémoire apparente pour le système que la mémoire physique.
Chaque processus créé est doté de son propre espace d'adressage virtuel, c'est-à-dire de sa propre mémoire virtuelle.
La quantité de mémoire physique réellement utilisée (et mappée sur la mémoire virtuelle) pour chaque processus est dynamique. Généralement, seule la mémoire virtuelle contenant le code (texte) et les pages/segments de données nécessaires à l'exécution du processus est mappée sur la mémoire physique (résidente en mémoire).
Le code non essentiel (car il n'est pas exécuté actuellement) et les données (car elles ne sont pas référencées/traitées) ne doivent pas nécessairement être résidentes en mémoire. Les pages/segments de code et/ou de données peuvent être "échangés" vers le magasin de support (p. Ex. Espace d'échange ou fichier de page sur un disque dur ou un disque SSD), puis "échangés (à nouveau)" selon les besoins (ou "à la demande"). ).
La mémoire virtuelle facilite l'utilisation efficace de la mémoire physique finie parmi de nombreux processus, chacun disposant de son propre espace d'adressage virtuel protégé. La somme de ces mémoires virtuelles est généralement supérieure à la mémoire physique installée.
"L’augmentation de la mémoire" concerne maintenant le système, et pas seulement le programme.
La mémoire virtuelle augmente la quantité de données d'un programme peut répondre. D'un point de vue logiciel, nous ne nous soucions généralement pas de l'endroit où leurs données sont stockées. Il peut être stocké dans une mémoire DRAM physique, sur une clé USB connectée à la machine ou même sur un plateau en rotation. Ce qui importe au logiciel, c’est que, quand il demande d’accéder à ces données, il réussit.
Dans la pratique, nous voulons aussi des programmes pour courir vite. Pour speed , nous nous soucions de l'emplacement des données. Nous voulons que les données auxquelles nous avons accès le plus souvent soient stockées dans un matériel permettant un accès le plus rapide possible. Nos programmes voudraient comme fonctionner entièrement en mémoire DRAM. Cependant, nous n'avons souvent pas assez de DRAM pour le faire. La mémoire virtuelle est une solution.
Avec la mémoire virtuelle, le système d’exploitation "dépose" des données inutilisées et les stocke sur un disque dur. Ceci est toujours accessible, juste lent. Si le programme demande des données qui se trouvent sur le disque dur, le système d’exploitation doit prendre le temps de lire les données du disque et de les replacer dans la DRAM.
En théorie, il pourrait simplement lire les données directement à partir du disque. Cependant, il y a des raisons, il est pas fait de cette façon. Les programmes ne veulent pas être conscients de toutes ces complications. Nous pouvons et faisons écrire un logiciel qui met intelligemment les données sur disque (c'est ce qu'on appelle la mise en cache). Cependant, il faut beaucoup de travail supplémentaire. Le plus rapide que nous pouvons le faire dans le code est:
if data is not in memory
read data from disk into memory
operate on data
Un lecteur astucieux remarquera que, même si les données sont en mémoire, nous devions avoir une condition pour vérifier si elles sont présentes. Cela est beaucoup plus lent que juste fonctionner directement en mémoire!
La mémoire virtuelle résout ce problème en vérifiant le matériel sur la CPU. Le processeur est en mesure d'effectuer cette opération de mémoire virtuelle extrêmement rapidement car il peut y dédier du matériel. Toute tentative de faire cela dans le seul logiciel doit utiliser les parties universelles de la CPU, qui sont naturellement plus lentes que ne le seraient les transistors dédiés.
Cela explique pourquoi nous mettons toujours les données en mémoire dans la mémoire plutôt que de simplement les lire à partir du disque et de les laisser telles quelles. Nous divisons la mémoire en "pages", chacune étant marquée comme étant présente ou non présente en mémoire. Le système d'exploitation conserve cette table dans un format facilement utilisable par la CPU. Lorsqu'un programme accède aux données présentes, le matériel de la CPU leur donne directement accès aux données de la mémoire DRAM. Lorsque les données ne sont pas présentes, une "erreur de page" est générée, invitant le système d'exploitation à charger cette page du disque sur une page physique de la mémoire et à mettre à jour le tableau pour indiquer à la CPU cette nouvelle page physique.
La clé de ce problème est de réduire au minimum son utilisation. Dans la pratique, nous trouvons que les systèmes d'exploitation savent très bien quelles données conserver en mémoire et quelles données transférer d'une page à une autre sur disque, de sorte que la grande majorité des accès à la mémoire se font sans jamais causer d'erreur de page.
Pour ce faire, les entrées de la carte sont temporaires.
Lorsqu'un programme accède à une adresse logique, la CPU recherche dans la carte une adresse physique correspondante. S'il est trouvé, l'accès à la mémoire se déroule comme prévu; si elle n'est pas trouvée, une adresse physique doit être allouée et le contenu doit être chargé à partir d'un autre stockage - "l'espace de permutation". Si chaque adresse physique a déjà été allouée à une adresse logique, certaines adresses logiques doivent être "permutées" (leur contenu est sauvegardé dans l'espace de permutation) pour que les adresses physiques soient disponibles.
La mémoire maximale allouée est la taille de l'espace de permutation, qui peut être beaucoup plus grande que la mémoire installée. Il peut être utile de considérer l’espace de permutation comme la mémoire "réelle" et de RAM comme un cache haute vitesse pour l’espace de permutation.
(Ceci est loin d'être une description détaillée, il est destiné à répondre à la question immédiate sans entrer dans les détails pertinents mais inutiles.)
Le concept de base repose sur le fait qu’une unité centrale moderne peut gérer des tables de traduction en gardant une trace de "quelles plages d’adresses un processus a été alloué, et quelles adresses physiques (pensez lignes A00..Axx sur un bus de mémoire), IF ANY , sont actuellement utilisés pour stocker les données. "IF ANY", car "aucun" est un état possible et acceptable: Dans ce cas, une condition d'erreur (appelée "erreur de page") est générée au niveau matériel. - et cette erreur déclenchera un gestionnaire de niveau système pouvant charger, par exemple, le contenu de la mémoire écrite dans un fichier d'échange dans un emplacement libre de la mémoire physique (en cas de lecture) ou trouver un emplacement réel en cas d’écriture), mettez à jour la table de traduction susmentionnée et, ALORS, contrôlez à nouveau le processus qui a tenté d’accéder à cette mémoire .. et qui ne sera pas le plus sage de ce qui s’est passé.
Mémoire virtuelle:
1) permet de mapper un grand espace d'adressage virtuel sur une plus petite quantité de mémoire physique, avec un excédent de "permutation" sur disque, ou SSD, ou de manière prospective sur NVRAM et d'autres périphériques.
2) permet de mapper un espace d'adressage virtuel plus grand (par exemple 64 bits) vers un espace d'adressage physique plus petit (par exemple 32 ou 64 bits)
3) permet de mapper un espace d'adressage virtuel plus petit (par exemple 32 bits) vers un espace d'adressage physique plus grand (par exemple 40 bits) et permet ainsi aux applications plus anciennes de tirer parti d'une DRAM plus physique.
4) permet à la mémoire physique fragmentée et non contiguë dans l'espace d'adressage physique d'être rendue contiguë dans l'espace d'adressage virtuel.
5) permet aux processus de se voir attribuer leurs propres espaces d'adresses virtuels, et donc d'être isolés les uns des autres.
6) permet à différentes adresses virtuelles partageant les mêmes valeurs de données d’allouer une seule page physique.
Cela peut se produire au sein d’un seul processus ou d’un seul système d’exploitation - la plupart des systèmes d’exploitation dérivés de BSD UNIX ont une seule page de zéros en lecture seule, qui peut être mappée dans n’importe quelle page virtuelle remplie de zéros, généralement COW (Copy On Write): et page non partagée et rendue accessible en écriture).
Cela peut arriver entre processus - par exemple UNIX fork () crée des processus enfants qui partagent la quasi-totalité de la mémoire virtuelle selon le principe COW.
Cela peut arriver entre les systèmes d'exploitation - par exemple Les systèmes d'exploitation invités sur un ordinateur virtuel hôte peuvent avoir des pages dédupliquées, des COW partagées, etc. (certaines attaques de sécurité récentes en ont tiré parti.)
7) La mémoire virtuelle peut permettre de mapper des parties de l'espace d'adressage virtuel sur des fichiers ou sur la mémoire mappée sur d'autres processeurs, que ce soit dans le même système multiprocesseur ou sur Internet.