Bonjour à tous,
Je souhaite prendre de l'avance sur ma troisième année d'info et pour ce faire je révise actuellement tout ce qui est mémoire primaire ("mécanisme d'adressage", "pagination", "segmentation" et "mémoire d'un processus UNIX" - termes issus du programme de ma fac).
Du coup je cherche des cours sur Internet, des vidéos d'explications, je pose des questions sur des forums, etc. etc. Et pour m'assurer que ce que j'apprends est correct, j'aimerais que vous me donniez votre avis, si possible, sur le "mini-tuto" qui suit, s'il vous plaît.
SOMMAIRE
PARTIE 1. Mécanismes d'adressage
-> Enjeux et raison d'être des mécanismes d'adressage
-> Deux mécanismes d'adressage
->-> Définition : un Registre
->-> Premier mécanisme : le Fence-register, ou "Registre-barrière"
->-> Second mécanisme : le Base-register (Registre de base)
->-> Qui fait usage de ces mécanismes d'adressage ?
PARTIE 2. Mémoire d'un processus UNIX dans le cas d'une mémoire contiguë.
-> Mémoire contiguë et mémoire non-contiguë
-> Définition de "mise en mémoire d'un processus UNIX"
-> Trois algorithmes de mise en mémoire des processus
-> Compactage (défragmentation)
Bientôt : Mémoire virtuelle (pagination, segmentation et mémoire d'un processus UNIX dans le cas d'une mémoire virtuelle, donc non-contiguë)…
PARTIE 1. Mécanismes d'adressage
Enjeux et raison d'être des mécanismes d'adressage
Pour parler de ces mécanismes, il faut d'abord définir la RAM. Elle est représentable par un tableau à une dimension. Il est indexé et l'index utilisé est une adresse (de valeur 0 à FFFFF). Une case de ce tableau s'appelle un mot.
Toute donnée peut être stockée dans la RAM : les processus en exécution, des valeurs, des adresses, etc.
Le moniteur est la partie du noyau qui s'occupe des adressages voulus par l'OS. Il est stocké en début de RAM (à partir de l'adresse physique - donc pas logique - 0). Le moniteur peut accéder à n'importe quel mot de la RAM.
Quand on écrit un programme, on va chercher à accéder à la RAM, en écriture notamment. Il faut donc protéger les premiers mots de la RAM puisqu'il y a le moniteur du noyau dedans. On ne peut donc pas allouer n'importe comment : des mécanismes d'adressage ont été inventés pour protéger le moniteur du noyau.
Deux mécanismes d'adressage
Définition : un Registre
Avant d'aller plus loin, il faut expliquer ce qu'est un registre : c'est une petite unité de stockage :).
Premier mécanisme : le Fence-register, ou "Registre-barrière"
Mettons qu'un programmeur veuille allouer une adresse de la RAM. Comme on l'a dit précédemment, il ne faut pas qu'il n'interfère avec le moniteur du noyau. Voici le concept de ce mécanisme :
-
Lors de la fabrication de la machine, on inscrit dans un registre la valeur qui correspond à l'adresse où le stockage du moniteur est enfin complet. Le registre ainsi utilisé est appelé le "fence register" et a donné son nom au mécanisme.
-
Après la fabrication de la machine, et le démarrage de celle-ci, toute tentative d'allocation d'une adresse de la RAM suit le chemin suivant : si l'adresse qu'on souhaite allouer est plus petite ou égale à la valeur du fence register, alors l'allocation est interdite et une interruption est émise : on n'a pas le droit d'accéder en écriture (de modifier) ou de lire les mots de la RAM utilisés par le moniteur du noyau. Sinon, tout va bien, tout est OK.
Ce mécanisme possède 3 inconvénients :
- Il nécessite que toute, absolument toute, tentative d'allocation passe par cette vérification (du coup c'est pas rapide) ;
- Si on veut protéger non seulement le moniteur du noyau mais également d'autres mots (contigüs aux mots du moniteur), c'est difficile car la valeur du fence register est souvent fixe ;
- Le programmeur ne va pas pouvoir utiliser des adresses dans la plage [0;FFF] mais seulement dans ]valeur_fence_register;FFF] et ce n'est pas du tout pratique pour lui.
Pour régler l'inconvénient n°3, on a inventé un nouveau mécanisme d'adressage : le base register.
Second mécanisme : le Base-register (Registre de base)
Ce mécanisme redonne au programmeur la possibilité d'allouer des adresses de la RAM dans la plage [0;FFF], ce qui n'est pas permis par un fence-register.
Explications du mécanisme.
-
Au lieu d'avoir un fence-register, on a un base-register. Le base-register contient la même valeur que le fence-register (à savoir "l'adresse où le stockage du moniteur est enfin complet").
-
Mais ici, aucune comparaison mathématique n'a lieu contrairement au fence-register. Au lieu de ça, on procède à une addition : adresse_tentative_allocation + valeur_base_register.
-
Le résultat de cette opération est une adresse qui est forcément plus grande que celle du mot de la fin du stockage du moniteur. Le programmeur peut ainsi allouer des adresses commençant par 000 (incluse) sans pouvoir accéder au moniteur. Aucune interférence programmeur-moniteur n'est donc possible.
Ce mécanisme a l'avantage que le programmeur n'a pas besoin de connaître la valeur du base-register (il le devait dans le cas du fence-register). Tout est transparent pour lui.
Qui fait usage de ces mécanismes d'adressage ?
L'OS (le moniteur du noyau de l'OS plus précisément). C'est l'OS qui s'occupe de toute la gestion de la RAM. Ainsi le programmeur n'a pas besoin d'y penser.
Fin de la partie "Mécanismes d'adressage".
PARTIE 2. Mémoire d'un processus UNIX dans le cas d'une mémoire contiguë.
Mémoire contiguë et mémoire non-contiguë
Avant d'aller plus loin, il nous faut définir les termes "mémoire contiguë" et "mémoire non-contiguë".
Mémoire contiguë : désigne une RAM que seul un OS qui n'est pas en temps-partagé (donc pas multi-tâches) peut utiliser. C'est-à-dire que les processus qui y sont stockés lors de leur exécution ne peuvent pas y être présents par petits bouts, par parties : ils y sont présents en entier, chacun.
Mémoire non-contiguë : cette RAM peut être utilisée par un OS qui est ou n'est pas en temps-partagé (donc qui est ou n'est pas multi-tâches). C'est-à-dire que les processus qui y sont stockés lors de leur exécution peuvent être découpés en parties, et ces parties sont stockées en RAM à des mots différents. Les mots les contenant peuvent être précédés ou suivis par des mots contenant des parties d'autres processus.
Cette partie ne traite de la mémoire des processus UNIX que dans le cadre d'une mémoire contiguë.
Définition de "mise en mémoire d'un processus UNIX"
Lors de son exécution, un processus est stocké dans la RAM (autrement dit : ses données, à savoir ses instructions Assembleur et autres). Si sa taille fait pile-poil la taille d'un mot, alors ce mot est bien évidemment totalement rempli par le processus. Si sa taille est plus petite que la taille d'un mot, alors ce mot n'est pas totalement rempli, évidemment. Si sa taille est plus grande que la taille d'un mot, au moins un mot sera totalement rempli, autant de mots que nécessaires seront totalement, et un mot au plus ne sera pas totalement rempli.
Comme diverses données sont stockées dans la RAM, il peut arriver que celle-ci ne présente pas assez de place pour accueillir un processus. Même si une RAM donnée présente plusieurs mots vides, tous plus petits que la taille d'un processus donné, mais qui pourtant font la aille de ce dernier quand on les cumule, le processus dont nous parlons ne pourra y être stocké car nous sommes dans le cas d'une mémoire contiguë et il est impossible de dispatcher un processus en parties.
Ainsi donc, si la RAM ne présente pas assez de place pour accueillir un processus, alors ce dernier n'est pas mis en mémoire, mais il est mis en attente de mise en mémoire.
Trois algorithmes de mise en mémoire des processus
Note : le terme "bloc" désigne "ensemble de mots (vides) dont la cardinalité est supérieure ou égale à 1".
Pour mettre en RAM un processus, l'OS (le moniteur du noyau) implémente l'un des algorithmes suivants (le premier est le meilleur en terme de rapidité, le second est moins bon et le troisième est à éviter).
- Algorithme "First-fit" : Le premier bloc suffisamment grand pour contenir le processus ;
- Algorithme "Best-fit" : Le plus petit bloc suffisamment grand pour contenir le processus ;
- Algorithme "Worst-fit" : Le plus grand bloc suffisamment grand pour contenir le processus.
Compactage (défragmentation)
Ce concept consiste à optimiser la gestion de la mise en mémoire des processus UNIX.
On déplace les processus en mémoire de façon à rendre contigus les mots vides (c'est plus propre et c'est mieux :)).