Tentatives de bonnes réponses à des questions qui peuvent ne pas l'être |
Mauvaise question !
Pourquoi ? Parce que la mémoire virtuelle n'a jamais été, n'est pas et ne sera jamais un type de mémoire. Il s'agit d'un procédé.
Il a commencé d'être mis en oeuvre au début des années 70 sur les gros ordinateurs centraux. À l'époque la mémoire centrale était difficile à fabriquer, coûtait extrêmement cher et on n'en disposait au mieux que de quelques centaines de ko alors que les programmes devenaient de plus en plus gros. Il a donc fallu trouver un artifice.
On s'est aperçu qu'un programme n'a pas besoin à chaque instant de son exécution de résider intégralement dans la mémoire centrale. Il peut donc être fractionné en plusieurs portions amenées au fur et à mesure en mémoire, l'une chassant l'autre. Cette méthode est appelée recouvrement (overlay).
Le procédé dit de la mémoire virtuelle peut être vu comme une amélioration de cette technique.
Chaque octet de la mémoire est numéroté et peut donc être atteint individuellement grâce à ce numéro. Par analogie avec les numéros des maisons dans une rue on parle d'adresse mémoire. La plage de mémoire à laquelle un processeur peut accéder ne dépend que du nombre de bits disponibles pour coder des adresses. Avec des adresses sur 32 bits, par exemple, en utilisant la numération binaire on peut aller jusqu'à 232 soient 4 Go. Et ceci même si l'ordinateur ne dispose que de 1 G0 de mémoire.
Quand on travaille en mémoire virtuelle on utilise l'intégralité des adresses disponibles sans se soucier de la quantité réelle de mémoire présente. Cet espace d'adressage constitue la mémoire logique. Tout se passe comme si les programmes étaient chargés dans cette mémoire logique.
Dans le cas d'un système d'exploitation multi-tâches la somme des tailles de tous les programmes chargés en mémoire va donc pouvoir être supérieure à la taille de la mémoire physique.
Mais comment fait-on pour caser tout ça dans la mémoire physique ?
Nous avons dit précédemment que les programmes n'avaient généralement pas besoin de résider entièrement en permanence en mémoire. Le problème de place est donc facile à résoudre. Il suffit de prévoir une mémoire auxiliaire, de l'espace disque en l'occurrence, pour y mettre les portions de programmes qui ne servent plus ou qui ne serviront que plus tard.
Il reste cependant un mais. Les adresses invoquées dans les programmes peuvent être plus hautes que la plus haute adresse de la mémoire physique.
Pour résoudre ce problème on a imaginé de dissocier les adresses logiques et les adresse physiques en passant par une table de traduction gérée par le système d'exploitation. Lorsque le programme demande à lire le contenu de l'octet situé à l'adresse logique 5000, on consulte la table, on trouve par exemple que cet octet est en fait à l'adresse physique 3200 et c'est là que la donnée est effectivement lue. Le programme ne voit rien de ce tour de passe-passe.
Les programmes n'utilisent que les adresses logiques et ignorent tout des adresses physiques. Une traduction d'adresse est effectuée à chaque opération de lecture ou d'écriture en mémoire.
La mémoire logique n'est pas gérée octet par octet. Elle est découpée en blocs de taille fixe, souvent 4ko, appelés pages. Un programme et ses données y occupent un nombre entier de pages.
Parallèlement la mémoire physique et elle aussi découpée en blocs de même taille appelés cadres de pages (page frame). Les pages sont chargées dans des cadres de pages.
Ceci facilite la traduction des adresses. L'octet 320 de la page 4200 est aussi l'octet 320 du cadre où a été chargée cette page. Seule une partie de son adresse a besoin d'être traduite.
Le schéma ci-dessous (fig. 1) illustre les mécanismes que nous venons de décrire.
On voit que les pages d'un même programme peuvent être chargés n'importe où dans la mémoire physique. L'attribution d'un cadre de page se fait en fonction des disponibilités.
Nous avons évoqué la nécessité de disposer d'une mémoire auxiliaire pour y conserver les parties de programmes non présentes en mémoire physique. En permanence des pages vont être expulsées de la mémoire physique vers cette mémoire auxiliaire et d'autres au contraire vont effectuer le trajet inverse.
Ce mécanisme est appelé pagination (paging). Dans un sens on parlera de délogement (paging out), dans l'autre de relogement (paging in). Puisque cette mémoire auxiliaire est en fait de l'espace disque on l'appelle fichier de pagination (page file) ou fichier d'échange (swap file).
Quand un programme veut accéder à une page qui n'est pas présente en mémoire, il y a faute de page (page fault) et il doit attendre pour contribuer de s'exécuter que cette page soit relogée. Au préalable il aura peut-être fallu déloger une autre page pour libérer un cadre de page.
Les pages sont délogées et relogées individuellement mais dans certains systèmes d'exploitation on a aussi la possibilité de déloger globalement l'intégralité du jeu de pages relatives à une tâche (working set) afin de libérer la mémoire pour une tâche plus prioritaire.
La mémoire virtuelle permet d'optimiser l'occupation de la mémoire et donc d'améliorer le rendement global d'un ordinateur. On va pouvoir accomplir plus de tâches dans le même temps.
Toutefois les fautes de page ralentissent considérablement l'exécution des programmes. Le temps d'exécution d'une instruction se mesure en nano-secondes alors que les temps de lecture sur disque s'expriment en milli-secondes. Le rapport des échelles de temps est de 1 à 1 million ! Par ailleurs la pagination mobilise le système d'exploitation. Pendant ce temps, les programmes utilisateur ne font plus rien.
Il va donc falloir trouver un compromis entre le nombre de tâches concurrentes et la taille de la mémoire physique. Il existe un taux acceptable de pagination en dessous duquel on tire tout le bénéfice de la mémoire virtuelle. Au-delà les performances globales se dégradent. Si l'on augmente trop la charge on ne fait plus que paginer et plus aucun programme d'application n'arrive à s'exécuter.
De toute évidence la meilleure optimisation de la mémoire virtuelle consiste à faire en sorte que le taux de pagination soit le plus faible possible. Pour cela, outre augmenter la quantité de RAM installée, il faut impérativement faire la chasse à tous les programmes ou services qui se lancent automatiquement au démarrage. Ils occupent de la place en mémoire physique (ils peuvent ne pas être intégralement paginables), et des postes dans les files d'attente. Il sera toujours temps de les mettre en route à la demande. En prime, le temps de démarrage sera raccourci.
Sous Windows, par défaut, le fichier d'échange se trouve sur le disque contenant le système d'exploitation. Quand on dispose de plusieurs disques durs il est recommandé de déplacer ce fichier d'échange vers un disque moins sollicité et, si possible, à accès plus rapide. On gagne ainsi sur les délais induits par la pagination.
Il est également souvent recommandé de limiter la taille du fichier d'échange : 1,5 fois la quantité de RAM sans dépasser 2 Go. Cette mesure a peut-être du bon mais pour juger de son efficacité réelle il faudrait être en mesure de conduire une batterie de tests rigoureux (toutes choses restant égales par ailleurs) donnant des mesures précises. En leur absence tout changement de comportement ne peut être qu'entièrement subjectif.
Sur la toile de nombreux guides indiquent comment réaliser les manipulations concernant ces deux derniers points.
Si l'on a bien compris ce qui précède on voit qu'il s'agit là d'un impardonnable abus de langage. La mémoire virtuelle n'est pas un type de mémoire et elle n'a donc pas de taille ! Ce qu'il est proposé de modifier c'est en fait la taille du fichier d'échange.