Gestion des mémoires par l'OS

Introduction à la gestion de la mémoire

Les mémoires sont organisées en niveaux hiérarchiques (voir pages précédentes).

Les programmes et les données nécessaires à une tâche doivent être copiés en Mp pour pouvoir être exécutés par le processeur.

La partie du système d'exploitation responsable de la gestion de la mémoire est le memory manager.

Tâches du memory manager

  • déterminer quelles sont les parties utilisées de la Mp et quelles sont les parties libres.
  • allouer de la Mp aux processus quand ils en ont besoin, en évitant au possible le gaspillage.
  • récupérer la mémoire libérée par la terminaison d'un processus.
  • offrir aux processus des services de mémoire virtuelle, de taille supérieure à celle de la mémoire physique (réelle) disponible au moyen de va et vient (swapping) et de pagination.

Stratégies de gestion de la mémoire

Afin de déterminer la politique de gestion à adopter (storage organization), nous pouvons nous poser les questions suivantes :

  • Devons-nous faire de la place pour un seul utilisateur dans la Mp, ou devons-nous placer les processus de tous les utilisateurs en même temps ?
  • Quand les programmes de plusieurs utilisateurs sont en mémoire en même temps, devons-nous donner à chacun le même espace, ou bien devons-nous diviser la Mp en partitions de différentes tailles ?
  • Si la place est insuffisante, que pouvons-nous retirer de la mémoire ?

Ces différentes questions nous permettent de classer les stratégies :

  • Stratégies de chargement (fetch strategies)
    • Chargement à la demande : ce qui permet de ne charger en mémoire que ce qui est nécessaire.
    • Chargement anticipatif  : permet, selon le principe de localité dans l'espace, de charger anticipativement les éléments d'un bloc, ce qui peut être plus rapide, mais nécessite plus d'espace mémoire.
  • Stratégies de placement : où allons nous placer en Mp le nouveau programme ?
    Ces stratégies peuvent être first-fit, best-fit, worst-fit.
  • Stratégies de remplacement : qui allons nous retirer de la mémoire pour faire de la place pour le nouveau processus (swapping) ?

 

Historique

Les principes de gestion de la mémoire ne se sont pas imposés un jour tels qu'ils sont. C'est le fruit d'une évolution du matériel, de l'usage de ce matériel, des nouvelles technologies, etc. Il me semble qu'il est plus aisé de décortiquer les principes de gestion de manière plus ou moins chronologique, sinon du modèle le plus simple au modèle le plus compliqué, afin de comprendre les principes actuels.

Evolution des organisations de stockage

Utilisateur simple Mémoire réelle Mémoire virtuelle
Partitions fixes Partitions variables Pagination Segmentation Combinaison pagination/segmentation
Adresse absolue Adresse relative (déplacement possible)

Monoprogrammation

Nous pouvons rencontrer cette technique sous le nom de "single user contiguous storage organization".

Au début, un seul utilisateur avait l'accès aux ressources, car il n'était pas possible de protéger le programme d'un utilisateur contre les erreurs et débordements des autres.

Ce type de technique est la plus simple et la plus rapide, car l'utilisateur dispose de toutes les ressources de la machine à lui seul pour l'exécution de ses processus. C'est lui qui décide de la manière de partager la mémoire entre les différentes parties de ses programmes.

Le programmeur doit réaliser tous ses calculs d'adresses avant l'exécution. Il serait par exemple désastreux que le programme utilise des cellules mémoires normalement allouées au système d'exploitation; ce serait probablement un crash système irrécupérable.

Des utilitaires tels que himem.sys sont ensuite créés pour assister l'utilisateur dans la gestion de la mémoire.

Un moyen de protéger la mémoire utilisée par le système d'exploitation est de lui réserver les premières adresses, et d'utiliser un registre (registre de séparation, ou boundary register) qui contient l'adresse de la dernière cellule mémoire occupée par le système. Si le programme tente d'accéder à une cellule mémoire dont l'adresse est inférieure ou égale à l'adresse contenue dans le registre, une erreur système est retournée et le programme ne peut utiliser cet espace.

Algorithme de protection de la zone mémoire de l'OS

Quand le programme doit faire appel à une instruction du système d'exploitation, il le fait au travers d'un system call. Il bénéficie alors du mode kernel, et la vérification du registre de séparation ne s'effectue pas.

Segments de recouvrement (overlays)

Lorsque la taille des programmes est plus grande que la taille physique disponible sur la machine, un fractionnement des processus sera réalisé.

Le problème de ce découpage est que chaque partie (overlay) doit pouvoir être exécutée de manière indépendante des autres parties, car elles accéderont séquentiellement une à une au processeur.

Il est possible de définir une partie des données et du code utilisateur du processus qui restera en Mp durant toute l'exécution du processus. Cette partie permanente sert aux chargements des overlays, au stockage des routines les plus fréquemment utilisées, etc.

Un espace mémoire (overlay area, ou zone interchangeable) dans lequel seront chargées une à une les autres parties du processus. Afin de limiter les remplacements d'overlays, un même module peut être dupliqué dans plusieurs overlays (cette redondance évite de placer en zone permanente des routines qui ne sont communes qu'à quelques overlays).

Cette méthode permet d'éviter un gaspillage d'espace mémoire pour un processus.

 

Multiprogrammation (multiprogramming)

La multiprogrammation a deux avantages :

  • faciliter le développement des programmes en les découpant en modules (processus indépendants).
  • rentabiliser les ressources du processeur (c'est cette particularité qui nous intéresse dans ce cas).

Le but du multiprogramming est de récupérer les temps pendant lesquels le processeur ne travaille pas, par exemple quand un processus est dans le CPU et attend une ressource.

Il est possible d'établir une notion de temps maximum accordé au processus pour effectuer son travail au sein du processeur (quantum). Ce partage de temps du processeur n'est rentable que dans le cas où les informations du processus suivant sont déjà en Mp (sinon nous perdons trop de temps à le monter depuis la Ms).

Si plusieurs processus cohabitent dans la mémoire primaire, nous devons établir des techniques de gestion du partage de la mémoire.

Adressage et protection en multiprogrammation

Cette technique réside dans le partage de l'espace mémoire entre les processus. Le système d'exploitation alloue des zones mémoires aux différents processus, pour qu'ils puissent résider en même temps en Mp.

Le premier problème de ce découpage de la mémoire est la nécessité d'une politique de gestion de la protection des espaces mémoires, pour éviter qu'un processus ne tente d'accéder à l'espace réservé à un autre processus.

L'autre problème réside dans la gestion des adresses utilisées dans le programme. En effet, nous ne sommes plus ici dans le cas d'une gestion simple utilisateur, à qui toute la mémoire est offerte.

Le programme utilise normalement des adresses qui débutent à la cellule qui suit immédiatement la dernière cellule du système. Si nous découpons la mémoire, comment retrouver nos informations entre les adresses réelles de la mémoire et celles du programme ?

Avant la compilation d'un programme, si nous n'avons aucune idée de l'adresse réelle du début du programme, l'éditeur de liens (linker) génèrera des adresses erronées. Le programme ne peut donc être directement exécuté sur la machine.

Deux solutions s'offrent à nous : la traduction de l'adresse absolue, ou l'adressage relatif.

L'adresse peut-être qualifiée de relative car elle se rapporte au début de la partition qui hébergera le processus, ou d'absolue car elle indique un emplacement réel en mémoire.

 

La traduction de l'adresse absolue

Cette technique permet de modifier les adresses par un linker, avant le chargement (loading).

L'éditeur de liens vérifie tous les mots mémoire qui correspondent à des adresses qu'il faut modifier dans le code, et il réalise un index temporaire de la position de toutes ces adresses.

Au moment du chargement du programme dans la partie de mémoire qui lui est réservée, le loader effectue la conversion des adresses en ajoutant à chaque adresse l'adresse de base de la partition mémoire. Ni l'index ni les adresses de départ ne sont chargés en mémoire.

Ce système est rapide car il ne faut plus recalculer les adresses à chaque utilisation du code, mais n'offre aucune souplesse d'utilisation. Si le système d'exploitation place le code dans un autre emplacement mémoire, les adresses ne correspondent plus car la conversion est effectuée au chargement et il n'est plus possible de retrouver les adresses de départ.

Le problème de l'adressage est ainsi résolu, mais pas celui de la protection.

Une technique de protection utilisée par IBM divise la mémoire en blocs de 2Ko, en affectant à chacun une clé de 4 bits.
Le PSW (Program Status Word) contient lui aussi un champ clé de 4 bits, différent pour chaque processus.
Les comparaisons des deux clés lors d'un accès mémoire détermine si cet accès est autorisé ou refusé.

L'adressage relatif

Cette technique utilise un registre qui contient l'adresse du début de la partition dans laquelle réside le programme.

Les adresses sont relatives, car le système doit ajouter la valeur du registre chaque adresse pour trouver l'emplacement en mémoire réelle.

Ce type d'opération est réalisé à chaque lecture du code, ce qui est plus coûteux en temps cpu, mais la gestion est plus souple. Le système peut donc déplacer un processus d'une partition vers une autre, il lui suffit de modifier l'adresse de début de partition dans le registre.

 

Mémoire virtuelle

Tous les processus à exécuter doivent se trouver au minimum en Mp pour pouvoir accéder au CPU. Mais l'espace mémoire que peut utiliser un processus est actuellement de 4 Go, car le bus de données pour l'adressage est de 32 bits (Pour info, le microprocesseur UltraSPARC supporte dès 1995 les données et adresses mémoire en 64bits, ce qui lui permettait 4 milliards de fois plus d'adresses qu'une architecture 32 bits).

Même si nous retrouvons de plus en plus grosses quantités de mémoire RAM dans les machines actuelles, il faut imaginer le nombre de programmes qui tournent en Mp...

Il est apparu évident très tôt dans l'histoire de l'informatique qu'il était nécessaire de pouvoir bénéficier de plus de mémoire que la mémoire primaire ne pouvait en fournir. La mémoire virtuelle est née de ce besoin.

Pour plus d'informations sur la gestion de la mémoire virtuelle, vous pouvez consulter la page qui y est consacrée.

Swapping

Cette technique, présente dès les premiers systèmes de temps partagé, consiste à libérer la Mp par l'utilisation d'un espace en Ms. Le fait de remonter en Mp un processus réactivé est le swap in, tandis que le fait de placer un processus inactif en Ms est le swap out.

 

Document créé le 07/05/04 05:04, dernière modification le 28/06/17 14:26
Source du document imprimé : https://www.gaudry.be/systeme-exploitation-gestion-memoire.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.