Gestion de la mémoires virtuelle

Comme nous l'avons vu dans les principes de gestion de la mémoire, chaque processus peut utiliser 32 bits d'adresses, ce qui lui donne la possibilité d'adresser 4Go de Mp.

Il est clair que les capacités matérielles de la machine ne permettent pas de répondre à la demande possible de 4Go par processus. Nous sommes donc contraints à utiliser une mémoire dite virtuelle car elle n'est pas réellement en mémoire primaire, mais bien en mémoire secondaire.

La mémoire virtuelle offre donc la possibilité d'adresser un espace mémoire plus important que ce qui est réellement disponible en Mp.

Une correspondance devra donc être établie par le système d'exploitation, entre les adresses de la mémoire virtuelle et les adresses réelles. Cette opération est appelée le mapping.

Comme il existe plusieurs manières d'effectuer la conversions entre les adresses réelles et virtuelles, des mécanismes sont mis en place : les DAT (Dynamic address translation).

Le point commun entre toutes ces techniques est que les adresses virtuelles d'un processus occupent un espace contigu, mais que ces espaces sont répartis à différents endroits de la mémoire réelle, de manière non contiguë. Le terme utilisé pour décrire cette notion est la contiguïté artificielle (artificial contiguity).

Nous retrouverons deux grands types de techniques de gestion de la mémoire virtuelle :

  • le paging : division de la mémoire en parts égales.
  • la segmentation : division en parts inégales.

Les systèmes d'exploitation peuvent utiliser une technique ou l'autre, ou même une combinaison des deux. Le type de gestion actuellement adopté par Windows est la segmentation paginée (découpage en segments de tailles variables, composés de pages de petites tailles égales).

Dans un système de pagination, un compromis devra être adopté par le système d'exploitation, entre :

  • d'une part, des petits blocs plus faciles à monter en Mp mais nécessitant plus de temps gestion à cause de leur nombre.
  • d'autre part, des blocs de taille plus importante dont les permutations sont moins fréquentes mais qui peuvent contenir de nombreuses informations non nécessaires (gaspillage de la mémoire).

 

Chargement dynamique de la mémoire

Le terme chargement dynamique désigne le fait qu'une fonction n'est chargée en mémoire qu'au moment de son appel.

Les fonctions doivent impérativement pouvoir être indépendantes les unes des autres, et repositionnables (relocation principle).

Dans les cas d'overlay ou de systèmes de chargement dynamique, et le programmeur requiert une parfaite connaissance du système.

 

Block mapping

Les mécanismes DAT assurent la conversion des adresses virtuelles en réelles, mais imaginons un instant que ce mapping se fasse pour chaque mot (groupe de bits) en mémoire... La quantité d'informations nécessaires à ces conversions serait tellement importante qu'il est possible qu'elle prenne plus de place que la place nécessaire en mémoire pour les informations.

Une méthode générale est mise en place pour éviter de devoir adresser entièrement chaque mot : le travail en blocs.

Chaque adresse virtuelle sera donc composée d'un numéro de bloc (b) , et du déplacement (d) nécessaire au sein de ce bloc pour trouver l'information.

bloc mapping

Chaque processus possède sa propre table de blocs (block map table) maintenue dans la mémoire réelle par le système.

Dans cette table, chaque bloc du processus est stocké séquentiellement, ce qui permet de conserver l'ordre d'exécution du programme par rapport au début du bloc.

Un registre spécial (block map table origin register) doit donc mémoriser le début du bloc, pour trouver la bonne table de bloc et assurer la conversion de l'adresse virtuelle en réelle.

Notes relatives au schéma

Len : longueur du bloc (length), car tous les blocs n'ont pas forcément la même taille.

b' + d : dans le cas où les blocs ne sont pas de taille identique, une réelle addition est nécessaire, il n'est pas possible de simplement concaténer le déplacement avec l'adresse.

 

Pagination

Dans le cas d'une pure pagination, les blocs sont de taille identiques.

Les adresses virtuelles dans un système paginé sont composées d'un numéro de page, et du déplacement nécessaire pour référencer l'élément au sein de cette page.

Un processus ne peut être exécuté que s'il se trouve en Mp. En pagination simple, la totalité du programme doit se trouver en Mp lors de l'exécution.

Les pages peuvent être copiées en blocs (pages frames) de la Ms vers la Mp.

La pagination présente l'avantage d'une gestion simple (taille des pages constante), mais avec une fragmentation interne dans la dernière page du programme (car il reste de la place mémoire non occupée).

Adressage en pagination

Une combinaison de deux techniques est utilisée pour l'adressage de la mémoire paginée : le mapping direct, et le mapping associatif.

Mapping direct

Le principe (que ce soit en mapping direct, ou mapping associatif) reste identique à celui du mapping par blocs, mais dans le cas d'une pagination nous ne devons plus nous préoccuper de la taille de la page (elles possèdent toutes une taille identique).
Le déplacement peut donc être concaténé à l'adresse de la page (il est simplement mis à la suite).

Pagination (Mapping direct)

Dans le cas d'une pagination en mapping direct, l'adresse d'origine du bloc qui contient les pages du processus (b) est additionnée au numéro de page (p) trouvé dans la table des pages, ce qui nous permet de trouver p' (adresse réelle de la page).

Ensuite, le déplacement est collé à la suite de p' pour référencer exactement l'élément désiré.

 

Mapping associatif

Comme ce travail de conversion des adresses est coûteux en temps, si l'élément a déjà été référencé, il est possible que le système en ait encore besoin prochainement (principe de la localité dans le temps).
Le système d'exploitation mémorisera donc un certain temps l'adresse dans sa mémoire cache.

Pagination (Mapping associatif)

La mémoire cache travaille de manière associative. C'est à dire qu'elle travaille avec une clé (ici l'adresse) qu'elle présente simultanément à toutes les clés des éléments en mémoire.
Si une des clés correspond, l'élément est celui recherché. C'est beaucoup plus rapide que le travail de la Mp.

Au lieu de faire une conversion en mapping direct, le système vérifiera en premier lieu dans la Mc si l'adresse de l'élément désiré est présente. Si c'est le cas l'adresse réelle de la page est trouvée (page frame number), et le système peut simplement y coller la valeur du déplacement.

Si l'adresse n'est pas présente dans la mémoire cache, le système de mapping direct est alors employé, et le résultat est mis en cache pour le cas où le système en aurait besoin prochainement (localité dans le temps).

 

Partage d'une page mémoires

En pagination, il est possible de partager une page entre plusieurs processus. C'est un moyen pour ces derniers de partager une information.

Si la donnée est non modifiable (une donnée statique par exemple), dans la table de chaque processus qui désire accéder à cette information, une entrée doit correspondre à l'adresse réelle de la zone mémoire partagée.

Dans le cas d'une donnée modifiable (variable d'un programme), le système doit impérativement mettre en place une stratégie de gestion des accès à cet emplacement partagé.

Imaginons qu'une zone mémoire du processus A soit partagée avec le processus B :

  • Le programme A utilise le processeur et lit la valeur de la variable partagée.
  • Son quantum expire entre temps, il sauve ses registres et libère le CPU.
  • Le programme B bénéficie du CPU et lit la variable partagée, puis il libère le processeur.
  • Le programme A modifie la variable (qui était mémorisée dans la partie active du processus A) et écrit le résultat de son opération dans la zone mémoire partagée.
  • Le programme B ne peut pas savoir que la valeur de la variable (qui était mémorisée dans la partie active du processus B) ne correspond plus à la valeur actuelle en mémoire partagée.
  • Le programme B écrase donc l'information résultante de l'opération du programme A.

 

Segmentation des mémoires

Dans la partie relative à la gestion de la mémoire réelle, nous avons vu que dans le cas d'utilisation de partitions de tailles variables en multiprogrammation permettait de gagner de l'espace mémoire.

Le problème de la mémoire réelle réside dans l'obligation de placer les différents éléments du programme en zones contiguës. Nous ne sommes pas tributaires de ce genre d'obligation dans le cas de la segmentation.

 

Document créé le 07/05/04 07:42, dernière modification le 28/06/17 15:26
Source du document imprimé : https://www.gaudry.be/systeme-exploitation-memoire-virtuelle.html

L'infobrol est un site personnel dont le contenu n'engage que moi. Le texte est mis à disposition sous licence CreativeCommons(BY-NC-SA). Plus d'info sur les conditions d'utilisation et sur l'auteur.