M ´emoire virtuelle
Pagination sur demande Copy-on-Write
Remplacement de pages Allocation de frames
Thrashing
Fichiers “mapp ´es” en m ´emoire Allocation de m ´emoire du noyau
Sch ´ema de m ´emoire virtuelle
Pourquoi virtuelle?
Donner l’illusion d’une m ´emoire infinie M ´emoire centrale est toujours trop petite
Certaines parties du code ne sont jamais ex ´ecut ´ees Certaines donn ´ees/code momentan ´ement inutiles Maximiser l’utilit ´e des donn ´ees en m ´emoire centrale Pas besoin de pr ˆeter attention `a la taille m ´emoire
Espace d’adressage virtuel
Espace d’adressage avec des trous Trous pour faciliter allocations futures:
•
Grandir la pile•
Libraires li ´ees dynamiquementPages partag ´ees avec d’autres processus
Librairie partag ´ee
Pagination `a la demande
Ne pas charger tout le programme au d ´emarrage
Amener les pages en m ´emoire centrale de mani `ere paresseuse
•
Moins d’entr ´ees/sorties, moins de m ´emoire utilis ´ee•
R ´eponse plus rapide, plus de processus en m ´emoire Acc `es m ´emoire:1. En m ´emoire
= ⇒
le CPU se charge de tout 2. Sinon, trap vers le SE3. Le SE v ´erifie si la page existe: si non
= ⇒
coredump 4. Si oui, charger la page du disque et ressayerTransfert du/vers le disque
Table de pages avec pages manquantes
Page fault
1. Le CPU utilise table des pages pour trouver l’adresse physique 2. Si la table des pages indique une entr ´ee invalide: page fault!
3. Le CPU passe en mode noyau et appelle le SE 4. Le SE cherche dans sa propre table
5. Si l’adresse logique est vraiment invalide: coredump!
6. Sinon, trouver une frame libre
7. Transf ´erer la page depuis le disque vers cette frame 8. Mettre `a jour la table des pages
Sch ´ema d’une page fault
Besoins de la pagination sur demande
MMU avec des bits valide/invalide par page Une m ´emoire secondaire
La capacit ´e de r ´eex ´ecuter une instruction
•
Instructions atomiques•
Garder trace de la partie d ´ej `a ex ´ecut ´eeCo ˆ ut d’un page fault
•
Trap vers le SE•
Trouver une frame libre•
Potentiellement ´evincer une frame•
Envoyer la commande au disque•
Context switch `a un autre processus en attendant•
Interruption vers le SE•
Autre Context switch pour revenir au processus•
Corriger la table des pages•
Relancer l’ex ´ecutionTemps d’acc `es effectif
ρ
: miss rate de la m ´emoire centraleM
: Temps d’acc `es `a la m ´emoire centraleD
: Temps de service d’un page faultEAT = (1 − ρ)M + ρ(M + D) = M + ρD D
est principalement d ´etermin ´e par le temps d’acc `es au disqueD ≥
latence-disque+
acc `es-disqueOptimisations
Garder des frames libres
Charger plusieurs pages d’un coup
Un acc `es disque pour 4KB n’est pas plus rapide que pour 64KB Prefetching
Copy-on-Write (CoW)
Copie paresseuse via la table des pages
La copie partage la m ˆeme m ´emoire physique que l’original 1. Pages marqu ´ees read-only
2. En cas de store, la page affect ´ee est copi ´ee
3. La table des pages est ajust ´ee et marqu ´ee read-write 4. Et ensuite seulement le store est relanc ´e
Indispensable pour
fork
Utilis ´e aussi pour l’initialisation `a 0
Sch ´ema de Copy-on-Write
Plus de frame libre
Que faire s’il n’y a plus de frame libre?
•
Tuer un ou des processus•
Swap out un processus•
Evincer une page´Pour ´evincer, il est tr `es important de trouver un bon condidat
Remplacement de page
Pour ´evincer une page il faut la remettre sur le disque
On utilise un dirty bit pour savoir si la page a ´et ´e modifi ´ee
Si elle n’a pas ´et ´e modifi ´ee, pas besoin de la r ´e ´ecrire sur le disque Besoin de statistiques sur l’usage de chaque page pour un bon choix Note: une page fault peut maintenant faire 2 transferts de page
Le temps d’acc `es effectif en est augment ´e en cons ´equence
Esquisse de remplacement de page
Algorithmes de remplacement de page
Minimiser le nombre de page faults futures
•
Soit globalement•
Soit par processus ou utilisateur ou groupe de processus Evalu ´e sur une s ´equence de pages´E.g.:
7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1
Remplacement par Random
On choisit une frame au hasard Facile `a impl ´ementer
Pas tr `es bon en g ´en ´eral
Mais, dans le pire des cas n’est pas pire que les autres
Remplacement par FIFO
On choisit toujours la frame suivant la pr ´ec ´edente:
Dans cet exemple, on a donc 15 page faults Facile `a impl ´ementer
Pas id ´eal. Mais, dans le pire des cas n’est pas mauvais Anomalie de Belady: plus de faults avec plus de frames!
Remplacement Optimal
Remplacer la page qui restera inutilis ´ee plus longtemps
Seulement 9 page faults
Malheureusement, il faut connaˆıtre le futur
Remplacement par LRU
Remplace la frame inutilis ´ee depuis le plus de temps
12 page faults, dans notre exemple
G ´en ´eralement un des meilleurs algorithmes Ne souffre pas de l’anomalie de Belady
LRU est OPT `a l’envers
⇒
´equivalents si le futur reproduit le pass ´eTalon d’Achille de LRU
Longs acc `es s ´equentiels
Sans r ´ep ´etition: le futur ne ressemble pas du tout au pass ´e Avec r ´ep ´etition: acc `es `a N+1 pages
•
Lorsqu’on arrive `a N+1, on ´evince 0•
Lorsqu’on arrive `a 0, on ´evince 1Random fonctionnerait beaucoup mieux (
e1 fault par boucle)
Impl ´ementation de LRU
Horloge:
•
Chaque frame garde l’“heure” du dernier acc `es•
L’horloge est incr ´ement ´ee `a chaque acc `es•
Lors du remplacement, cherche la frame avec la plus vieille “heure”Liste (g ´en ´eralement appel ´ee pile):
•
Garde une liste ordonn ´ee de toutes les frames•
A chaque acc `es, d ´eplace la frame en premi `ere position`•
Lors du remplacement, prend la derni `ere frame de la listeApproximation de LRU: referenced bit
LRU requiert trop de travail `a chaque acc `es Certains CPU donnent une approximation Un bit referenced dans la table de page
•
Lors de l’acc `es `a une page, le CPU met ce bit `a 1•
P ´eriodiquement, le SE collecte tous ces bits et les remet `a 0Le SE ne peut plus distinguer l’ordre d’acc `es dans une m ˆeme p ´eriode Parmi les frames d’une m ˆeme p ´eriode on peut utiliser FIFO
Approximation de LRU: Clock
Aussi appel ´e algorithme de la deuxi `eme chance
Comme FIFO, prend la frame suivante, mais v ´erifie son referenced bit:
•
Si referenced est 0, alors remplace cette page•
Si referenced est 1, alors remet referenced `a 0 et passe `a la frame suivanteD ´eg ´en `ere `a FIFO si les referenced sont tous `a 0 (ou tous `a 1)
Exemple de Clock
Impl ´ementation de referenced bit
Certains CPU impl ´ementent les bits referenced et dirty Sinon, on peut le faire `a la main:
•
Pour mettre referenced `a 0, marquer la page comme invalide•
Lors d’un page fault, mettre referenced `a 1 De m ˆeme pour dirty•
Pour mettre dirty `a 0, marquer la page comme read-only•
Lors d’un page fault en ´ecriture, mettre dirty `a 1 Parfois plus efficace et pratique de le faire `a la mainAlgorithmes de page-buffering
D ´ecoupler les op ´erations pour r ´epondre plus vite `a un page-fault Garder des frames libres
•
Choisir `a l’avance les victimes futures•
Si elle est dirty, ´ecrire le contenu dans le disque•
Marquer invalide. Mais si acc ´ed ´ee, on peut la ressusciter `a bon prix Ne pas laisser les pages dirty trop longtemps•
Quand le disque est inactif, ´ecrire le contenu des pages dirty•
Ainsi la page peut ˆetre ´evinc ´ee plus rapidementAllocation de frames
Combien de frames allouer `a chaque processus
Evincer une page qui appartient `a un autre processus?´ Allocation globale: oui sans ´equivoque
•
Temps d’ex ´ecution d’un processus d ´epend beaucoup des autres•
Populaire: g ´en ´eralement meilleur throughput Allocation locale: non, (voire: oui mais)•
Performance d’un processus plus pr ´evisible•
Risque de sous-utiliser la m ´emoire•
Populaire quand on partitionne une machineNUMA (Non-Uniform Memory Access)
Le temps d’acc `es `a la m ´emoire peut d ´ependre de la distance E.g. plusieurs nœuds (CPU+m ´emoire) interconnect ´es
Meilleure performance avec allocation proche Affecte l’ordonnanceur, bien s ˆur
Lors du remplacement de page, choisir une frame proche
Thrashing
S’il y a trop peu de m ´emoire physique
Chaque page-fault ´evince une page dont aura bient ˆot besoin CPU sous-utilis ´e
Sous utilisation du CPU peut inciter `a lancer plus de programmes!
Le syst `eme peut paraˆıtre fig ´e pendant plusieurs minutes
Pagination et thrashing
Pagination marche parce que:
•
Ex ´ecution migre de “localit ´e” `a“localit ´e”
•
Localit ´es peuvent se chevaucher•
On peut revenir `a une localit ´e Thrashing•
Taille de localit ´e>
m ´emoire•
Peut se limiter aux processus coupablesMod `ele du working-set
∆
= fen ˆetre du working-set: un certain intervalle de temps•
Un∆
trop petit ne couvre pas toute la localit ´e•
Un∆
trop grand sera pessimiste• ∆
d ´epend typiquement du temps d’acc `es au disque Peut se mesurer en instructions ou en acc `es m ´emoireW SS
i = Nombre de pages r ´ef ´erenc ´ees parP
i pendant∆ D = ΣW SS
i : Taille totale des localit ´es courantesD >
M ´emoire⇒
thrashing: il faut suspendre des processusFr ´equence de page-fault
Autre approche, plus directe, bas ´ee sur un remplacement local D ´ecide d’une fr ´equence acceptable de page-faults
Mesure fr ´equence de page faults pour chaque processus
•
Fr ´equence trop basse: diminuer la m ´emoire allou ´ee au processus•
Fr ´equence trop ´elev ´ee: augmenter la m ´emoire allou ´eeSe fr ´equence trop ´elev ´ee, mais plus de m ´emoire disponible: suspendre
Working-set et fr ´equence de page-faults
Fichiers memory-mapped
Rendre un fichier accessible comme une partie de la m ´emoire R ´eutilise la pagination sur demande
Modifications ´ecrites sur le disque par le code de pagination Partage efficace d’un fichier via
mmap
entre processusPeut acc ´el ´erer ex ´ecution en ´evitant appels syst `emes
read
etwrite
Moins de contr ˆole sur les acc `es disque; pas d’acc `es asynchrone
Exemple de memory mapping
Allocation de m ´emoire noyau
La m ´emoire du noyau est trait ´ee diff ´eremment M ´emoire des processus g ´er ´ee par page
M ´emoire du noyau g ´er ´ee par objet, comme avec
malloc
Certaines adresses sont sp ´eciales
Certaines parties doivent ˆetre contigu ¨es
Allocation style buddy
Utilise une zone m ´emoire contigu ¨e de taille fixe Cette zone est divis ´ee successivement par 2 Chaque chunk occupe un espace de taille
2
nobjet
<
1/
2 chunk⇒
divise Avantage: facile de re-r ´eunir des petits blocs (coalesce)Inconv ´enient: fragmentation, interne et externe
Allocation style Slab
Slab: une ou plusieurs pages, physiquement contigu ¨es
Cache: ensemble de slabs
Chaque cache d ´edi ´e `a un type (ou une taille) d’objets
Cache grandi par slab, divis ´ee en objets (initialement libres)
Utilise le fait que les tailles d’objets ne sont pas al ´eatoires Peu de fragmentation, en pratique
Taille des pages
La taille des pages est parfois impos ´ee, mais pas toujours Facteurs de choix:
•
Fragmentation: mieux vaut des petites pages•
Taille de la table: mieux vaut de grosses pages•
Efficacit ´e du TLB: mieux vaut de grosses pages•
Localit ´e: mieux vaut des petites pages•
R ´esolution: mieux vaut des petites pages•
Co ˆut I/O et page-faults: mieux vaut de grosses pages En g ´en ´eral, les tailles devraient augmenter peu `a peuPr ´epagination
Charger certaines pages d’un processus `a l’avance
•
Pour ´eviter page-faults au d ´emarrage•
Gaspillage si ces pages ne sont pas utilis ´ees•
Gaspillage d’I/O peut ˆetre mineur (acc `es s ´equentiel)•
Minimiser le gaspillage de m ´emoire: candidats `a l’ ´eviction Clustering: lors d’un page fault, amener tout un cluster•
Forme de prefetching•
Simule des pages plus grandes, sans les inconv ´enientsTLB reach
TLB reach: quantit ´e de m ´emoire accessible depuis le TLB
TLB reach = taille TLB
×
taille de page Si trop petit, beaucoup de TLB-missesUtiliser des superpages l `a o `u c’est possibles
G ´erer la localit ´e
int data[128][128];
Quel acc `es choisir:
for (i = 0; i < 128; i++)
for (j = 0; j < 128; j++) data[i, j] = 0;
ou: