V. Gestion de la mémoire centrale

Pour pouvoir utiliser un ordinateur en multiprogrammation, système d’exploitation charge plusieurs processus en mémoire centrale (MC). La façon la plus simple consiste à affecter à chaque processus un ensemble d'adresses contiguës.

Quand le nombre de tâches devient élevé, pour satisfaire au principe d'équitabilité et pour minimiser le temps de réponse des processus, il faut pouvoir simuler la présence simultanée en MC de tous les processus. D'où la technique de "va et vient" ou recouvrement (swapping), qui consiste à stocker temporairement sur disque l'image d'un processus, afin de libérer de la place en MC pour d'autres processus.

D'autre part, la taille d'un processus doit pouvoir dépasser la taille de la mémoire disponible, même si l'on enlève tous les autres processus. L'utilisation de pages (mécanisme de pagination) ou de segments (mécanisme de segmentation) permet au système de conserver en MC les parties utilisées des processus et de stocker, si nécessaire, le reste sur disque.

Le rôle du gestionnaire de la mémoire est de connaître les parties libres et occupées, d'allouer de la mémoire aux processus qui en ont besoin, de récupérer de la mémoire à la fin de l'exécution d'un processus et de traiter le  recouvrement entre le disque et la mémoire centrale, lorsqu'elle ne peut pas contenir tous les processus actifs.










Figure 20. Phases de génération de l’espace d’adressage.

L’espace d’adressage d’un processus est généré par le compilateur et l’éditeur de liens.

V.1. Objectifs d'un gestionnaire de la mémoire.

V.1.1. Rôle

Toute instruction ou donnée de l’espace d’adressage doit être chargée en mémoire centrale (principale, physique) avant d’être traitée par un processeur.

