PMMU 3, le retour du retour ?
Après le mapping de fichier, il ne nous reste plus qu'à voir l'une des
principales utilisations de la mémoire virtuelle : le swap! Le principe est
le suivant : on utilise la mémoire secondaire (le disque dur, la cartouche,
le réseau) comme lieu de stockage de la mémoire utilisée par le système.
Lorsque que l'on a besoin de cette mémoire secondaire, on la ramène dans la
mémoire principale et le processeur continue son bonhomme de chemin.
L'implémentation utilise toujours le même principe, on utilise la PMMU pour
détecter la présence ou l'absence de la mémoire secondaire en mémoire
principale. Lors d'une abscence, on trouve une place de libre et on recopie
la mémoire secondaire vers la mémoire principale. Le choix d'une place libre
est souvent restreint : en général aucune place n'est libre!
Petits détails techniques
Et oui le monde serait beau sans cette triste réalitée que sont les
ordinateurs. Pour obtenir de bonne performance, il faut bien choisir la
meilleure place libre, c'est à dire celle qui ne va pas être utilisée dans
peu de temps. Or en général, il est très difficile (pour le système) de
connaître à l'avance quelle page mémoire va ou ne va pas être utilisée.
Pour réaliser ce choix, il y a plusieurs possibilités. On peut utiliser
une boule de cristal et choisir de manière aléatoire une place (si on a de
la chance, ça marche bien!). La plus simple est de choisir la première place
qui nous tombe sous la main. Par exemple on peut prendre la dernière place
allouée. Dans ce cas, on gére la liste des places de manière circulaire, et
on utilise un pointeur sur la prochaine place à utilisé. Lors d'une
allocation de place, on prend la place pointé, et on incrémente le pointeur.
Ces approches ne donnent pas de bon résultat. Une approche un peu plus
raffinée consiste à prendre la place utilisée la moins récemment, ou si vous
préférez celle qui commence à voir des toiles d'araignées se former du fait
de son inactivitée. Pour réussir ce tour de passe-passe, on utilise toujours
une liste circulaire des différentes page de mémoire. L'algorithme de
recherche test si une page a été récemment utilisée, si oui, on position le
flag de récente utilisation à faux et on passe la page suivante. Lorsque
l'on à trouver une page qui n'a pas été récemment utilisée, alors on
l'utilise pour le swap. Cet algorithme trouve toujours une place de libre,
même si doit faire le tour des places possibles. De plus il donne de bonne
performance, car on peut supposer qu'une page de mémoire qui n'a pas été
récemment utilisée à de forte chance de ne pas être utilisée prochainement.
Sur ce principe, il existe un algorithme, dit de l'horloge qui possède
deux pointeurs : l'un pour la recherche de nouvelle page physique, l'autre
pour la sauvegarde des pages physiques modifiées. Le comportement du premier
est identique au comportement du pointeur dans la gestion circulaire des
pages, c'est à dire test si la page à été utilisée, modification de ce flag,
... Le second pointeur s'occupe uniquement de la sauvegarde des pages
modifiées et de la modification du flag d'utilisation. On s'arrange pour
garder une distance minimum entre ces deux pointeurs, ceci pour permettre de
ne pas remplacer trop rapidement une page. Le second pointeur est général
géré par un démon (un processus qui tourne tout le temps sur un OS), et il
profite des moments libres pour sauvegarder la mémoire sur le disque dur.
L'implémentation
L'exemple fournit utilise la même base que le mapping de fichier en
mémoire à la différence que le lorsque l'on utilise une page physique, on
vérifie que cette dernière n'a pas été modifiée. Si c'est le cas, on la
sauvegarde sur le fichier de swap (à la Windows), et on peut de nouveau
l'utilisée pour une nouvelle page logique. C'est la seule grande différence
avec le mapping. Cependant, dans l'exemple du précédent numéro, le fichier
mappé n'était pas modifié, donc il n'y avait pas besoin de sauvegarder les
pages physique. Rien n'interdit la modification d'un fichier mappé en
mémoire!
Le programme qui utilise le swap, n'est autre que le célèbre crible
d'Eratosthène (pour trouver des nombres premiers). Le principe est le
suivant : l'élémination des multiples de nombres premiers de l'ensemble des
nombres de départ. Il y a deux programmes d'exemples, l'un utilisant comme
algorithme de remplacement de page une simple gestion circualire, l'autre
utilisant l'algorithme amélioré de la gestion circualire.
Voilà la fin de cette série d'articles sur la pagination, j'espère qu'elle
vous aura interréssée, et vous aura aidé à comprendre un peu mieux le
fonction d'un système d'exploitation, et ces problèmes.
Golio Junior