Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Mémoire virtuelle et pagination

Après cette leçon: Je peux traduire une adresse virtuelle en adresse physique avec une table des pages.

Leçon de 55 min3 commandesLab Linux du quotidien : la trentaine de commandes que les ingénieurs tapent de tête

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

MotCe que ça veut direExemple
Adresse virtuellel’adresse que voit le programme
Adresse physiquel’emplacement réel dans la mémoire vive
Pageun bloc de mémoire virtuelle de taille fixe4096 octets
Cadreun bloc de mémoire vive de la même taille qu’une page
Table des pagesla liste qui dit quel cadre porte quelle page
Décalagela 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

Commande
getconf PAGESIZE

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.

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

Commande
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

PageCadreAdresse virtuellePage et décalageAdresse physique
031000 et 1003 fois 4096 plus 100, soit 12388
1041001 et 40 fois 4096 plus 4, soit 4
2681952 et 36 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

Commande
grep -E -c '^(VmSize|VmRSS):' /proc/self/status

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.

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.

À propos de ce labo et de sa source: Lab Linux du quotidien : la trentaine de commandes que les ingénieurs tapent de tête

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.