Le gestionnaire de la mémoire est le composant du système d’exploitation qui se charge de gérer l’allocation d’espace mémoire aux processus à exécuter :

        Comment organiser la mémoire ? (une ou plusieurs partitions, le nombre et la taille des partitions fixes ou variables au cours du temps).

        Faut-il allouer une zone contiguë à chaque processus à charger en mémoire ? Faut-il allouer tout l’espace nécessaire à l’exécution du processus entier ? (politique d’allocation).

        Comment mémoriser l’état de la mémoire? Parmi les parties libres en mémoire, lesquelles allouées au processus? (politique de placement)

        S’il n’y a pas assez d’espace en mémoire, doit-on libérer de l’espace en retirant des parties ou des processus entiers? Si oui lesquels ? (politique de remplacement).

        Les adresses figurant dans les instructions sont-elles relatives? Si oui, comment les convertir en adresses physiques.

        Si plusieurs processus peuvent être résident en mémoire, comment assurer la protection des processus (éviter qu’un processus soit altéré par un autre?

V.1.2. Exigence

        Efficacité : la mémoire doit être allouée équitablement et à moindre coût tout en assurant une meilleure utilisation des ressources (mémoire, processeurs et disque).

        Protection : Les processus ne peuvent pas se corrompre.

        Transparence : Chacun des processus doit ignorer l’existence des autres en mémoire.

        Relocation : la possibilité de déplacer un processus en mémoire (lui changer de place).

V.2.  Fonctions.

Le compactage de la mémoire permet de regrouper les espaces inutilisés. Très coûteuse en temps l’unité centrale, cette opération est effectuée le moins souvent possible.

S'il y a une requête d'allocation dynamique de mémoire pour un processus, on lui alloue de la place dans le tas (Thermal-assisted switching) (heap : des parties d'un grand pool de mémoire) si le système d’exploitation le permet, ou bien de la mémoire supplémentaire contiguë à la partition du processus (agrandissement de celle-ci). Quand il n'y a plus de place, on déplace un ou plusieurs processus :

        soit pour récupérer par ce moyen des espaces inutilisés,

        soit en allant jusqu'au recouvrement.

A chaque retour de recouvrement (swap), on réserve au processus une partition un peu plus grande que nécessaire, utilisable  pour l'extension de la partition du processus venant d'être chargé ou du processus voisin.

Il existe trois façons de mémoriser l'occupation de la mémoire : les tables de bits (bits maps), les listes chaînées et les subdivisions (buddy).

V.3.  Modes de partage de la mémoire.

V.3.1. Système mono-programmé








Figure
21. Exemples de système mono-programmé.

        Cas (a): un seul processus en mémoire RAM :Random Access Memory.

        Cas (b): ordinateurs de poche ou systèmes embarqués avec ROM : Read Only Memory.

        Cas (c): MS-DOS: Microsoft Disc Operating System.

V.3.2. Système multiprogrammé

La mémoire est partagée entre le système d' exploitation et plusieurs processus.

Optimisation du taux d'utilisation du processeur en réduisant notamment les attentes sur des entrées-sorties.

Deux préoccupations:

        Comment permettre efficacement la cohabitation de plusieurs processus ?

        Comment assurer leur protection ?

V.3.2.1. Partitions fixes

        La mémoire réservée aux utilisateurs est divisée en un ensemble de partitions.

        Le nombre et la taille des partitions sont fixés à l' avance (lors du chargement du système).

        Les partitions peuvent être égales ou non.

        Le choix du nombre et de la taille des partitions dépend du niveau de multiprogrammation voulu.

        On peut avoir une file par partition ou une file globale.

        L’unité d’allocation est une partition.







Figure 22. Partitions fixes.

V.3.2.2. Partitions variables

Initialement, l’espace mémoire réservée aux utilisateurs constitue une seule partition.

Quand un nouveau processus doit être chargé, on lui alloue une zone contiguë de taille suffisamment grande pour le contenir.

Le nombre et les tailles des partitions varient au cours du temps.

Cette forme d’allocation conduit éventuellement à l’apparition de trous trop petits pour les allouer à d’autres processus : c’est la fragmentation externe.

Solutions:

        Compactage (coûteux et exige que les processus soient relocalisables)

        Allocation discontinue.


Figure 23. Partitions variables.

V.4.  Protection de la mémoire.

V.4.1. Système mono-programmé

Pour protéger le code et les données du système d’exploitation des programmes des utilisateurs, on utilise un registre limite qui indique la limite de la zone réservée aux utilisateurs.

Chaque adresse référencée par un processus est comparée avec le registre limite.


Figure 24. Protection de la mémoire dans un système mono-programmé.

V.4.2. Système multiprogrammé

Comme on ne peut prévoir dans quelle partition sera chargé un processus, les adresses attribuées par le compilateur et l’éditeur de liens aux instructions et aux données d’un programme doivent être relatives à une adresse 0.

Ces adresses relatives seront ensuite translatées en adresses physiques.

La translation peut se faire lors du chargement du processus (utilisée dans OS/360 d’IBM. Les adresses relatives sont remplacées par des adresses absolues (en ajoutant à chaque fois l’adresse de début de la partition).

Cette solution n’est pas intéressante car en remplaçant les adresses relatives en adresses absolues, il ne sera plus possible de déplacer le processus.

Pour éviter la translation d’adresse au cours du chargement d’un processus, une autre solution consiste à doter la machine de 2 registres spéciaux :

        Le registre de base ;

        Le registre limite.

Quand un processus est élu (par l’ordonnanceur), système d’exploitation charge dans le registre de base l’adresse absolue du début de sa partition et dans le registre limite la longueur de la partition.

Durant l’exécution d’une instruction, chaque adresse relative référencée par l’instruction est vérifiée en la comparant avec le contenu du registre limite, afin d’interdire tout accès en dehors de la partition courante.

Les adresses physiques sont obtenues en ajoutant le contenu du registre de base aux adresses relatives.

Avantage : le processus peut être déplacé en mémoire.


Figure 25. Protection de la mémoire dans un système multiprogrammé.

Cette translation doit être rapide.

V.5.  Partage de code.

Un des avantages est le partage de code commun. Particulièrement important pour les systèmes à temps partagé où plusieurs utilisateurs partagent un programme (éditeur de texte, base de données, etc.)

V.5.1. Code partagé

Une copie en lecture seule (code réentrant) est partagée entre plusieurs utilisateurs. Seule la position dans le code change selon les utilisateurs.

Le code partagé doit apparaître au même endroit dans l'espace logique de tous les processus.

 













Figure 26. Une bibliothèque de liens dynamiques (Dynamic Link Library: DLL) utilisée par plusieurs utilisateurs.