Ecole Nationale d’Ingénieurs de Sousse
Principes généraux des systèmes d’exploitation
Gestion de la Mémoire Centrale
1 A - ENISO 2009 / 2010
1
Cycle de vie D’un programme
1 A - ENISO 2009 / 2010
2
Liaison d’adresse
Habituellement, un programme réside comme un fichier binaire exécutable sur disque. Le programme doit être chargé en mémoire et placé dans un processus afin d’être exécuté. La plupart des systèmes autorisent un processus à résider n’importe ou dans la mémoire. En général : un programme traversera plusieurs pas avant d’être exécuté.
1 A - ENISO 2009 / 2010
3
Liaison d’adresse On peut effectuer la liaison d’instructions et de données à des adresses mémoire :
Au moment de la compilation Au moment du chargement Au moment de l’exécution
1 A - ENISO 2009 / 2010
4
Moment de compilation
Si on connaît au moment de la compilation où réside le processus en mémoire, on peut générer du code absolu. Par exemple, si on sait à priori qu’un processus utilisateur réside en commençant à l’adresse R, le code du compilateur généré démarrera donc à cet emplacement et s’étendra à partir de là. Si plus tard, l’emplacement change, il sera donc nécessaire de compiler à nouveau le code. 1 A - ENISO 2009 / 2010
5
Moment de chargement
Si on ne connaît pas au moment de la compilation l’endroit où résidera le processus en mémoire, le compilateur doit donc générer du code translatable. Dans ce cas, la liaison finale est reportée jusqu’au moment du chargement. Si l’adresse de début change, nous devons seulement recharger le code utilisateur 1 A - ENISO 2009 / 2010
6
Moment de l’exécution
Si on peut déplacer le processus pendant son exécution d’un segment de mémoire à un autre, la liaison doit donc être retardée jusqu’au moment de l’exécution.
1 A - ENISO 2009 / 2010
7
Chargement dynamique
On ne charge pas une routine avant qu’elle soit appelée. Une routine non utilisée n’est jamais chargée. Quand des grandes quantités de code sont nécessaires pour manipuler des cas qui se produisent rarement : routines d’erreur. 1 A - ENISO 2009 / 2010
8
Edition de liens dynamiques
Editions de liens statiques : les bibliothèques des langages du système sont traitées comme tout autre module objet et sont combinés par le chargeur dans une image binaire. Editions de liens dynamiques : plutôt que de reporter le chargement jusqu’au temps d’exécution, on reporte l’édition des liens. Cette caractéristique peut être étendue à des actualisations de la bibliothèque. On peut remplacer une bibliothèque par une nouvelle version. Ce système est également connu comme bibliothèques partagées. 1 A - ENISO 2009 / 2010
9
Recouvrement
Afin qu’un processus puisse être plus grand que la quantité de mémoire que l’on lui a allouée, on utilise le recouvrement L’idée est de maintenir en mémoire seulement les instructions et les données nécessaires à chaque moment donné ; quand on besoin d’autres instructions, elles sont chargées dans l’espace précédemment occupé par des instructions qui ne sont plus nécessaires. 1 A - ENISO 2009 / 2010
10
Swapping
Un processus doit être en mémoire pour être exécuté. Cependant, un processus peut être transféré temporairement de la mémoire principale à une mémoire auxiliaire et être ensuite ramené en mémoire pour continuer son exécution. Quand une tranche de temps expire, le gestionnaire de la mémoire commencera à transférer en mémoire auxiliaire (swap out) le processus qui vient de finir et à ramener (swap in) un autre processus à l’espace mémoire libéré 1 A - ENISO 2009 / 2010
11
Swapping
1 A - ENISO 2009 / 2010
12
Swapping
Normalement, un processus transféré en mémoire auxiliaire est ramené au même espace mémoire qu’il occupait précédemment. Cette restriction est imposée par la méthode de liaison d’adresses : Moment de chargement déplacement impossible Moment de l’exécution déplacement possible Le système assure la maintenance d’une file d’attente des processus prêts constituée de tous les processus dont les images mémoire se trouvent dans la mémoire auxiliaire ou dans la mémoire principale et qui sont prêts à être exécutés.
1 A - ENISO 2009 / 2010
13
Contraintes Si on désire transférer un processus, on doit être sûr qu’il est complètement inactif. Les entrées/sorties en cours sont d’un intérêt particulier. Si un processus attend une opération d’E/S ? ? ?
Deux possibilités :
ne jamais transférer un processus avec des E/S en cours exécuter les opérations d’E/S seulement dans les buffers du système. 1 A - ENISO 2009 / 2010
14
Allocation contigüe de la MC
La mémoire est habituellement divisée en deux partitions, une pour le système d’exploitation résident et l’autre pour les processus utilisateur Mémoire centrale MC
1 A - ENISO 2009 / 2010
15
Allocation d’une partition unique
La totalité d’un processus est chargé dans une seule partition : on doit protéger le code et les données du système contre les modifications (accidentelles) des processus utilisateur. On a besoin également de protéger les processus utilisateur entre eux. registre translation et registre limite Le registre de translation contient la valeur de l’adresse physique la plus petite ; le registre limite contient l’étendue des adresses logiques.
1 A - ENISO 2009 / 2010
16
Allocation d’une partition unique
1 A - ENISO 2009 / 2010
17
Allocation de plusieurs partitions
subdiviser la mémoire en un certain nombre de partitions fixes chaque partition peut contenir exactement un processus le degré de multi-programmation est limité par le nombre de partitions quand une partition est libre, on sélectionne un processus à la queue d’entrée et on le charge dans la partition libre. Quand le processus se termine, la partition devient disponible pour un autre processus. Le SE maintient une table indiquant les partitions mémoire disponibles et celles qui sont occupées. Au début, toute la mémoire est disponible pour les processus utilisateur, et elle est considérée comme un grand bloc libre
1 A - ENISO 2009 / 2010
18
Les partitions de taille fixe
Tout espace inutilisé dans la partition est perdu car on ne cumule pas des espaces appartenant à des partitions voisines : c’est un problème de fragmentation interne. La description de la mémoire nécessite la connaissance des adresses d'implantation de chaque partition. Pour chaque partition : Un registre de base renferme l'adresse de début, Un registre limite permet de pointer la dernière adresse. Quand le processus se termine, la partition redevient libre pour un autre processus.
Les partitions de taille fixe 0 @1 @2
@ limite
Partition 2
Processus 2 @3 Processus 3
Partition 1
@ de base
@4
Partition 3 Partition 4 ….
@N Partition N
Espace utilisateur
Processus 1
Système d’exploitation
Les partitions de taille variable
Considérer la mémoire disponible pour les utilisateurs comme un seul espace, Plutôt que de diviser la mémoire en un ensemble fixe de partitions, un SE peut choisir de placer des processus dans tout emplacement de mémoire inutilisé quel qu'il soit. Quand un processus arrive en demandant de la mémoire, nous recherchons un espace suffisamment grand pour ce processus. Nous allouons seulement la quantité de mémoire nécessaire, laissant le reste disponible pour satisfaire des futures requêtes. Si l’espace est trop grand, il est découpé en deux : une partie est allouée au processus, l'autre est renvoyée à l'ensemble des espaces libres. inconv: une demande peut ne pas être satisfaite faute d'un espace de taille suffisante, bien que la somme des tailles des zones libres soit supérieure à cette demande : c’est la fragmentation externe.
Exemple
1 A - ENISO 2009 / 2010
22
Exemple : Exécution
1 A - ENISO 2009 / 2010
23
Algorithmes d’allocation Quand un processus arrive, on cherche dans cet ensemble un trou suffisamment grand pour le processus : Allocation dynamique de la mémoire. Les stratégies employées pour sélectionner un trou libre à partir d’un ensemble de trous sont :
First-fit (le premier trouvé) : alloue le premier trou suffisamment grand.
Best-fit (le meilleur choix) : alloue le trou le plus petit suffisamment grand. Worst-fit (le plus mauvais choix) : alloue le trou le plus grand. 1 A - ENISO 2009 / 2010
24
First fit
Espace = structure { adresse_debut : entier ; taille : entier ; état : logique } M P V = vecteur [1..N M AX ] de espace
Algorithme First-Fit (liste_espace_libre, taille_demandée) Liste_espace_libre : vecteur [1..N] de espace Début i1 Tant que ( (i<=N) et (liste_espace_libre[i].taille < taille_demandée) )
fin
Faire ii+1 Fin faire Si (i>N) alors erreur ; Si non charger (taille_demandée, liste_espace_libre[i]) Fin si
1 A - ENISO 2009 / 2010
25
Fragmentation de la MC Fragmentation externe
Au fur et à mesure que les processus sont chargés et supprimés de la mémoire ; l’espace de mémoire libre est découpé en petites parties. La fragmentation externe se présente quand il existe un espace mémoire total suffisant pour satisfaire une requête, mais il n’est pas contigu.
1 A - ENISO 2009 / 2010
26
Fragmentation interne
La figure suivante illustre un autre problème rencontré avec le schéma d’allocation de plusieurs partitions. Si nous allouons exactement le bloc requis, il reste un trou de 2 octets. Ainsi la mémoire allouée peut être légèrement plus grande que la mémoire requise : cette différence est appelée fragmentation interne.
1 A - ENISO 2009 / 2010
27
Algorithme worst-Fit (liste_espace_libre, taille_demandée) Liste_espace_libre : vecteur [1..Nmax] de espace max , indice_max : entier Début Max liste_espace_libre[1].taille indice_max 1 Pour i 1 jusqu’à N faire si (liste_espace_libre[i].taille >max) alors max liste_espace_libre[i].taille indice_max i fin si Fin pour Si (max < taille_demandée) alors erreur ; Si non
charger (taille_demandée, liste_espace_libre[indice_max])
fin
Fin si
1 A - ENISO 2009 / 2010
28
Algorithme Best-Fit (liste_espace_libre, taille_demandée) Liste_espace_libre : vecteur [1..Nmax] de espace best, indice_best : entier Début best 100000000000 indice_best 0 Pour i 1 jusqu’à N faire si (liste_espace_libre[i].taille >= taille_demandée) alors si ( liste_espace_libre[i].taille <= best) alors best liste_espace_libre[i].taille indice_best i fin si fin si Fin pour Si (indice_best = 0) alors erreur ; Si non charger (taille_demandée, liste_espace_libre[indice_best]) Fin si fin 1 A - ENISO 2009 / 2010
29
Exercice d’application
On considère un système dont l'espace mémoire compte 1 Mo. On décide d'effectuer une partition fixe de cet espace mémoire en 3 partitions de tailles respectives 600 Ko, 300 Ko, 100 Ko. Donner les états de la mémoire dans le cas suivant : L'ordonnanceur est en SJF et le mode d'allocation utilise un algorithme de Best Fit. File des demandes
Processus A B C D E F
Taille mémoire 200 Ko 400 Ko 400 Ko 80 Ko 200 Ko 300 Ko
Temps d’arrivée 0 10 30 40 50 70
Durée d’exécution 35 65 35 25 55 15
t = 10 SE
t = 30 SE
t = 35 SE
t = 40 SE
t = 50 SE
t = 65 SE
B 65
B 45
B 40
B 35
B 25
B 10
200 Ko
200 Ko
200 Ko
200 Ko
200 Ko
200 Ko
A 25 100 Ko 100 Ko
A5 100 Ko 100 Ko
300 Ko
300 Ko
100 Ko
A 35 100 Ko 100 Ko
100 Ko
D20 25 Ko
E 55 100 Ko D20 15 Ko
E 40 100 Ko 100 Ko
t = 70 SE
t = 75 SE
t = 90 SE
t = 105 SE
t = 125 SE
B5
F 15
C 35
C 20
200 Ko
300 Ko
200 Ko
200 Ko
E 35 100 Ko 100 Ko
E 30 100 Ko 100 Ko
E 15 100 Ko 100 Ko
300 Ko
300 Ko
100 Ko
100 Ko
SE 600 Ko
300 Ko
t=0 SE 600 Ko
600 Ko