Académique Documents
Professionnel Documents
Culture Documents
Systèmes d’exploitation
MAHSEUR MOHAMMED
Deuxième Année Licence
Informatique
2023/2024
I. Chapitre 1 : Introduction
1. Notion de système d’exploitation
Un système d’exploitation est une couche de logiciels, sa fonction est de
masquer la complexité du matériel et de proposer des instructions plus simples
pour l’utilisateur.
Un système d’exploitation est un gestionnaire de ressources.
Un système d’exploitation est un ensemble de programmes qui réalisent
l’interface entre le matériel de l’ordinateur et les utilisateurs, afin de construire
une machine virtuelle plus facile d’emploi et plus conviviale (facile pour un
utilisateur non professionnel).
2. Fonctions et rôles
Offrir une interface agréable et simple aux utilisateurs
Offrir une interface indépendante de l’architecture de l’ordinateur
Contrôler l’intégrité et la confidentialité des informations de ses utilisateurs
Assurer une gestion optimale des ressources :
Gestion du processeur
Gestion des fichiers
Gestion des entrées/sorties
Gestion de la mémoire
Gestion de la concurrence
Gestion de la protection
Gestion des accès au réseau
[1]
4. Position du système d’exploitation dans un système
informatique
Un système informatique peut être vu comme un ensemble de couches :
[3]
II. Chapitre 2 : La gestion du processeur
Les premiers systèmes d’exploitation ne permettaient d'exécuter qu'un seul
programme à la fois. Ce programme avait l’accès à toutes les ressources du
système. En revanche, les systèmes informatiques actuels permettent à plusieurs
programmes d'être chargés en mémoire et exécutés simultanément. Cette
évolution a nécessité un contrôle plus ferme et un plus grand cloisonnement des
différents programmes ; et ces besoins ont abouti à la notion de processus
1. Définitions
a. Notion de programme
C’est une entité passive, comme un fichier contenant une liste d'instructions
stockées sur disque (souvent appelé fichier exécutable). Un programme devient un
processus lorsqu'un fichier exécutable est chargé en mémoire.
b. Notion de processus
C’est un programme en cours d'exécution, c’est plus que le code du programme. Il
comprend également l'activité en cours, représentée par la valeur du compteur de
programme et le contenu des registres du processeur. Un processus comprend
généralement la pile de processus, qui contient des données temporaires (telles
que des paramètres de fonctions, des adresses de retour et des variables locales),
et une section de données, qui contient des variables globales. Un processus peut
également inclure un tas, qui est une partie mémoire allouée dynamiquement
pendant l'exécution du processus. La structure d'un processus en mémoire est
illustrée dans la figure suivante :
[4]
Remarque : on peut trouver plusieurs processus associés au même programme, ils
sont néanmoins considérés comme deux séquences d'exécution distinctes. Par
exemple, un utilisateur peut lancer plusieurs copies du programme de navigateur
Web. Chacun de ces éléments est un processus distinct ; et bien que les sections de
texte soient équivalentes, les sections de données, de tas et de pile varient.
c. Types de processus
a) Processus système
Processus lancé par le système (init processus père de tous les processus système
sous Unix)
b) Processus utilisateur
Processus lancé par l’utilisateur (commande utilisateur)
d. Création/Terminaison de processus sous Unix
La création de processus se fait par l’appel système Fork
La terminaison se fait par l’appel système Kill
Lors de sa création, un processus reçoit les paramètres suivants :
PID : identificateur de processus (numéro entier unique)
PPID : identificateur du processus père
UID : identificateur de l’utilisateur qui a lancé le processus
GID : identificateur du groupe de l’utilisateur qui a lancé le processus
e. Bloc de contrôle de processus
Chaque processus est représenté dans le système d'exploitation par un bloc de
contrôle de processus. Il contient de nombreuses informations associées à un
processus spécifique, notamment :
État du processus : l'état peut être nouveau, prêt à fonctionner, en attente,
arrêté, etc.
Compteur de programme : Le compteur indique l'adresse de la prochaine
instruction à exécuter pour ce processus.
Registres du processeur : les registres varient en nombre et en type, en
fonction de l'architecture de l'ordinateur. Ils comprennent des
accumulateurs, des registres d'index, des pointeurs de pile et des registres à
usage général, ainsi que toutes les informations de condition de code. Avec
le compteur de programme, ces informations d'état doivent être
[5]
sauvegardées lorsqu'une interruption se produit, pour permettre au
processus de se poursuivre correctement par la suite.
Informations de planification de l’UC : ces informations incluent une priorité
de processus, des pointeurs vers les files d'attente de planification et tout
autre paramètre de planification.
Informations de gestion de la mémoire : ces informations peuvent inclure
des informations telles que la valeur des registres de base et de limite, les
tables de pages, ou les tables de segments, en fonction du système de
mémoire utilisé par le système d'exploitation.
Informations comptables : ces informations comprennent le temps réel
utilisé, les limites de temps, les numéros de compte, les numéros de tâche
ou de processus, etc.
Informations sur l'état des E/S : ces informations incluent la liste des
périphériques d'E/S alloués au processus, une liste des fichiers ouverts, etc.
En bref, le BCP sert simplement de référentiel pour toute information pouvant
varier d'un processus à autre. Voir la figure suivante :
[6]
f. Commutation des processus
g. Notion de Thread
Dans les systèmes d'exploitation traditionnels, chaque processus dispose d'un
espace d'adressage et d'un seul fil de contrôle. En fait, c'est presque la définition
d'un processus. Néanmoins, dans de nombreuses situations, il est souhaitable
d'avoir plusieurs mini-processus (appelés Threads) dans un processus.
La principale raison d'avoir des threads est que dans de nombreuses applications,
plusieurs activités se déroulent à la fois. Certains d'entre eux peuvent se bloquer
de temps à autre. En décomposant une telle application en plusieurs threads
séquentiels qui s'exécutent en quasi-parallèle, le modèle de programmation
devient plus simple.
[7]
En cours (élu) : Les instructions sont en cours d'exécution.
En attente : Le processus attend qu'un événement se produise (tel qu'un
achèvement d'E/S ou la réception d'un signal).
Prêt : Le processus attend d'être affecté à un processeur.
Terminé : Le processus a terminé son exécution.
Le diagramme d'états correspondant à ces états est présenté dans la figure
suivante :
3. Hiérarchies de processus
Dans certains systèmes, un processus peut créer un autre processus, on parle dans
ce cas de processus parent et de processus enfant. Le processus enfant peut lui-
même créer plus de processus, formant une hiérarchie de processus. Notez qu’un
processus n'a qu'un seul parent, mais zéro, un, deux ou plusieurs enfants.
[8]
Débit : C’est le nombre de processus terminés par unité de temps. Pour les
processus longs, ce taux peut être un processus par heure; pour les
transactions courtes, il peut s'agir de dix processus par seconde. C’est un
critère à maximiser.
Délai d'exécution : C'est l'intervalle de temps entre la soumission d'un
processus et son achèvement. C’est la somme des périodes passées à
attendre pour entrer en mémoire, à attendre dans la file d'attente prête, à
s'exécuter sur le CPU et à effectuer des E/S. C’est un critère à minimiser.
C'est une mesure appropriée pour un travail par lots.
Temps d'attente : C’est la quantité de temps qu'un processus passe à
attendre dans la file d'attente prête, elle égale à la somme des périodes
d'attente dans la file d'attente prête, ce critère dépend de la l’algorithme de
planification du processeur adoptée. C’est un critère à minimiser.
Temps de réponse : Dans un système interactif, le délai d'exécution n'est
peut-être pas le meilleur critère. Souvent, un processus peut produire une
sortie assez tôt et peut continuer à calculer de nouveaux résultats pendant
que les résultats précédents sont envoyés à l'utilisateur. Donc le Temps de
réponse est le temps écoulé entre la soumission d'une demande et la
production de la première réponse, c’est le temps nécessaire pour
commencer à répondre, et non le temps nécessaire pour sortir la réponse.
Prévisibilité : Un travail donné doit s'exécuter dans à peu près le même laps
de temps et à peu près au même coût quelle que soit la charge sur le
système. Une grande variation du temps de réponse ou du temps de
traitement distrait les utilisateurs. Cela peut signaler une grande variation
des charges de travail du système ou la nécessité d'un réglage du système
pour remédier aux instabilités.
Équité : En l'absence de directives de l'utilisateur ou d'autres directives
fournies par le système, les processus devraient être traités de la même
manière.
Application des priorités : Lorsque des priorités sont assignées aux
processus, la politique d'ordonnancement devrait favoriser les processus de
priorité plus élevée.
Équilibrage des ressources : La politique de planification doit maintenir les
ressources du système occupées. Les processus qui utiliseront les ressources
rarement sollicitées doivent être favorisés.
[9]
b. Algorithmes d’ordonnancement (planification)
L'ordonnancement du CPU traite le problème de la décision à lequel des processus
de la file d'attente prête doit se voir allouer le CPU. Il existe de nombreux
algorithmes de planification CPU différents :
Planification premier arrivé, premier servi FCFS (First-Come, First-Served) :
Le processus qui demande le CPU en premier se voit attribuer le CPU en
premier. La mise en œuvre de la politique FCFS est facilement gérée avec une
file d'attente FIFO. Lorsqu'un processus entre dans la file d'attente prête, son
BCP est lié à la queue de la file d'attente. Lorsque la CPU est libre, elle est
allouée au processus en tête de file d'attente. Le processus en cours est ensuite
supprimé de la file d'attente. Le code de planification FCFS est simple à écrire
et à comprendre. Du côté négatif, le temps d'attente moyen dans le cadre de la
politique FCFS est souvent assez long.
Exemple : Considérez l'ensemble suivant de processus qui arrivent à l'instant 0,
Processus Période d’utilisation CPU
24 ms
P1
3 ms
P2
3 ms
P3
Si les processus sont dans l'ordre P1, P2, P3 et sont servis dans l'ordre FCFS,
nous obtenons le résultat affiché dans le diagramme de Gantt suivant, qui est
un diagramme à barres qui illustre un calendrier particulier, y compris les
heures de début et de fin de chacun des processus participants :
P1 P2 P3
0 24 27 30
P2 P3 P1
0 3 6 30
Le temps d'attente moyen est maintenant (6+0+3)/3=3 ms. Cette réduction est
importante. Ainsi, le temps d'attente moyen dans le cadre d'une politique FCFS
[10]
n'est généralement pas minimal et peut varier considérablement si les temps
d’exécution CPU des processus varient considérablement.
Notez que l'algorithme de planification FCFS n'est pas préventif. Une fois que le
CPU a été allouée à un processus, ce processus conserve le CPU jusqu'à ce qu'il
libère le CPU, soit en arrêtant, soit en demandant une E/S. L'algorithme FCFS
est donc particulièrement gênant pour les systèmes à temps partagé, où il est
important que chaque utilisateur reçoive une part du CPU à intervalles
réguliers. Il serait désastreux de permettre à un processus de conserver le
processeur pendant une période prolongée.
Planification du travail le plus court d'abord SJF (Shortest-Job-First):
Cet algorithme associe à chaque processus la longueur de la prochaine
utilisation du CPU. Lorsque le CPU est disponible, il est affecté au processus qui
a la plus petite période d’utilisation du CPU. Si les périodes d’utilisation de deux
processus sont identiques, la planification FCFS est utilisée.
Exemple : considérons l'ensemble de processus suivant :
Période d’utilisation CPU
Processus
6 ms
P1
8 ms
P2
7 ms
P3
3
P4
En utilisant la planification SJF, nous planifierions ces processus selon le
diagramme de Gantt suivant:
P4 P1 P3 P2
0 3 9 16 24
Le temps d'attente est de 3 ms pour P1, 16 ms pour P2, 9 ms pourP3 et 0 ms
pour P4. Ainsi, le temps d'attente moyen est de (3+16+9+0)/4= 7 ms.
[11]
processus long. Par conséquent, le temps d'attente moyen diminue. La vraie
difficulté avec l'algorithme SJF est de connaître la longueur de la prochaine
requête CPU. On distingue deux types d’algorithmes SJF : SJF préemptif et SJF
non préemptif. Le choix se pose lorsqu'un nouveau processus arrive dans la file
d'attente prête alors qu'un processus précédent est toujours en cours
d'exécution. La prochaine période d’utilisation de CPU du nouveau processus
arrivé peut-être plus courte que ce qui reste du processus en cours d'exécution.
P3
P2
P1
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
[12]
Le programme SJF préemptif (SRT) résultant est illustré dans le diagramme de
Gantt suivant :
P4
P3
P2
P1
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
[13]
En utilisant la planification prioritaire, nous planifierions ces processus selon le
diagramme de Gantt suivant :
P5
P4
P3
P2
P1
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
[14]
Planification circulaire RR (Round-Robin)
L'algorithme de planification circulaire (RR) est spécialement conçu pour les
systèmes de temps partagé. Il est similaire à la planification FCFS, mais la
préemption est ajoutée pour permettre au système de basculer entre les
processus. Une petite unité de temps, appelée quantum de temps ou tranche de
temps, est définie. Un quantum de temps dure généralement de 10 à 100
millisecondes. La file d'attente prête est traitée comme une file d'attente circulaire.
L'ordonnanceur du processeur fait le tour de la file d'attente, allouant le
processeur à chaque processus pendant un intervalle de temps fixé. Pour
implémenter la planification RR, la file d’attente est implémentée selon le principe
FIFO. Les nouveaux processus sont ajoutés à la queue de la file d'attente.
L'ordonnanceur du processeur sélectionne le premier processus dans la file
d'attente prête, définit un minuteur pour qu'il s'interrompe après 1 temps
quantique et distribue le processus. Une des deux choses se produira alors. Le
processus peut avoir une durée d’utilisation CPU inférieure à 1 quantum de temps.
Dans ce cas, le processus lui-même libérera le CPU volontairement. Le planificateur
passera ensuite au processus suivant dans la file d'attente. Si la durée d’exécution
CPU du processus en cours d'exécution est supérieure à 1 quantum de temps, la
minuterie s'éteindra et provoquera une interruption du système d'exploitation. Un
changement de contexte sera exécuté et le processus sera placé à la fin de la file
d'attente prête. Le planificateur du processeur sélectionnera alors le processus
suivant dans la file d'attente. Le temps d'attente moyen dans le cadre de la
politique RR est souvent long. Les performances de l'algorithme RR dépendent
fortement de la taille du quantum de temps.Si le quantum tend vers une grande
valeur, le RR devient similaire à FCFS. En revanche, si le quantum de temps est
extrêmement petit (par exemple, 1 ms), l'approche RR peut entraîner un grand
nombre de changements de contexte.
[15]
Si nous utilisons un quantum de temps de 4 millisecondes, alors le calendrier RR
résultant est le suivant :
P3
P2
P1
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
[16]
1. Processus système
2. Processus interactifs
3. Processus d'édition interactifs
4. Processus par lots
5. Processus des étudiants
[17]
files d'attente, numérotés de 0 à 2 (voir la figure suivante). L’ordonnanceur
exécute d'abord tous les processus dans la file d'attente 0. Ce n'est que lorsque la
file d'attente 0 est vide, il exécutera les processus dans la file d'attente 1. De
même, les processus dans la file d'attente 2 ne seront exécutés que si les files
d'attente 0 et 1 sont vides. Un processus entrant dans la file d'attente est mis dans
la file d'attente 0. Un processus dans la file d'attente 0 reçoit un quantum de temps
de 8 millisecondes. S'il ne se termine pas dans ce délai, il est déplacé vers la queue
de la file d'attente 1. Si la file d'attente 0 est vide, le processus à la tête de la file
d'attente 1 reçoit un quantum de 16 millisecondes. S'il ne se termine pas, il est
préempté et est mis dans la file d'attente 2. Les processus dans la file d'attente 2
sont exécutés sur une base FCFS mais sont exécutés uniquement lorsque les files
d'attente 0 et 1 sont vides. Cet algorithme de planification donne la plus haute
priorité à tout processus avec une utilisation de CPU de 8 millisecondes ou moins.
Un tel processus obtiendra rapidement le processeur et terminera sa tâche. Les
processus qui ont besoin de plus de 8 mais moins de 24 millisecondes sont
également servis rapidement, bien qu'avec une priorité plus faible que les
processus plus courts. Les processus longs s'enfoncent automatiquement dans la
file d'attente 2 et sont servis dans la technique FCFS.
[18]
Ce mode de planification est basé sur le principe suivant :Si un programme
demande une ressource, et si cette dernière est libre alors le système lui alloue la
ressource. Ainsi que si un programme demande une opération d’E/S, alors le CPU
est allouer au prochain processus placé dans la file d’attente des processus prêts.
L’ordonnancement est géré à l’aide d’un ensemble de taches de contrôles
(interruptions).
Exemple : algorithme FCFS en mode multiprogrammé
On s’intéresse à l’exécution de trois programmes A, B, et C sur une configuration
monoprocesseur (CPU, MC, périphérique d’E/S). Le séquencement des actions des
programmes A, B,et C est donné ci-après :
A B C
[19]
III. Chapitre 3 : Les interruptions (Cas Intel 8086)
1. Introduction
La plupart des processeurs modernes permettent d'être interrompus par des
périphériques externes. Cela évite au processeur de vérifier périodiquement de
tels appareils pour voir s'ils ont besoin d'une attention particulière.
Par exemple, au lieu de demander à un processeur de vérifier fréquemment dans
un clavier si une touche a été enfoncée et d'obtenir des réponses négatives la
plupart du temps, il serait plus efficace pour le processeur d'ignorer le clavier mais
de permettre au clavier d'attirer l'attention du processeur lorsqu’une touche est
enfoncée.
La première méthode est appelée interrogation, la seconde est appelée
interruption.
2. Définition
Une interruption est une procédure qui interrompe tout programme en cours
d'exécution. Elle peut être déclenchée par des périphériques externes du CPU ; en
outre, elle peut également être déclenchée par des instructions d'interruptions
logicielles et, dans certaines conditions, par le CPU lui-même.
Le 8086 peut gérer jusqu'à 256 types d'interruptions différents. Chaque
interruption est identifiée par un numéro entre 0 et 255.
Une fois l’interruption est traitée par le CPU, le programme interrompu reprend
son exécution.
Les interruptions permettent au processeur de communiquer avec les
périphériques d’entrées sorties (I/O) et vice-versa.
[20]
3. Présentation de l’Intel 8086
a. Vue externe
[21]
b. Vue interne :
[22]
interruption interne après chaque instruction, permettant à un programme
d'être inspecté lors de l'exécution instruction par instruction.
4. Types d’interruptions
a. Les interruptions externes
Ce sont des interruptions provenant de l’extérieur du CPU, on distingue :
L’interruption NMI
C’est une interruption non masquable déclenchée par la ligne NMI. Les demandes
d'interruption arrivant sur NMI ne peuvent pas être désactivées. Ce type
d’interruptions porte le numéro 2.
L’interruption Reset
C’est une interruption non masquable déclenchée par la ligne Reset, utilisée pour
redémarrer le microprocesseur. Lorsque le processeur détecte le front montant
d'une impulsion lors de la réinitialisation, il met fin à toutes les activités jusqu'à ce
que le signal passe au niveau bas, moment auquel il initialise le système comme
indiqué dans le Tableau 1.
Composants CPU Contenu
PSW Effacé
IP 0000H
CS FFFFH
DS 0000H
ES 0000H
File d’attente Vide
Tableau 1: État du processeur après la réinitialisation
[23]
envoi le numéro de l’interruption (via le bus de données) pour que le CPU puisse la
traiter.
Interruption Priorité
[26]
IV. Chapitre 4 : Gestion de la mémoire
1. Introduction
La mémoire principale est une ressource importante qui doit être gérée très
soigneusement, malgré des capacités de plus en plus grandes, elle n’est jamais
suffisante à cause des tailles des programmes qui ne cessent pas de croitre.
Le système d’exploitation comporte un module chargé de la gestion rationnelle de
la mémoire appelé Gestionnaire de mémoire, son travail consiste à gérer
efficacement la mémoire : garder une trace des parties de la mémoire utilisées,
allouer de la mémoire aux processus lorsqu'ils en ont besoin et la libérer lorsqu'ils
ont terminé.
b. Adresse logique
Lors de l’exécution d’un programme, le système d’exploitation lui réserve un
espace mémoire appelé Mémoire logique, où les octets sont numérotés d’une
manière virtuelle à partir de zéro, ces numéros sont appelés déplacements.
Une donnée est référencée par le couple formé de l’adresse de début de la
mémoire logique et son déplacement.
[27]
Exemple :
La transformation des adresses logiques vers des adresses physiques est effectuée
par un périphérique matériel appelé l'unité de gestion de la mémoire MMU
(Memory-management Unit). La figure suivante illustre un exemple de MMU :
Figure 9: MMU
[28]
3. Allocation contiguë de la mémoire
L’allocation contiguë consiste à charger le processus en un seul morceau, cela
nécessite l’utilisation d’un registre de base (translation) et d’un registre de borne
(limite), son utilisation est montrée dans la figure suivante :
Figure 10: Gestion des adresses avec le registre de base et le registre limite
[29]
Figure 11: Exemple d'une partition fixe
[30]
b. Allocation contiguë avec des partitions dynamiques
Cette approche a été développée pour surmonter certaines des difficultés du
partitionnement fixe, avec le partitionnement dynamique, les partitions sont de
longueur et de nombre variables. Lorsqu'un processus est introduit dans la
mémoire principale, il se voit allouer exactement autant de mémoire qu'il en a
besoin et pas plus.
Un exemple, utilisant 64 Mo de mémoire principale, est illustré dans la figure
suivante :
[31]
Figure 12: L'effet du partitionnement dynamique
[32]
Gestion de la mémoire libre
Lorsque la mémoire est affectée dynamiquement, le système d'exploitation doit la
gérer. Il existe deux manières de suivre l'utilisation de la mémoire : les bitmaps et
les listes chaînées.
Gestion de la mémoire avec Bitmaps :
Avec un bitmap, la mémoire est divisée en petites unités d'allocation. À chaque
unité d'allocation correspond un bit dans le bitmap, qui vaut 0 si l'unité est libre et
1 si elle est occupée (ou vice-versa). La taille de l'unité d'allocation est un problème
de conception important. Plus l'unité d'allocation est petite, plus le bitmap est
grandet vice-versa. La figure suivante montre une partie de la mémoire et le
bitmap correspondant.
[33]
Figure 14: Gestion de ma MC avec liste chaînée
[35]
Solution
Algorithme first-fit
Diagramme de Gantt
32
31
30
29
28
27
26
25
B
24
23
E
22
21
20
19
18
17
16 D
G
15
14
13
A
12
11
10
9
C F
8
7
SE
6
5
4
2
1
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
[36]
Les différents états d’occupation de la mémoire :
32
31
30
29
28
27
26
25
24
23
B B B B
22
21
20
E E E E
19
18
17
D
16
15
14
A A G
13
12
C C c C C
11
F F
10
9
8
7
6
5
SE
SE
SE
SE
SE
SE
SE
SE
SE
SE
SE
4
3
2
1
10-17
20-23
26-29
30…..
0-2
3-4
5-9
18
19
24
25
[37]
Sommaire
I. Chapitre 1 : Introduction ....................................................................................... 1
1. Notion de système d’exploitation..................................................................... 1
2. Fonctions et rôles ............................................................................................. 1
3. Exemples de système d’exploitation ................................................................ 1
4. Position du système d’exploitation dans un système informatique .................. 2
5. Les différentes classes des systèmes d’exploitation ......................................... 2
II. Chapitre 2 : La gestion du processeur ................................................................... 4
1. Définitions ........................................................................................................ 4
2. Différents états d’un processus ........................................................................ 7
3. Hiérarchies de processus .................................................................................. 8
4. Ordonnancement des processus ...................................................................... 8
III. Chapitre 3 : Les interruptions (Cas Intel 8086)................................................... 20
1. Introduction ................................................................................................... 20
2. Définition ....................................................................................................... 20
3. Présentation de l’Intel 8086 ........................................................................... 21
4. Types d’interruptions ..................................................................................... 23
5. Table des vecteurs d’interruptions ................................................................. 25
6. Trace d’exécution d’une interruption logicielle .............................................. 25
IV. Chapitre 4 : Gestion de la mémoire ................................................................... 27
1. Introduction ................................................................................................... 27
2. Adresse physique et adresse logique.............................................................. 27
3. Allocation contiguë de la mémoire ................................................................. 29
[38]
Bibliographies
Silberschatz, Abraham, Galvin, Peter Baer et Gagne, Greg. 2009.Operating System
Concepts. USA : John Wiley, 2009.
Stallings, William and Paul, Goutam Kumar. 2012.Operating systems: internals
and design principles. s.l. : Pearson New York, 2012. Vol. 9.
Tanenbaum, Andrew S et Bos, Herbert. 2015.Modern operating systems. USA :
Pearson, 2015.
[39]