Chaque programme croit avoir toute la mémoire
La mémoire virtuelle donne à chaque processus l’impression d’avoir sa propre mémoire, à partir de l’adresse 0. Le système traduit ensuite chaque adresse en un vrai emplacement de la mémoire vive.
Grâce à cela, deux programmes peuvent utiliser la même adresse sans jamais se gêner.
À la fin de cette leçon
Remarque
Je peux traduire une adresse virtuelle en adresse physique avec une table des pages.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Adresse virtuelle | l’adresse que voit le programme | |
| Adresse physique | l’emplacement réel dans la mémoire vive | |
| Page | un bloc de mémoire virtuelle de taille fixe | 4096 octets |
| Cadre | un bloc de mémoire vive de la même taille qu’une page | |
| Table des pages | la liste qui dit quel cadre porte quelle page | |
| Décalage | la position d’un octet à l’intérieur de sa page |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Pages et cadres découpent la mémoire
Le système coupe la mémoire virtuelle en pages de taille fixe. Il coupe la mémoire vive en cadres de la même taille. Une page se range dans n’importe quel cadre libre.
Les pages d’un processus n’ont donc pas besoin d’être côte à côte dans la mémoire vive. Cela évite de chercher un grand trou libre.
Lire la taille d’une page
getconf PAGESIZEAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une page fait le plus souvent 4096 octets
La commande affiche la taille d’une page en octets. Sur la plupart des machines, vous lirez 4096.
Le nombre 4096 est 2 puissance 12. C’est pratique : les 12 derniers bits d’une adresse donnent la position dans la page.
Adresse : numéro de page et décalage
Pour traduire, on divise l’adresse virtuelle par la taille d’une page. Le quotient est le numéro de page. Le reste est le décalage.
La table des pages donne ensuite le cadre qui porte cette page. L’adresse physique vaut le numéro de cadre fois la taille d’une page, plus le décalage.
Couper l’adresse 8195 en page et décalage
python3 -c "print(8195 // 4096, 8195 % 4096)"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Ce que montre le résultat
Python affiche 2 3 : l’adresse 8195 est dans la page 2, au décalage 3. Le symbole // donne le quotient entier, et % donne le reste.
Le décalage ne change jamais pendant la traduction. Seul le numéro de page est remplacé par un numéro de cadre.
Exemple travaillé : pages de 4096 octets
| Page | Cadre | Adresse virtuelle | Page et décalage | Adresse physique |
|---|---|---|---|---|
| 0 | 3 | 100 | 0 et 100 | 3 fois 4096 plus 100, soit 12388 |
| 1 | 0 | 4100 | 1 et 4 | 0 fois 4096 plus 4, soit 4 |
| 2 | 6 | 8195 | 2 et 3 | 6 fois 4096 plus 3, soit 24579 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une page absente provoque un défaut de page
Toutes les pages ne sont pas en mémoire vive. La table des pages marque celles qui n’y sont pas. Si le processus touche une telle page, le matériel appelle le système : c’est un défaut de page.
Le système va chercher la page sur le disque, la place dans un cadre, met la table à jour et relance l’instruction.
Compter les deux tailles de mémoire
grep -E -c '^(VmSize|VmRSS):' /proc/self/statusAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Taille virtuelle et mémoire réellement utilisée
La commande affiche 2 : le fichier d’état contient les lignes VmSize et VmRSS. VmSize est la taille de la mémoire virtuelle du processus. VmRSS est la part qui occupe vraiment des cadres.
La première est presque toujours bien plus grande que la seconde. Les valeurs changent d’une machine à l’autre.
Erreur fréquente
Attention
Beaucoup de gens pensent qu’une adresse de programme est un emplacement de la mémoire vive. Ce n’est pas le cas : c’est une adresse virtuelle. Chaque processus a sa propre table, donc la même adresse virtuelle pointe vers des cadres différents.