Mémoire virtuelle
Progression
#Mémoire virtuelle
À quoi ça sert: donner à chaque processus l’illusion d’un grand espace contigu, protéger les espaces entre eux, et permettre du partage contrôlé. Comment ça marche: pages, tables, TLB, fautes de page, politiques de remplacement.
#Concepts clés
- Adresse logique (virtuelle) vs physique: le programme manipule des adresses virtuelles, traduites vers des cadres en RAM par la MMU selon des tables pilotées par le noyau.
- Pages et cadres: la mémoire est découpée en unités fixes (4K, 2M, 1G). Taille qui impacte TLB/localité (huge pages réduisent la pression TLB).
- TLB: cache la traduction VA→PA; un hit est très rapide, un miss force une marche dans la table (page walk) et remplit le TLB.
- Fautes de page: mineure (page déjà en RAM mais non mappée), majeure (lecture disque). Trop de fautes majeures ⇒ thrash.
#Animation: parcours de traduction
#Diagramme: TLB hit/miss et faute de page
#Pas‑à‑pas: Copy‑on‑Write (fork/écriture)
Après fork()
, parent et enfant pointent vers les mêmes pages en lecture (bit COW). Les deux avancent sans copie tant qu’ils lisent.
#LRU (cache/pages) — démonstrateur
[1, 2, 3, 2, 4, 1, 5, 2, 3, 4, 5]
#Étude de cas: thrashing
Quand l’ensemble de travail dépasse largement la RAM, le système “bat des ailes”: fautes majeures en boucle, débits disques en hausse, CPU syst. élevé. Indices: vmstat
, iostat
, compteurs de fautes majeures. Contre‑mesures: réduire la pression mémoire, revoir structures/algos, limiter la concurrence, ajouter de la RAM.
#Copy‑on‑Write et fork
fork()
: parent et enfant partagent les mêmes pages en lecture, marquées COW.- Écriture → faute de page → dupliquer la page et marquer comme écrivable.
#ASLR et NX (sécurité)
- ASLR: randomise les bases (heap, stack, libs) pour complexifier l’exploitation.
- NX/DEP: interdit l’exécution sur la pile/heap; combiné à ASLR et canaries, réduit l’impact des débordements.
#Remplacement
- Politiques: LRU approximée (CLOCK), FIFO avec second‑chance; choix local (par processus) vs global (système).
- Mesures: surveiller fautes majeures et temps I/O; si le système swappe et que les fautes explosent, on entre en thrashing.
En SMP, invalider des entrées TLB d’un autre cœur requiert une coordination (IPI) pour maintenir la cohérence.
#Pas‑à‑pas: faute de page et diagnostic
Supposons un processus qui touche 1 GiB de mémoire après allocation, par sauts de 4 KiB. À chaque premier accès d’une page, la MMU ne trouve pas de mapping: faute de page. Si la page est demandée en lecture et que la RAM est disponible, le noyau alloue un cadre et met à jour la table: on parle de faute mineure. Si la pression mémoire force à relire depuis le swap/disque, la faute est majeure et coûte des millisecondes.
Indices à observer:
vmstat 1
: colonnessi/so
(swap in/out),cs
(context switches),us/sy
(temps user/system). Une haussesi/so
et unsy
élevé sont des signaux.pidstat -r 1 <pid>
: fautes mineures/majeures par seconde.iostat -xz 1
: latences disque et saturation (%util
).
Contre‑mesures simples: réduire l’empreinte (structures plus compactes), regrouper les accès (meilleure localité), limiter la concurrence qui dilate l’ensemble de travail, et si nécessaire ajouter de la RAM. Sur Linux, des huge pages réduisent la pression TLB pour de grands accès séquentiels.