Академический Документы
Профессиональный Документы
Культура Документы
SYSTEMES D’EXPLOITATION I
L 2ième Systèmes d’Information et BDD
© W. KADRI 1
INTRODUCTION GENERALE
Cet ouvrage est le fruit d’une expérience personnelle des auteurs qui ont enseignés ce
module pendant très longtemps (au minimum dix ans d’affilés). Les concepts ainsi
que la bibliographie sont une synthèse très riche réalisée, essentiellement, à partir
des livres, dans leurs différentes versions, de A. Tenanbaum, A. Silberchartz, W.
Stallings. A travers une rédaction simple et pédagogique, cet ouvrage présente les
concepts fondamentaux de tout système d’exploitation en cinq chapitres dont chacun
est complété par une batterie d’exercices aussi riches que variés afin de cerner tout
les aspects des concepts présentés dans le chapitre respectif. Le chapitre premier
présente des généralités sur les systèmes d’exploitation, les situe dans l’architecture
de la machine à travers le temps et l’espace et montre comment ils sont structurés. Le
chapitre deuxième présente la translation d’un programme d’un code source vers son
code machine et montre comment se fait la naissance d’un processus qui représente
l’acteur principal de tout OS. Le chapitre troisième s’occupe de la gestion des
processus et montre la définition d’un processus, son scheduling, sa synchronisation,
sa communication et sa concurrence avec d’autres processus, une vue de
l’implémentation de cette gestion devient plus explicite grâce aux structures de
données et les algorithmes présentés dans ce chapitre. Le quatrième chapitre montre
la notion de multiprogrammation, de swapping et de mémoire virtuelle,, on y
retrouve les systèmes de gestion de la mémoire du plus simple au plus compliqués,
les algorithmes selon chaque classe de systèmes sont explicités, il se clôture par les
différents concepts de conception de systèmes à mémoire virtuelle. Le chapitre
quatrième se consacre à la gestion des périphériques et des entrées sorties et montre
le cheminement d’une entrée/sortie à travers ses différentes phase, la notion de
scheduling du bras, de pilote, de primitives systèmes d’entrée/sortie montre cette
mise en œuvre, l’allocation et la libération de ressources nécessitent une bonne
© W. KADRI 2
gestion afin d’éviter les interblocages. Enfin le dernier chapitre relève de la gestion de
fichiers, on y trouve les concepts de fichiers, de répertoire, d’arborescence,
l’allocation et la désallocation d’espace aux fichiers et répertoires, FAT32, NTFS et les
inodes d’Unix sont le point forts de la compréhension des systèmes de fichiers.
Arrivés au terme de ces chapitres, nous espérons que le lecteur ait développé une
vision assez réaliste des fonctionnalités disponibles sur un système quelconque, et de
pouvoir reconduire les différents aspects étudiés vers ses propres fins. Une bonne
maitrise de l'architecture et des mécanismes impliqués, conduit à une bonne
programmation système avec une manipulation prometteuse et efficace de ces
concepts.
© W. KADRI 3
Premier Chapitre
GENERALITES
1- INTRODUCTION
© W. KADRI 4
Gestion de la mémoire vive : le système d'exploitation est chargé de gérer
l'espace mémoire alloué à chaque application et programme. En cas
d'insuffisance de mémoire physique, le système d'exploitation peut créer une
zone mémoire sur le disque dur, appelée «mémoire virtuelle». La mémoire
virtuelle permet de faire fonctionner des applications nécessitant plus de
mémoire qu'il n'y a de mémoire vive disponible sur le système. En
contrepartie cette mémoire est beaucoup plus lente.
Gestion des entrées/sorties : le système d'exploitation permet d'unifier et de
contrôler l'accès des programmes aux ressources matérielles par
l'intermédiaire des pilotes (appelés également gestionnaires de périphériques
ou gestionnaires d'entrée/sortie).
Gestion de l'exécution des applications : le système d'exploitation est chargé
de la bonne exécution des applications en leur affectant les ressources
nécessaires à leur bon fonctionnement. Il permet à ce titre de «tuer» une
application ne répondant plus correctement.
Gestion des droits : le système d'exploitation est chargé de la sécurité liée à
l'exécution des programmes en garantissant que les ressources ne sont
utilisées que par les programmes et utilisateurs possédant les droits adéquats.
Gestion des fichiers : le système d'exploitation gère la lecture et l'écriture
dans le système de fichiers et les droits d'accès aux fichiers par les utilisateurs
et les applications.
Gestion des informations : le système d'exploitation fournit un certain
nombre d'indicateurs permettant de diagnostiquer le bon fonctionnement de
la machine.
© W. KADRI 5
4- DECOMPOSITION HIERARCHIQUE DE LA MACHINE
D’une manière générale, le matériel est décomposé d’une machine nue et d’une
machine abstraite :
- Une machine nue est définie par :
Un répertoire de base ou l’ensemble des instructions machines ou
primitives
Une mémoire composée des registres du processeur et de la mémoire
principale
Un mécanisme d’exécution représentant le cycle ou la méthode
d’exécution d’une instruction (lecture, décodage et exécution de
l’instruction)
- Une machine abstraite est définie par tout langage capable de l’interpréter. Elle est
dite abstraite parce qu’elle n’a pas de représentation physique. Par sa définition
générale, le langage permet de définir :
Des objets et les mécanismes permettant de les créer.
Des actions (primitives) permettant de manipuler ces objets.
Des règles de composition de ces actions.
© W. KADRI 6
Un système constitue, donc, une interface entre l’utilisateur et la machine qui se
définit par un langage ou un moyen de communication. Toute information,
nécessaire à la bonne gestion du système, doit être contenue dans cette interface. Une
tâche exprimée très simplement selon les avantages offerts par la machine abstraite
s’avère plus complexe à un niveau d’abstraction inférieur. Donc une opération de
haut niveau se décompose en plusieurs opérations de bas niveau.
D’autre part, plusieurs machines virtuelles (abstraites) peuvent être définies sur une
même machine pour des utilisateurs différents. De là, il apparaît la décomposition
suivante figure1.2 :
Logiciel d’application
Système d’exploitation
Logiciel de Base
Machine Physique
Les frontières entre ces couches ne sont pas définitives, il arrive parfois qu’un logiciel
d’application puisse être intégré au logiciel de base. Ce qui est la tâche du manager.
Une fonction du logiciel de base peut être câblée par besoin d’économie. Ce qui est la
tâche du concepteur.
© W. KADRI 7
Comme les systèmes d’exploitation dépendent étroitement de l’architecture des
ordinateurs sur lesquels ils fonctionnent, on passera en revue les générations
d’ordinateurs pour en examiner les différents systèmes d’exploitation.
C
CPPU
U
LECTEUR
CANAL
M
MCC CANAL PRINTER
CANAL
DISQUE
Figure1.3 : Le Spooling
La solution est qu’il faut songer à un système qui accepte plusieurs programmes en
mémoire centrale.
© W. KADRI 9
Inconvénients :
La solution est donc la naissance du temps partagé dont le principe consiste à allouer
à chaque utilisateur une portion de temps (quantum) lui permettant de disposer de
toutes les ressources dont il a besoin.
Cette génération fut aussi caractérisée par le développement des systèmes temps réel
qui sont une forme de systèmes d’exploitation spécialisés. Ils consistent à conduire
des processus industriels par un ordinateur fonctionnant dans un environnement
contraint temporellement. L’ordinateur fait lui-même des prélèvements de données
dont il a besoin (température, pression, etc.…) et agit directement sur les organes du
processus industriel. L’ordinateur veille à ce que les mesures prises soient normales
et ne dépassent pas un certain seuil. Sinon, il provoque l’arrêt du processus
industriel. Un système temps réel doit ainsi fonctionner de manière fiable selon des
contraintes temporelles spécifiques, c'est-à-dire qu'il doit être capable de délivrer un
traitement correct des informations reçues à des intervalles de temps bien définis
(réguliers ou non).
Cette génération est caractérisée par les ordinateurs personnels, les réseaux et les
systèmes répartis.
Ordinateurs Personnels
Les PCs sont apparus dans les années 1970 grâce à l’électronique LSI (Large Scale
Integration) et VLSI. Leurs systèmes d’exploitation tels que CPM, MSDOS, OS/2,
Xenix et Unix étaient ni multi-utilisateurs ni multi-tâches ils optaient surtout pour la
commodité et la rapidité.
En même temps, du matériel puissant, rapide et sophistiqué a vu le jour : Les
stations de travail comme les stations Sun, Appolo d’HP ou la RS/6000 d’IBM sont
des résultats d’un grand effort.
© W. KADRI 10
- La fiabilité. Si l’on peut distribuer correctement les fonctions parmi les
différents processeurs, une panne d’un processeur n’arrêtera pas le système
mais peut être le ralentira seulement. Les autres processeurs auront à effectuer
les tâches du processeur en panne jusqu’à son rétablissement. Ce mode de
fonctionnement s’appelle le mode dégradé.
Dans un système réparti, les processeurs peuvent varier en taille et en fonction. Ils
peuvent inclure des PCs, des stations, des mini-ordinateurs et de grands systèmes à
usage général. Ces processeurs portent différentes appellations sites, nœuds,
ordinateurs, etc. Dans un tel système, les utilisateurs connaissent l’existence des
différents sites, peuvent se connecter sur une machine distante et transférer des
fichiers d’une machine à une autre. Chaque ordinateur fonctionne avec son propre
système et au compte d’un utilisateur particulier.
Les raisons pour construire des systèmes répartis sont le partage des ressources,
l’accélération du calcul, la fiabilité et la communication.
Les systèmes embarqués sont des systèmes d'exploitation prévus pour fonctionner
sur des machines de petite taille, telles que des PDA (personal digital assistants ou en
français assistants numériques personnels) ou des appareils électroniques autonomes
(sondes spatiales, robot, ordinateur de bord de véhicule, etc.), possédant une
autonomie réduite. Ainsi, une caractéristique essentielle des systèmes embarqués est
leur gestion avancée de l'énergie et leur capacité à fonctionner avec des ressources
limitées.
© W. KADRI 11
Les principaux systèmes embarqués «grand public» pour assistants numériques
personnels sont :
PalmOS
Windows CE / Windows Mobile / Window Smartphone
Le système est, dans ce cas, un ensemble de procédures pouvant s’appeler entre elles.
Chaque procédure doit avoir une interface bien définie. Le système est considéré
comme une seule pièce, lorsqu’il prend le contrôle il masque toutes les
caractéristiques matérielles en particulier les interruptions.
Avantage : Cette structure est relativement simple à concevoir et à
implémenter.
Inconvénient : n’importe quelle interruption invoque le système et masque
toutes les autres. Ce qui tend à dégrader le temps de réponse, spécialement
quand il y a plusieurs processus.
MSDOS en est un exemple écrit pour fournir le plus de fonctionnalité possible dans
le moindre espace, à cause du matériel sur lequel il allait tourner. Les programmes
d’application sont capables d’accéder aux routines D’E/S de base (BIOS) afin d’écrire
directement sur l’écran ou sur l’unité de disque par exemple. Un tel risque rend
MSDOS vulnérable devant les programmes erronés, ce qui se caractérise par des
blocages complets assez souvent du système.
© W. KADRI 12
couche représente une machine virtuelle cachant tous les détails de la machine de
niveau inférieur.
Avantage : est la modularité. Les couches sont sélectionnées de telle sorte que
chacune utilise seulement les fonctions et services des couches inférieures.
Cette approche simplifie la mise au point du système.
KERNEL MODE
FILE SYSTEM
PROCESSOR SCHEDULING
HARDWARE
© W. KADRI 13
USER 1 USER 2 USER 3 USER 4
6.4 Client/serveur
NOYAU
MATERIEL
Ce modèle est une combinaison des modèles précédents. Il se base surtout sur le
modèle en couches et sur le modèle client/serveur. Le système se décompose
généralement en une couche d’abstraction du hardware ce qui constitue la machine
virtuelle, d’un noyau et d’un exécutif. Le noyau implémente les fonctions de bas
niveau tout comme le noyau du modèle client/serveur. Il comprend le scheduling
des threads, la gestion des interruptions et la synchronisation multiprocesseur. Il
© W. KADRI 14
comprend également un ensemble de routines et d’objets de base nécessaire à
l’exécutif.
SYSTEM CALLS
KERNEL
HARDWARE ABSTRACTION
LAYER
HARDWARE
Figure1.8 : Windows NT, un modèle hybride
7. APPELS SYSTEMES
© W. KADRI 15
D’après les structures des systèmes précédentes les appels système peuvent être
divisés en plusieurs catégories selon les modules ou serveurs des couches inférieures.
Grossièrement, ils sont représentés en cinq catégories.
Processus :
Arrêter (end) , stopper un processus (abort)
Charger (load), exécuter un processus(execute)
Créer (fork) ,terminer(exit)
Obtenir(get, set process attib), définir des attributs
Attendre un certain temps(wait time)
Attendre , signaler des événements( wait, signal )
Allouer, libérer la mémoire(alloc, dealloc)
Fichiers :
créer , supprimer (create, delete)
ouvrir , fermer (open, close)
lire, écrire, repositionner (read, write, reposition)
obtenir, définir des attributs(get ,set file attributes)
I/O :
demander, libérer des périphériques(request, release)
obtenir, définir des attributs de périphériques (get, set)
attacher, détacher attach, detach)
Information :
date et heure (date, time)
données système (get, set)
processus, fichiers, périphériques (get,set)
Communication :
créer, supprimer des connexions(open , close)
envoyer, recevoir des messages(send receive)
transférer des informations sur les états(get , set)
attacher, détacher des périphériques à distance
© W. KADRI 16
Deuxième Chapitre
GESTION DES PROCESSUS
1- INTRODUCTION
Du point de vue du système, un programme est considéré comme une entité active
qui consomme des ressources, et qui pour les obtenir entre en concurrence avec
d'autres demandes. Le programme vu sous cet angle est appelé un processus (process
en anglais). Le concept de processus est le plus important dans un système
d’exploitation. C’est une abstraction d’un programme en exécution. La conception et
la réalisation de tout système repose, essentiellement, sur ce concept, pour cause, les
systèmes d’exploitation ne reconnaissent d’autres entités exécutables que les
processus.
Le système d'exploitation (operating system, OS) est un programme qui arbitre les
demandes de ressources des différents processus et les satisfait en se conformant à
une stratégie. La stratégie mise en œuvre par le système vise à satisfaire plusieurs
impératifs :
© W. KADRI 17
ressources utilisées (espace mémoire, fichiers ouverts), et d'autre plutôt dynamiques,
c'est essentiellement ce que nous pouvons appeler un « fils » d'exécution pour un
programme (un thread en anglais). Une tendance récente des architectes de systèmes
vise à séparer les deux types d'attributs, en considérant le processus comme un
ensemble de ressources qu'utilisent un ou plusieurs fils d'exécution.
Un processus est un programme en exécution. Il est défini par son PCB (Process
Control Block) qui représente le contexte du processus, son code, ses données et sa
pile (fig.3.1).
2.1 PCB
Le PCB contient toutes les informations nécessaires à la commutation de contexte
regroupées sous forme compactée pour faciliter leur transfert vers les registres du
processeur. Il spécifie :
L’état du processus
Le PC et le PSL
Les registres du processeur
Une partie réservée pour l’ordonnancement (le scheduling en anglais)
La priorité du processus
© W. KADRI 18
Les pointeurs sur les files d’attente du Scheduling
Autres informations nécessaires au Scheduling
Une partie réservée pour la gestion de la mémoire
Le pointeur sur le code (table des pages du code)
Le pointeur sur les données
Le pointeur sur la pile
Autres informations nécessaires à la gestion de la mémoire
Une partie pour la comptabilisation
La priorité du processus
Les limites de temps
Le temps CPU et le temps réel utilisé
Identité du processus etc..
Une partie pour les E/S
Les périphériques alloués au processus
Les fichiers ouverts par ce processus
2.2 Code
2.3 Data
C’est un segment qui renferme les données manipulées par le processus. En général,
on affecte le même espace pour les data et la pile.
2.4 Stack
La pile est utilisée par un processus, surtout, lors de l’appel de sous programme, car
on doit sauvegarder l’état du programme appelant avant de passer la main au
programme appelé. Elle dispose d’un pointeur de sommet de pile et d’une adresse
début en mémoire.
Nous avons dit que le système d'exploitation, avec l'aide de dispositifs appropriés du
matériel, et en s’appuyant sur le rôle fondamental que possèdent les interruptions
pour le fonctionnement de la multiprogrammation, permettait, ainsi, que chaque
programme s'exécute à son tour, en pseudo-simultanéité avec les autres. Il pouvait
répartir le temps du processeur entre plusieurs processus pseudo-simultanés. Ceci
suppose qu'un processus tout au long de son exécution change d’état d’un instant à
un autre. A un instant donné, il peut être dans l'état actif (Prêt), à un instant suivant
dans l'état dormant (Bloqué), puis encore à un autre instant redémarrer (Elu). Ceci est
décrit par la figure 3.2 suivante :
© W. KADRI 19
Nouveau Admis Exit
Terminé
Suspendu par le scheduler
Prêt Élu
PrPêtPret
Sélectionné par le scheduler
Ressource disponible
en attente de ressource
Bloqué
Nous pouvons concevoir qu'un processus actif puisse se mette volontairement à l'état
dormant, par contre, l’inverse n’est pas possible. En effet, le passage de l'état
dormant à l'état actif suppose l'intervention du système d'exploitation ou d'un autre
processus pour réveiller le processus endormi. Comment cela peut-il se passer ?
Nous allons l’expliquer à travers le déroulement d'une opération d'entrée-sortie,
lecture ou écriture sur support externe.
Demande d'entrée-sortie
Comme nous l’avons préciser, les opérations d'entrée-sortie sont des opérations
privilégiées, du ressort du système d'exploitation. Lorsqu'un logiciel veut effectuer
© W. KADRI 20
une entrée-sortie il doit effectuer un appel système. Pour réaliser cette opération
d'entrée-sortie plusieurs composants de l'ordinateur et du système entrent en jeu :
© W. KADRI 21
Interruption de fin d'entrée-sortie
© W. KADRI 22
4. COMMUTATION DE CONTEXTE (CONTEXT SWITCHING)
Sauvegarde de PCB0
Sauvegarde de PCB1
Inactif
Chargement de PCB0
© W. KADRI 23
5- IMPLEMENTATION DU MODELE DE PROCESSUS
SCHEDULER
Figure3.5: Modèle de processus
Dans un modèle de processus, le schéma suivant est toujours respecté suite à une
interruption :
6- NOTION DE THREADS
© W. KADRI 24
On appelle cela un fil d'exécution. Un processus a toujours au moins un fil
d'exécution, qu’on appelle, aussi, thread. Et s'il le veut, un processus peux avoir
plusieurs codes qui s'exécutent en même temps, donc, plusieurs fils d'exécution.
Dans ce cas, on dit que ce processus possède plusieurs threads ou encore qu'il est
multithread. Grossièrement c'est un peu comme si un programme exécutait plusieurs
sous-programme simultanément.
TCB Code
Stack
Data
Thread Control
Block
Sur une machine monoprocesseur, un seul thread est actif à la fois. Sur une machine
multiprocesseur, plusieurs threads peuvent être actifs (parallélisme réel).
© W. KADRI 25
7. ALGORITHMES DE SCHEDULING
Le rôle de l'ordonnanceur est de sélectionner parmi les processus prêts celui qui va
être activé. La méthode de sélection peut dépendre de plusieurs paramètres : délai
d'attente déjà écoulé pour chaque processus, niveau de priorité, etc. Puis
l'ordonnanceur passe la main au distributeur (en anglais dispatcher), qui remet
effectivement en activité le processus sélectionné en restaurant son contexte
d'exécution (PSW, registres). Sa fonction inclut :
Le context switching
Changement du mode user au mode kernel
Initialisation du PC par l’adresse début du programme utilisateur.
Un nouveau processus est placé dans la Ready Queue, il attend dans cette liste sa
sélection pour l’exécution. Quand il dispose du processeur (élu) un parmi les
événements suivants se produit :
Le processus demande une I/O, il est placé dans la I/O Queue.
Le processus crée un fils et attend qu’il termine.
Le processus doit être forcé de quitter le CPU suite à une interruption (ou le
temps expire)
Le processus continue dans ce diagramme jusqu’à sa fin.
In
Ready Queue CPU
Out
I/O Queue
I/O I/O Request
Pour qu’un algorithme soit optimal il faut qu’il réponde aux critères suivants:
Utilisation maximale du CPU
Débit maximum
Temps de rotation minimal
Temps d’attente minimal
Temps de réponse minimal
Ces cinq critères sont plus ou moins mutuellement exclusifs. Les comparaisons des
différents algorithmes se fait donc sur une sélection de ces différents critères.
9. ALGORITHMES DE SCHEDULING :
Le scheduler doit décider quand un processus change d’état et passer par les
différentes transitions :de l’état Elu à l’état Bloqué, de l’état Elu à l’état Prêt, de l’état
Bloqué à l’état Prêt et enfin quand il se termine.
© W. KADRI 27
Préemptif : À chaque interruption, le CPU prend la main. Renferme les
décisions 1 à 4.
Input Output
CPU
Exemple :
Processus temps CPU
P1 24
P2 3
P3 3
Si on considère que l’ordre d’arrivée est P1, P2, P3 à t=0 et que le quantum q=4 alors
le diagramme de Gantt est :
P1 P2 P3 P1 P1 P1 P1 P1
0 4 7 10 14 18 22 26 30
P1 P2 P3 moyen
Temps attente 6 4 7 5.6
Turnaround 30 7 10 15.6
© W. KADRI 28
9.2 FCFS (First-Come-First-Served) (premier arrivé, premier servi)
Le FCFS utilise une file d’attente simple où le premier venu est le premier servi.
Input output
CPU
Exemple :
Processus temps CPU
P1 24
P2 3
P3 3
Si on considère que l’ordre d’arrivée est P1, P2, P3 , le diagramme de Gantt est :
P1 P2 P3
0 24 27 30
P1 P2 P3 moyen
Temps attente 0 24 27 17
Turnaround 24 27 30 27
9.3 SJF (Shortest-Job-First) (le plus court en premier)
Le SJF utilise une file ordonnée selon le temps d’exécution croissant (le plus court en
tête de liste et le plus long en queue de liste). Si deux processus possèdent le même
temps estimé, ils sont traités en FCFS. L’estimation est faite à priori.
Output
CPU
Input
Temps CPU
P4 P1 P3 P2
0 3 9 16 24
P1 P2 P3 P4 Moyen
Temps attente 3 16 9 0 7
Turnaround 9 24 16 3 13
© W. KADRI 29
Exemple2 : SJF Préemptif
Processus temps CPU Temps d’arrivée
P1 8 0
P2 4 1
P3 9 2
P4 5 3
P1 P2 P4 P1 P3
0 1 5 10 17 27
P1 P2 P3 P4 Moyen
Temps attente 9 0 15 2 6.5
Turnaround 17 4 25 7 13.25
Output
CPU
Input
priorité
P2 P5 P1 P3 P4
0 1 6 16 18 19
P1 P2 P3 P4 P5 moyen
Temps attente 6 0 16 18 1 8.2
Turnaround 16 1 18 19 6 12
© W. KADRI 30
Exemple2 : Priority Préemptif
Processus temps CPU Priorité Temps d’arrivée
P1 8 3 0
P2 4 2 1
P3 9 1 2
P4 5 3 3
P1 P2 P3 P2 P1 P4
0 1 2 11 14 21 26
P1 P2 P3 P4 moyen
Temps attente 13 9 0 18 10
Turnaround 21 13 9 23 16.5
Dans cet algorithme, on divise la Ready queue en plusieurs listes. Cette division
dépend du type de processus et de ces propriétés telles que la taille de la mémoire
etc…
Exemple :
Highest priority
System processes
Interactive processes
Batch processes
Student processes
MFQS permet à un processus de changer de listes. L’idée est basée sur le temps CPU
nécessaire au processus. Si un processus nécessite beaucoup de temps, il décroît dans
les listes jusqu’à la moins prioritaire. Un processus qui a beaucoup attendu dans une
liste peut grimper vers les priorités supérieures.
© W. KADRI 31
Exemple :
Considérons un MFQS à 3 listes F0, F1,F2.
F0
q=8
q=16 F1
FCFS F2
Tout nouveau processus est servi dans la liste F0. Si F0 est vide le scheduler exécute
F1. Si F1 est également vide, il exécute F2.
Si un processus arrive dans F0 ,il exécute la préemption des processus de F1 ( tous les
processus de F1 sont suspendus) et dispose du CPU. Egalement un processus
arrivant dans F1 fait la même chose avec les processus de F2 .
Le nombre de listes.
L’algorithme de scheduling de chaque liste.
La méthode utilisée pour dégrader un processus.
La méthode utilisée pour favoriser un processus.
L’algorithme utilisé pour déterminer la liste appropriée.
© W. KADRI 32
probabilité qu'ils soient tous en attente sur une E/S (et donc le CPU en Idle State) est
pn. L'utilisation du CPU est 1-pn .
© W. KADRI 33
Troisième Chapitre
GESTION DE LA MEMOIRE
1- INTRODUCTION
Au début de l'informatique les mémoires étaient chères et de petites tailles. A cette
époque les programmeurs passaient l'essentiel de leur temps à optimiser leur
programme en fonction de la taille mémoire. On a ensuite pu utiliser une mémoire
secondaire : bandes, tambours et disques. Le programmeur divisait, alors, son
programme en un certain nombre de morceaux appelés branches (overlays), chaque
branche étant de taille inférieure à celle de la mémoire. Pour exécuter un programme
on chargeait la première branche puis la seconde et ainsi de suite. Le programmeur
était totalement responsable de la découpe du programme, de la gestion et de la
migration des branches entre la mémoire principale et la mémoire secondaire.
En 1961 des chercheurs de Manchester ont proposé une méthode qui permettait de
rendre transparent au programmeur le mécanisme de gestion des branches. Au
début des années 1970 cette technique, dite de mémoire virtuelle, devint disponible
sur la plupart des ordinateurs. L'idée consiste à distinguer les notions d'espace
d'adressage et d'emplacement mémoire.
Dans ce chapitre nous abordons la problématique de la gestion de la mémoire dans
les systèmes d'exploitation. Nous abordons, d’abord, les aspects matériels de la
mémoire, en particulier les questions concernant les architectures des ordinateurs :
pourquoi les ordinateurs ont-ils plusieurs types de mémoire, qu’est-ce que la
mémoire virtuelle, entre autres.
2. DESCRIPTION DE LA MEMOIRE
Le programmeur travaille avec des adresses logiques, théoriques, qui n'ont aucune
relation directe avec les adresses physiques, celles où la RAM est implémentée.
Comme il faut bien tout de même qu'au bout du compte le programme s'appuie sur
© W. KADRI 34
des adresses physiques, un mécanisme de traduction d'adresse est mis en place le
MMU (Master Memory Unit).
Les processeurs Intel de type Pentium disposent d'un bus d'adresses de 32 bits, donc
232 adresses possibles, ce qui fait 4 Go de RAM adressable. Le but à atteindre est de
permettre aux programmeurs de concevoir leur application comme si 4 Go de RAM
étaient disponible, même s'il y en a beaucoup moins en réalité. Le mécanisme de
"swap" (fichier d'échange sur disque) permet d'atteindre cet objectif.
L'unité d'adressage est la plus petite quantité de mémoire qui sépare deux adresses
consécutives. Dans toutes les machines, par convention, on assigne à la première
position de mémoire l'adresse 0, à la deuxième l'adresse 1 et à la Nième l'adresse N-1.
Une machine peut être adressable par octet (byte) ou par mot de 16, 20, 32, 60, 64, …
bits. Dans une machine adressable par octet, un mot de 32 bits est constitué de 4
octets consécutifs. Mais les constructeurs ont adopté deux conventions différentes
pour ranger les octets à l'intérieur d'un mot. Dans la première convention l'octet qui
contient les 8 bits de poids faible du mot est rangé à l'adresse la plus basse. Il est
rangé à l'adresse la plus haute dans le second cas. Ces deux conventions sont parfois
référencées par les vocables de big-endian et little-endian respectivement. Aucune de
© W. KADRI 35
ces deux conventions n'est intrinsèquement meilleure que l'autre. Cela n'a
d'importance que lors d'un échange de données entre deux machines respectant des
conventions différentes. L'adresse du premier octet doit être paire, voire même un
multiple de 4.
L'espace virtuel est le nombre de cellules mémoires qu'un programme peut adresser
directement. Ce nombre dépend du nombre de bits utilisés pour manipuler les
adresses au niveau des instructions. La mémoire physique disponible sur la machine
peut avoir une taille différente de l'espace virtuel disponible pour chaque
programme.
L'espace physique peut être plus grand que l'espace virtuel. Dans cette configuration
il est possible de charger plusieurs programmes à la fois. Lorsque le contrôle de
l'unité centrale passe d'un programme à l'autre, l'exécution peut s'enchaîner
rapidement sans attendre le chargement du nouveau programme depuis le disque.
Comme l'unité centrale accède à la mémoire par des adresses comptant un plus
grand nombre de bits que les adresses manipulées par le programme il faut être
capable de "compléter" celles-ci. Cela peut se faire grâce aux registres de base dont
nous parlerons plus loin.
L'espace physique peut être plus petit que l'espace virtuel. Dans ce cas il faut
disposer d'un mécanisme capable de charger, à un moment donné, les parties du
programme nécessaires à son exécution. Ce mécanisme est également utilisé dans des
machines pour lequel l'espace physique est plus grand que l'espace virtuel. Il permet
en effet un partage plus efficace de la mémoire entre plusieurs programmes
concurrents.
© W. KADRI 36
Une adresse de N bits permet de repérer 2N cases. On peut la séparer en un numéro
de bloc, codé sur B bits (les bits de poids fort), et un numéro de case dans le bloc sur
N-B bits. Chaque bloc comptera 2N-B cases et il y aura 2B blocs, donc toujours 2N cases
au total.
Ce principe est facile à mettre en œuvre au niveau du matériel : les B lignes du bus
d'adresse correspondant aux bits de poids fort sont connectées à un registre de B bits
et les N B autres lignes sont commandées par un autre registre de N B bits. Ces
registres peuvent être chargés indépendamment par l'unité de calcul des adresses
effectives.
2.4-REGISTRE DE BASE
© W. KADRI 37
adresses physiques. Une des méthodes les plus utilisées est celle des registres de base
qui existent dans presque tous les ordinateurs. Le mécanisme est le suivant :
Les programmes sont "relogeables" et toutes les adresses connues par le
programmeur sont virtuelles, relatives au début du programme à l'adresse 0;
Un registre spécial de l'unité centrale, appelé registre de base, contient
l'adresse physique du début du programme dans la mémoire;
Chaque fois que l'on fait une référence à la mémoire, on ajoute à l'adresse
virtuelle trouvée dans le programme le contenu du registre de base.
La plupart des systèmes à mémoire virtuelle ont recours à la pagination. Sur tout
ordinateur, les programmes peuvent générer un certain nombre d'adresses. Les
adresses manipulées par des programmes sont appelées les adresses virtuelles et
constituent l'espace d'adresses virtuelles. Sur les ordinateurs sans mémoire virtuelle,
les adresses virtuelles sont directement placées sur le bus de la mémoire et
deviennent des adresses physiques. Lorsque la mémoire virtuelle est utilisée, les
adresses virtuelles ne sont pas directement placées sur le bus de la mémoire. Elles
sont d’abord traduites par l'unité de gestion de la mémoire ou MMU (Memory
Management Unit) en adresses physiques et ensuite placées sur le bus.
Plus précisément, une MMU (Master Memory Unit en anglais) est un circuit
d'interface sur le bus d'adresse entre le microprocesseur et la mémoire centrale. Dans
la pratique, ce circuit est directement intégré sur le silicium du microprocesseur. La
MMU transforme une adresse entrante, fournie par le microprocesseur, en une
adresse sortante, exploitée par la mémoire.
© W. KADRI 38
de poids faible conservés d'une adresse à l'autre constituant le déplacement
dans la page courante.
4. Dans le cas contraire, elle repositionne le PC du microprocesseur sur le début
de l'instruction en cours et génère une interruption.
Toutes les adresses manipulées par des programmes sont des adresses virtuelles
(logiques). Avant d'être appliquées au bus de données, elles passent par la MMU qui
les traduit en adresses physiques. Nous allons schématisé le principe général à
travers l’exemple suivant :
Exemple :
1- supposons que deux applications A et B tournent "en même temps". Elles
n'ont pas besoin de savoir comment elle vont s’exécuter chacune de son côté,
c'est pourquoi certaines adresses logiques peuvent correspondre à l'une
comme à l'autre. Cependant, grâce aux tables de conversions d'adresses, les
deux applications occuperont physiquement des zones de RAM distinctes
figure 4.1.
© W. KADRI 39
3- Le système va donc faire de la place, en déplaçant par exemple, le contenu de
la RAM utilisée par l'application A vers le fichier d'échange sur disque dur( il
effectue un swap). Cette place en RAM est maintenant disponible pour
l'application C. Bien entendu, lorsque ce sera au tour de A de reprendre le
travail, il faudra que l'OS restitue la zone de RAM disponible pour A (au
même endroit ou ailleurs, ça n'a aucune importance, du moment que les tables
de translation sont maintenues à jour).
2.6- LE "SWAP"
3. LA GESTION DE LA MEMOIRE
3.1 Gestion de la mémoire Sans va-et-vient
Cette méthode appelée la MFT utilise deux techniques : la MFT à file d’entrée
multiples (a) et la MFT a file d’entrée Unique (b)
© W. KADRI 40
L'organisation de la mémoire en partitions fixes est une méthode facile à mettre en
œuvre pour les systèmes à traitements par lots. Avec les systèmes à temps partagé, la
situation est différente; la mémoire existante utile est inférieure à la taille de tous les
processus, donc, ne pouvant contenir les processus de tous les utilisateurs, il faut
placer quelques processus sur le disque ; et les ramener en mémoire principale avant
de les exécuter. Le mouvement de va-et-vient des processus entre la mémoire
principale et le disque est appelé le swapping.
En pratique, les partitions fixes ne sont pas très intéressantes lorsque la mémoire est
limitée, car on perd beaucoup de place à cause des programmes qui sont plus petits
que les partitions. Avec les partitions variables, le nombre, la position, la taille des
processus en mémoire varient dynamiquement au fur et à mesure qu'ils entrent ou
sortent de la mémoire. Cette méthode appelée la MVT améliore l'usage de la
mémoire mais complique son allocation et sa libération.
On peut réunir les espaces inutilisés (les trous) en une seule partition de grande taille
en déplaçant tous les processus vers le bas de la mémoire. Cette technique s’appelle
le compactage de la mémoire, elle est rarement utilisée parce qu’elle consomme
beaucoup de temps CPU.
L'allocation est simple si les processus ont une taille fixe qu'ils ne modifient jamais :
on alloue exactement la taille requise. Si en revanche, la taille des segments de
données des processus peut varier, par exemple lorsqu'on alloue dynamiquement de
la mémoire dans le tas, on a des difficultés dès qu'un processus demande de la
mémoire. Il existe trois manières de mémoriser l'occupation de la mémoire.
Les tables de bits (bit maps),
Les listes
les subdivisions (Buddy System).
© W. KADRI 41
3.2.1 - GESTION DE LA MEMOIRE AVEC BIT MAPS
La mémoire est divisée en unités d'allocation dont la taille peut varier de quelques
mots à plusieurs Kilo-octets. A chaque unité, on fait correspondre un bit dans la table
de bits qui est à 0 si l'unité est libre et à 1 si elle est occupée (ou vice versa).
La taille de l'unité d'allocation joue un rôle important. Plus elle est faible plus la table
est importante. Si on prend une unité d'allocation de grande taille, on réduit la taille
de la table de bits, mais on perd beaucoup de place mémoire chaque fois que la taille
d'un processus n'est pas un multiple de la taille de l'unité d'allocation. La table de
bits permet ainsi de mémoriser l'occupation de la mémoire dans un espace mémoire
de taille fixe, le seul problème survient lorsqu'on doit ramener en mémoire un
processus de k unités. Le gestionnaire de la mémoire doit alors parcourir la table de
bits à la recherche de k zéros consécutifs. Cette recherche est lente, ce qui fait qu'en
pratique on utilise rarement les tables de bits.
La figure suivante montre une mémoire divisée en unité d’allocation dont la taille
peut varier de quelques mots à plusieurs kilo-octets. Bit à 0 si l’unité est libre, Bit à 1
si l’unité est occupée
(a) Une partie de la mémoire occupée par 5 processus
(b) Table de bits correspondante
(c) Liste chaînée
© W. KADRI 42
ALGORITHME DE LA PREMIERE ZONE LIBRE (FIRST FIT)
On recherche la zone libre la plus petite qui convient. On évite ainsi de fractionner
une grande zone dont on pourrait avoir besoin plus tard. Il est plus lent car il
parcourt toute la liste et ce qui est le plus étonnant, c'est qu'il fait perdre plus
d'espace que les deux précédents.
Il consiste à toujours prendre la plus grande zone libre disponible pour que la zone
libre restante soit la plus grande possible. La simulation a montré que cette stratégie
ne donne pas de bons résultats. On peut accélérer ces quatre algorithmes en utilisant
les listes séparées pour les processus et les zones libres et de nombreux autres
algorithmes s'appliquent si on suppose connues à l'avance la distribution de taille
des processus et leur durée d'exécution.
© W. KADRI 43
L'allocution par subdivision est un algorithme de gestion de la mémoire qui s'appuie
sur le fait que les ordinateurs utilisent des adresses binaires de manière à accélérer la
fusion de zones libres adjacentes lorsqu'un processus se termine ou est déplacé sur le
disque. Le gestionnaire de mémoire mémorise une liste des blocs libres dont les
tailles sont de 1, 2, 4, 8, 16…octets, jusqu’à la taille maximale de la mémoire
4.1 - LA PAGINATION
L'espace d'adressage virtuel est divisé en petites unités appelées des pages. Les
unités correspondantes de la mémoire physique sont les cases mémoires (page
frames). Les pages et les cases ont toujours la même taille. Les transferts entre la
© W. KADRI 44
mémoire et le disque se font toujours par pages entières. La longueur des pages est
toujours une puissance de 2 ce qui facilite l'obtention de l'adresse physique par
assemblage binaire.
Le mécanisme de gestion qui permet de passer d'une adresse virtuelle à une adresse
physique dans un système de pagination passe par la table des pages. Les propriétés
de la table de pages sont les suivantes :
Il y a une table des pages pour chaque programme;
La table des pages contient une entrée pour chaque page virtuelle du
programme;
Le début de la table des pages est chargé dans un registre : le registre de base
de la table de pages (RBTP);
Chaque entrée de la table peut contenir :
o des bits de contrôle :
page présente en mémoire/page absente;
page modifiée/non modifiée;
autorisation d'accès en écriture;
compteur d'utilisation;
o deux adresses :
position de la page en mémoire secondaire (en général un disque
: unité, face, piste et secteur);
numéro du bloc de mémoire physique contenant la page, si la
page virtuelle est présente en mémoire.
© W. KADRI 45
b) La page est absente. Le MMU constate que cette page n'est pas
mappée et provoque un déroutement (trap) : le processeur est restitué
au S.E (la main est donnée à l’OS). Le déroutement est appelé un défaut
de page (page fault). Le S.E repère une case en utilisant un algorithme
de défaut de page, et recopie son contenu sur le disque. Il met à jour la
table des pages et cherche sur disque la page demandée, ensuite, la
place dans la case qui vient d'être libérée, positionne leurs bits et
relance l'instruction déroutée. On est alors ramené au cas 3a
Pour accélérer la phase 3.a il est possible d'utiliser une mémoire associative utilisant
le numéro de page virtuelle comme étiquette et fournissant en sortie le numéro de
bloc physique. Cette mémoire associative ne contient alors que les pages en mémoire.
Si la recherche est infructueuse le système utilise la table des pages.
© W. KADRI 46
Exemple
Soit, par exemple des pages de 4Ko avec 64Ko de mémoire virtuelle et 32Ko de
mémoire physique. On a, donc, 16 pages virtuelles et 8 cases. Les transferts entre la
mémoire et le disque se font toujours par pages entières.
Soit l’instruction MOVE R0, 0, l'adresse virtuelle 0 est envoyée au MMU. Ce dernier
constate que cette adresse virtuelle se situe à la page 0 (adresses de 0 à 4095) qui
appartient à la case 2 (8192 à 12887). Le MMU transforme l'adresse en 8192 et place
cette valeur sur le bus. La carte mémoire ne connaît pas l'existence du MMU. Elle
reçoit simplement une demande de lecture de l'adresse 8192. Le MMU a donc mappé
les adresses virtuelles comprises entre 0 et 4096 sur les adresses physiques 8192 à
12357.
Ce mappage au moyen du MMU des 16 pages virtuelles sur n'importe laquelle des
huit cas ne résout pas le problème soulevé par le fait que l'espace d'adressage virtuel
est plus grand que la mémoire physique. Comme on n'a que huit cas physiques, on
ne peut mapper que huit pages virtuelles sur la mémoire physique. Que se passe-t-il
si le programme tente d'utiliser une page non mappée par exemple en effectuant un
MOVE R0, 32780 ? (cette adresse se situe à un déplacement de 12 octets après le
début de la page 8 qui commence à l' adresse 32768.) Le MMU constate que cette
page n'est pas mappée et provoque un déroutement (trap) : le processeur est restitué
au S.E. Le S.E repère une case en utilisant un algorithme de défaut de page, et recopie
son contenu sur le disque. Il met à jour la table des pages et cherche sur disque la
page demandée, ensuite, la place dans la case qui vient d'être libérée, positionne
leurs bits et relance l'instruction déroutée.
© W. KADRI 47
On utilise pour les caches des mémoires statiques très rapides. La mémoire cache
permet de combler en partie la différence entre les vitesses de l'unité centrale et de la
mémoire. On trouve très souvent deux niveaux de mémoire cache. Le premier niveau
est intégré au processeur et dispose d'un temps d'accès équivalent au cycle de
fonctionnement de celui-ci. Le second niveau est de plus grande taille mais plus lent.
Une mémoire cache intégrée au processeur, ou très proche, est basée sur une
mémoire associative.
Les statistiques ont montré que 80 à 90 % des programmes se trouvent dans des
boucles. C'est pourquoi une mémoire cache peut obtenir un taux de réussite,
probabilité de trouver l'instruction dans le cache, de 70 à 90 %. L'emploi des
mémoires caches est essentiel dans les architectures RISC. Certains processeurs
disposent de deux caches pour les instructions et les données (architecture de
Harvard).
Même en dehors d'une boucle, comme le traitement des instructions est séquentiel on
a intérêt à transférer les instructions par blocs. On appelle un tel bloc une ligne,
équivalente à la page entre mémoire et disque.
© W. KADRI 48
Adresses utilisées directement par le coeur du processeur, et qui constituent les
adresses mentionnées dans les programmes et le système d'exploitation.
4.2 - LA SEGMENTATION
La pagination est une technique qui permet d'implanter un grand espace d'adressage
linéaire dans une mémoire physique limitée. Pour certaines applications, il est plus
commode d'avoir un espace d'adressage à 2 dimensions. L'idéal serait que chaque
processus possède un grand nombre de segments ( par ex 232 )formé chacun d'un
grand nombre d'octets(232). Les premiers segments (par ex les 64 premiers Ko)sont
réservées aux procédures, aux données, à la pile et au tas du programmes en cours
d'exécution. Les autres segments peuvent chacun contenir un fichier pour que les
processus puissent adresser directement leurs fichiers sans avoir à les ouvrir et à
utiliser les primitives d'E/S particulières pour les lire et les écrire.
A la suite d'un défaut de page, le SE doit retirer une page de la mémoire pour libérer
de la place pour la page manquante. Si la page à retirer a été modifiée depuis son
chargement en mémoire, il faut la réécrire sur le disque. Sinon le disque est déjà à
jour. La page lue remplace simplement la page à supprimer. Cette dernière peut être
choisie au hasard, mais on améliore sensiblement les performances du système si on
choisit une page peu utilisée. Les algorithmes de remplacement de page ont été très
étudiés tant du point de vue théorique que pratique.
Les ordinateurs associent à chaque page deux bits d'informations sur les pages
utilisées. Le premier bit, R ou bit de référence, est positionné par le matériel à chaque
lecture ou écriture de la page .Le deuxième bit, M ou de modification est positionné
quand on écrit dans une page (stockage d’un byte dans cet page). Ces deux bits R et
M permettent de construire l'algorithme de pagination suivant :
Au lancement d'un processus, le S.E. met à 0 les bits R et M de toutes ses pages.
Périodiquement (sur chaque interruption d’horloge), le bit R est remis à 0 pour
différencier les pages qui n'ont pas été récemment référencées des autres. Lorsqu'un
défaut de pages se produit le SE parcourt toutes les pages et les repartit dans les
quatre classes suivantes en fonction des différentes valeurs de bits R et M.
Classe 0 : Non référencée, non modifiée (R=0 , M=0)
Classe 1 : Non référencée, modifiée (R=0 , M=1)
Classe 2 : Référencée, non modifiée (R=1 , M=0)
Classe 3 : Référencée, modifiée (R=1 , M=1)
L’interruption d’horloge n’affecte pas M puisqu’il est utilisé pour savoir si la page
sera modifiée (réécrite sur disque).
L'algorithme de la page non récemment utilisée ou NRU (Not Recently Used) retire
une page au hasard de la catégorie non vide qui a le plus petit numéro (0,1,2,3).
L'algorithme NRU est facile à comprendre, relativement efficace et fournit des
performances qui sont suffisantes même si elles ne sont pas optimales.
Le SE mémorise une liste de toutes les pages en mémoires, la première page étant la
plus ancienne et la dernière, la plus récente. Lorsqu'il se produit un défaut de pages,
on retire la première page de la liste et on place la nouvelle à la fin de cette liste. Cet
algorithme, présente l'inconvénient de pouvoir retirer une page ancienne mais très
utilisée.
FIFO Amélioré :
Une solution consiste à remplacer la page la moins récemment utilisée (LRU : Least
Recently Used). C'est le rôle du compteur associé à chaque entrée de la table des
pages. Il indique la plus récente référence à la page. D'autre part, si la page a été
modifiée il faut la sauvegarder en mémoire secondaire avant de libérer
l'emplacement physique.
Cette stratégie est celle de la page la moins récemment utilisée ou pagination LRU
(least recently used) L'algorithme LRU est théoriquement réalisable mais il est très
coûteux. Il faut en effet mémoriser une liste chaînée de toutes les pages en mémoire.
La page la plus utilisée étant en tête et la moins utilisée en queue de liste. La
difficulté naît du fait que cette liste doit être mise à jour chaque fois que la mémoire
est adressée.
© W. KADRI 51
6- CONCEPTION DES SYSTEMES PAGINES
Dans ce modèle, les processus sont lancés sans qu’aucune de leurs pages ne soit en
mémoire. Dès que le processeur essaye d’exécuter le premier Working-Set, il se
produit un défaut de page. Le système amène la page qui contient l’instruction.
D’autres défaut de pages ramèneront les Data et la Pile du processus. Au bout d’un
moment, le processus dispose de la majorité de ces pages et s’exécute sans défaut de
page fréquent. Ce mécanisme est la stratégie de la page à la demande. Cependant, un
programme qui génère beaucoup de défaut de pages provoque l’écroulement du
système.
© W. KADRI 52
Quatrième Chapitre
GESTION DES ENTREES-SORTIES
1- INTRODUCTION
Un utilisateur lance une commande shell (a) ou l’exécution d’un fichier contenant
une primitive d’E/S système (b).
Un appel superviseur va faire passer l’état du mode utilisateur (user) au mode noyau
pour permettre l’exécution de la primitive (c). pour une question de protection
système les primitives qui se chargent d’exécuter les E/S doivent s’exécuter en mode
noyau (Kernel).
© W. KADRI 53
ces paramètres avant d’entamer l’appel. Le compilateur ou le shell se charge, dans les
cas précédents, à placer ces paramètres au bon endroit.
(a)
(b)
Supposons que l’on dispose d’une primitive système qui se charge d’imprimer à
l’écran un caractère passé en paramètre. La documentation système indique que la
primitive sur un CPU (décrit au chapitre translation) exige que le caractère à
imprimer doit se trouver dans le registre R1. Le système impose que pour réaliser
l’appel superviseur on doit placer le numéro K de la primitive dans le registre R0 et
© W. KADRI 54
provoquer l’appel superviseur par l’interruption INT 21h. (dans le cas de notre CPU (
TRAP # X21). Ceci se résume selon l’assembleur de notre machine par :
LL R1 , #’caractère à imprimer’
LL RO, #K
TRAP #X21.
USER
KERNEL
(c)
La main est donnée, par la trappe, au système qui passe directement à RO, il trouve
l’indice K, il passe à la table des primitives systèmes à l’entrée K et extrait la
primitive d’affichage du caractère à l’écran. Il initialise cette routine qui va
directement à R1 pour prendre son contenu et l’imprimer à l’écran. L’implémentation
de la trappe (int 21h) système est implicite au shell et aux librairies systèmes
associées aux langages de programmation. Le schéma (d) montre ce cheminement.
(d)
© W. KADRI 55
processeur central ne gardant que l’initiative du lancement et du contrôle des
opérations
PERIPHERIQUE
C’est un organe capable de transformer de l’information depuis ou vers un support
externe. Le système [contrôleur, périphérique] définit une interface capable d’un
certain nombre de fonctions. Cet interface :
- accepte des commandes
- exécute des fonctions
- signale des erreurs
CONTROLEURS
CANAUX
Un canal ou unité d’échange est un processeur spécialisé dans les opérations d’E/S. il
ne peut être lancé que par le processeur central et ne possède pas d’interruptions
mais peut interrompre le processeur central. Son répertoire d’instructions lui permet
d’activer les contrôleurs et les périphériques qui lui sont connectés. Sur les mini-
ordinateurs et les micro-ordinateurs on trouve une forme simplifiée de canal appelée
« ADM »
- Acces Direct Memory (ADM): Pour expliquer le fonctionnement du DMA,
examinons la lecture du disque lorsque le DMA n’est pas utilisé. Le contrôleur lit un
bloc (un ou plusieurs secteurs) bit par bit jusqu’à ce qu’il soit entièrement dans le
tampon du contrôleur. Puis il effectue un contrôle pour vérifier les erreurs. Le
contrôle ne peut avoir lieu que si le bloc a été entièrement lu. Le contrôleur génère
© W. KADRI 56
une interruption. L’OS peut lire le tampon du contrôleur et le recopier en mémoire.
Cette lecture peut se faire au moyen d’une boucle qui lit à chaque itération un octet
ou un mot du tampon. Elle consomme beaucoup de temps.
Le DMA a été installé pour libérer le processeur de ce travail de bas niveau. Le
processeur donne au contrôleur l’adresse des blocs sur le disque, l’adresse mémoire
où ils seront transmis et le nombre d’octets à transmettre.
Les interblocages
On qualifie de ressources tout objet pouvant être alloué à un processus. Elle peut être
un périphérique, un processeur, une zone mémoire, un fichier etc..
L’utilisation d’une ressource produit les 3 évènements:
1- Demande de la ressource
2- Utilisation de la ressource
3- Libération de la ressource
ETAT SUR :
Un état est sûr si le système peut allouer des ressources à chaque processus (jusqu’à
son maximum) dans un certain ordre évitant l’interblocage.
© W. KADRI 57
Un système est dans un état sûr s’il existe une séquence saine. Un séquence de
processus <P1, P2,…Pn>est saine si pour chaque Pi, les requêtes de Pi peuvent être
satisfaite par les ressources disponibles plus les ressources détenues par tous les Pj
avec j<i.
GRAPHE D’ALLOCATION :
Avec une seule instance pour chaque type de ressource, on peut éviter les
interblocages en utilisant le graphe des ressources. On ajoute un arc au graphe que si
cet arc ne produit pas de cycle.
ALGORITHME DU BANQUIER :
© W. KADRI 58
Si i n’existe pas aller à 4
3- Work= Work + Allocation
Finish(i)=true
Aller à 2
4- Si Finish[i]=true pour i=1..n alors le système est dans un état sûr
Si l’état d’allocation est sûr la transaction est terminée et on alloue à Pi ses ressources.
Si le nouvel état n’est pas sûr, Pi doit attendre et l’ancien état est restauré.
Exemple :
Soit un système avec un 5 processus P0, P1, P2, P3, P4 et 3 types de ressources
A B C
P0 7 4 3
P1 1 2 2
P2 6 0 0
P3 0 1 1
P4 4 3 1
1- Le système est couramment dans un état sûr. Puisque <P1, P3, P4, P2, P0> est
une séquence saine
2- Supposons que P1 demande 1 instance de A et 2 instances de C.
Donc Request1= (1, 0, 2) . Pour décider si la requête est accordée :
1- Si Request1 Available (1,0,2) (3,3,2) ce qui est vrai
2- Nous arrivons à l’état :
Allocation Need Available
A B C A B C A B C
© W. KADRI 59
P0 0 1 0 7 4 3 2 3 0
P1 3 0 2 0 2 0
P2 3 0 2 6 0 0
P3 2 1 1 0 1 1
P4 0 0 2 4 3 1
Est-il sûr algorithme de l’état sûr <P1, P3, P4, P0, P2> est saine dons
Request accordée. Cependant Request4= (3,3,0) de P4 ne peut être accordée.
Request4 = (3,3,0) Available = (2,3,0) non
Request0 = (0,2,0) ne peut être satisfaite puisque l’état est non sûr
Exemple :
P5
P5
R3
R4
R1
P1 P2 P3
P2
P1 P3
P4
P4 R5
R2
Graphe d’attente
Graphe d’allocation
© W. KADRI 60
2- Instance multiple de ressources
Exemple :
A B C
P0 0 0 0
P1 2 0 2
P2 0 0 1
P3 1 0 0
P4 0 0 2
Le disque virtuel
L’information sur disque est référencée par une adresse en plusieurs parties : le
n°d’unité, la piste et le secteur. Toutes les pistes d’une unité auxquelles on accède
sans déplacement des têtes constituent un cylindre. Dans une piste les informations
sont stockées en secteur. Ce dernier étant l’information la plus petite pouvant être lue
ou écrite sur disque.
© W. KADRI 61
Les algorithmes du Scheduling du disque :
Il est important que le service du disque soit aussi rapide que possible. l’OS peut
améliorer le temps de service en schedulant convenablement les requêtes d’accès au
disque.
1- FCFS :
Cet algorithme est facile à programmer et intrinsèquement juste. Cependant, il ne
peut fournir le même service
Exemple : soit une suite de piste
53, 98, 183, 37, 122, 14, 124, 65, 67
© W. KADRI 62
3- SCAN
Cet algorithme fait le scan du disque (balayage) et traite les requête. Il faut connaître
la direction du montant.
4- C-SCAN
C’est le SCAN circulaire de la piste 0 dernière et au lieu de faire demi-tour, on revient
à la piste 0.
5- LOOK
Dans la pratique, le Scan et le C-Scan ne sont pas implémentés de cette manière. En
générale, la tête est seulement déplacée jusqu’à la dernière requête dans cette
direction. Dès qu’il n’existe aucune requête dans la direction courante le mouvement
de la tête est inversé. La version de Scan est Look.
0 14 37 53 65 67 98 122 124 183 199
C-LOOK
C’est le correspondant à C-Scan
© W. KADRI 63