Comment la mémoire virtuelle augmente-t-elle réellement l'espace mémoire?


70

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?


12
C'est le vieux concept. 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. Mais c'était à ce moment-là que la mémoire était basse densité et très chère. De nos jours, la mémoire virtuelle est principalement utilisée pour la sécurité des processus.
sciure de bois

2
"Maintenant, comment augmente-t-il la mémoire?". Ce n'est pas. L'application ne connaît pas la mémoire physique du système, mais seulement la mémoire virtuelle. C'est pourquoi une application se plaint de ne pas avoir suffisamment de mémoire mais parle de mémoire virtuelle et non de mémoire physique.
Ramhound

2
N'oubliez pas que les systèmes de mémoire virtuelle sont très intelligents. Si n processus ont la même page en lecture seule, ils peuvent tous utiliser la même page de mémoire physique.
Eric Lippert

65
Ne pensez pas à la mémoire virtuelle pour tromper quoi que ce soit. La mémoire est la capacité abstraite de stocker et de récupérer des données . La mémoire virtuelle fournit une implémentation pour cette abstraction. Le fait qu'une partie de cette abstraction soit sauvegardée par la RAM et une partie par le disque constitue un détail de la mise en œuvre de l'abstraction.
Eric Lippert

4
@HagenvonEitzen Vous ne savez pas comment la mémoire est "toujours" sur le disque ... mis à part les pages lues à partir du disque, à moins qu'une page ne soit permutée, son contenu risque de ne jamais être sur le disque, ce qui est particulièrement vrai pour les pages épinglées en mémoire, par exemple en raison d'être critique pour la fonctionnalité du noyau.
Michael

Réponses:


116

Cela n'augmente pas du tout la mémoire physique . 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 les 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 configurer 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 lue à partir du disque, placée à un emplacement de la RAM physique (potentiellement différente de celle où elle était auparavant) et mappée dans le même emplacement de la 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 charger ce qui est effectivement "paresseux" de 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 la configuration requise pour la bibliothèque, en allouant de l'espace dans la zone de mémoire virtuelle de l'application, mais en ne chargeant pas toute la bibliothèque. 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 qui sont chargées dans la RAM sont celles qui sont réellement utilisées par le programme. Les parties qui ne sont jamais utilisé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 que ceux-ci ne 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 des systèmes de mémoire virtuelle, mais dans le passé a été confondu comme étant la mémoire virtuelle.


Les commentaires ne sont pas pour une discussion prolongée; cette conversation a été déplacée pour discuter .
Sathyajith Bhat

21

Explication de Layman

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 en même temps . 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 la mémoire virtuelle, vous aurez 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.

Aspects plus complexes

La mémoire virtuelle n'est pas utilisée exclusivement pour l'échange. Son objectif principal est en fait d'éviter la fragmentation de la RAM, ce qui pose un gros problème sur les systèmes sans gestion de mémoire virtuelle: vous pouvez disposer de 1 Go de RAM libre, mais si vous disposez de 10 Mo de mémoire vive, 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 le fichier entier se trouve dans (fichier virtuel). ) mémoire et optimisez les entrées / sorties disque et la mise en cache en fonction des modèles d’accès.


9
il est triste que nous vivons dans un monde où chaque onglet du navigateur nécessite 1 Go de mémoire
tbodt

9
@tbodt Je blâme les anciens Egyptiens. Si seulement ils savaient ce qu'ils faisaient en domestiquant ces satanés chats!
Dmitry Grigoryev

@tbodt C'est un peu exagéré aussi. Mon navigateur avec 8 onglets ouverts ne prend que 500 Mo de mémoire.
hasard832

2
@ Random832 Bien sûr, c'est une exagération, bien que je ne sois pas sûr de la ligne de démarcation entre l'exagération et l'épreuve du futur. Mon premier PC avait 32 Mo de RAM et je pouvais facilement ouvrir 8 onglets dans Opera sans échange perceptible. Maintenant, il faut 500 Mo, donc dans 20 ans, il pourrait tout aussi bien atteindre 8 Go.
Dmitry Grigoryev

5

La mémoire virtuelle n'augmente pas la mémoire, car elle ajoute davantage 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 virtuelles supérieure à la plage d' adresses physiques fournie par l'espace de stockage physiquement réel du serveur. 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 de localité de référence: À tout moment, seules les instructions d'une ou de plusieurs petites sections contiguës du segment de programme sont exécutées, et seules les données d'une ou de plusieurs petites sections contiguës du segment de données sont traitées (bien entendu, le comportement est en réalité plus complexe) , mais il suit ce modèle pendant une grande partie du temps]


4

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 peut utiliser tout l’espace adresse de la CPU (par exemple, 2 ^ 32) alors que la mémoire physique réellement installée ne représente qu’une fraction de ce nombre.
Les gros programmes peuvent ê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 à l'époque 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éellement physique. 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 les processus multiprocessus ) 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. En règle générale, seule la mémoire virtuelle contenant le code (aka texte) et les pages / segments de données nécessaires à l'exécution du processus est mappée sur la mémoire physique (ou résident 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 ("à 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.
La "mémoire accrue" est maintenant du point de vue du système, et pas seulement du point de vue du programme.


3

La mémoire virtuelle augmente la quantité de données qu'un programme peut traiter. 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 un lecteur flash branché à 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.

En pratique, nous souhaitons également que les programmes fonctionnent rapidement. Pour des raisons de rapidité , 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 ne vous exécuter entièrement hors de 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 sur le disque et de les replacer dans la mémoire DRAM.

En théorie, il pourrait simplement lire les données directement à partir du disque. Cependant, il y a des raisons pour lesquelles ce n'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 (cela s'appelle la mise en cache). Cependant, cela demande beaucoup de travail supplémentaire. Le plus rapidement possible 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. C'est beaucoup plus lent que de simplement utiliser la mémoire directement!

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 générales 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 tout ce problème est de minimiser 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 un disque. Ainsi, la grande majorité des accès à la mémoire se font sans jamais causer d'erreur de page.


2

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 penser à l’espace de permutation en tant que "vraie" mémoire et à la RAM en tant que cache haute vitesse pour cet espace.

(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.)


1

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 au niveau du système d'exploitation pouvant, par exemple, charger le contenu de la mémoire qui a été écrit dans un fichier d'échange dans n'importe quel emplacement libre de la mémoire physique (en cas de lecture) ou trouver un emplacement réel pour mettre des éléments (dans cas d'écriture), mettez à jour la table de traduction susmentionnée,et seulement ALORS le contrôle de la main pour 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é.


1

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ès 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) sur un espace d'adressage physique plus grand (par exemple 40 bits) et permet ainsi aux applications plus anciennes de tirer parti d'une mémoire DRAM plus physique.

4) permet de rendre contiguë la mémoire physique fragmentée et non contiguë dans l'espace d'adressage physique 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): lecture seule des zéros, écrit et page non partagée et rendue accessible en écriture).

Cela peut se produire entre des 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 se produire entre les systèmes d'exploitation. Par exemple, les systèmes d'exploitation invités sur un hôte de machine virtuelle peuvent avoir des pages dédupliquées, une COW partagée, 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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.