Académique Documents
Professionnel Documents
Culture Documents
CONSIDERATIONS PRELIMINAIRES
1.1 DEFINITION
Un système d‟exploitation est un ensemble de programmes qui joue le rôle de l‟interface entre
utilisateur et ordinateur et Il s‟occupe de la gestion rationnelle de ressources tant hardware
que software de l‟ordinateur.
1.2.1. Introduction
Un ordinateur est une machine capable de résoudre un problème en suivant les instructions
d‟un programme. Nous allons décrire un modèle assez représentatif des ordinateurs utilises
actuellement et nous appuyer d‟un système a microprocesseur pour faire un survol sur ce
fonctionnement de l‟ordinateur
Machine a calculer a engrenages mécanique a été inventée par Blaise Pascal (1623-
1662) et pouvait réaliser des opérations arithmétiques (addition, multiplication,
soustraction et était une machine mécanique a base „engrenage.
Machine a tube a vides
Pendant la seconde guerre mondiale, fut construit un ordinateur (COLOSSUS) a tube a vide
par le mathématicien Anglais ALAIN TURING. Cet ordinateur a pu décoder des messages
cryptés envoyés par amiraute allemande, par onde radio, au sous marin allemands.
En 1943 MANCHEY aidé par un de ses étudiants en thèse a conçu et construit un ordinateur
a tube (ENIAC (Electronic numerical integration and computeur)) a vide ayant les
caractéristiques :
-18000 tubes
-1500 relais
-10 registres
-10 chiffres décimaux
-pesait 30tonnes et consommait 140 kW
On la programmait en langage machine, en manipulant quelques 6000 commutateurs
interconnectés par un foret de câble.
Un des participant VON NEUMAN génie au même titre que Léonard de Vinci :
Parlait plusieurs langues couramment
Expert en sciences physiques et mathématiques
Pouvait se souvenir de tous ce qu‟il a vu et entendu
E S
N O
T R
R MEMOIRE T
E I
E E
Unité ALU
de
comma ACC
nde U
Un système a microprocesseur peut être aussi développe comme un ordinateur qu‟on peut
facilement transporte, dédicacer a :
- contrôler les paramètres fonctionnels d‟une voiture
- Un pilote automatique (ordinateur embarqué) d‟un avion
- Un central téléphonique
1.2.3.1. Microprocesseurs
Un microprocesseur est une unité centrale de traitement (CPU), il est le moteur du traitement
de l‟information dans un microordinateur, système a microprocesseur.
Relier directement ou indirectement à tous les composants du système ou PC
CPU : central processing unit est l‟élément moteur de l‟ordinateur qu‟il interprète et exécute
les instructions du programme
CPU = CU + ALU + Registres
CU : command unit
ALU : Arithmétic Logic unit
(ALU)
Unité arthritique et
logique
REGISTRE
DISQUE IMPRIMA
CO RI NTE
Mémoire
principale
AC
…. Contrôleur Contrôleur
HDD imprimante
RA MEMOIRE RM
AC
CO RI
Décodeur
2
3
Horloge Séquenceur
Mémoires, entrées/entrées
Fig.3. Structure interne d‟un microprocesseur hypothétique
A+B
A (A+B) .C
+ C = ( A + B ) + C =( A . B ) + C
B
(a)
Adresse (b)
A B C M
D2
Step 4
D4
C C+E
(Step 3)
D3
D1
Step 0
Step 1
0. LOAD B ( A B)
1. Test (A0, A) / ( 2, 3 )
2. C C+D
GOTO 4
3. C C+E
4. STOP
P1
(master)
CPU P2
Polling slave
P3
P4
P1
IREQ1
INT
CPU
INTA PIC IREQ2
P2
IREQ n
P3
data
adress
Pour bien réaliser les opérations entrée /sortie avec un périphérique rapide,
On utilise le transfert direct entre le périphérique et la mémoire sous contrôle DMA
En vue d‟effectuer les opérations d‟entrée/sortie, par DMA, les paramètres suivants sont
utilises.
- adresse bloc de données du départ ;
- adresse bloc arrivé ;
- nombre mots à transférer.
BUSREQ BUSG P1 P2 Pj
MEMOIRE DMA
DATA
Logique
MICRO- décodage
PROCESSEUR
ADDRESS
Control
Fig.8. Système a microprocesseur utilisant opération entrée/sortie
MEMOIRE
PRINCIPALE
PROCESSEUR
Contrôleur des
terminaux imprimante disque disque disque
L‟ordinateur peut être perçu comme un système organise en couche, de la même manière
que celle du modèle OSI. Cette organisation s‟inspire de l‟approche oignons, qui
consiste a décomposer un problème complexe en module moins complexe, qu‟on peu
mieux maîtriser. Ainsi l‟ordinateur (ses modules hardware et software) peut être perçu
comme une superposition de machines virtuelles.
Sur les Fig.10.(a). et Fig.10.(b) est illustrée l‟organisation en couches d‟un ordinateur.
Couche de
langage d‟assemblage
Niveau 5
Traduction(assembleur)
Couche système
. d‟exploitation
.
Niveau 4 interprétations SE
Couche traductionnelle
Niveau 3
Interprétations (microprogramme)
Couche microprogrammée
Niveau 2
Couche physique
Niveau 1 Circuit electronique
(poste logique)
Gestion de :
- de processus (de processeur)
- des entrées / sorties
- de la mémoire
- du système de fichiers
I. 4. 1 Définition formelle
PARTIE COMMANDE
PARTIE CONTROLE
TACHE 1 TACHE 2 . .
TACHE ………
3 TACHE n
Feedback
Compltes
Rendus Actions
PROCESSUS
Fig.12.
calculeur
Amplificateur
puissance
Robot
Sur le Fig.12, Fig.13. sont pressentes un robot industriel a 3 grades de libertés, respectivement
un robot industriel contrôle par un calculateur.
En réalité le processeur physique commute des taches sous le contrôle d‟un module particulier
au système d‟exploitation, appelé Ordonnanceur.
A
Figure.14.(a) Modèle d‟un système d‟exploitation comportant les taches A,B,C
Figure 16
Tache C
Tache B
Tache A
Monitoring
imprimante
Niveau operationnel
Fig.16. Pour la mesure de température dans une usine d‟industrie chimique, on peut
utiliser un système multi-calculateur / microprocesseur à deux niveaux :
- niveau de supervision
- niveau opérationnel
Ce genre de contrôle implique un polling périodique de sous système microprocesseur par le
niveau de supervision, qui se comporte un peu comme le maître (master).
Ce genre de système est apparu vers la fin des années 50 et le début des années 60. Pour
lancer un travail (job), un programme ou ensemble de programmes) le programmeur devrait
commencer à écrire le programme (en FORTRAN ou assembleur) puis devrait le mettre sur
des cartes perforées. Il amenait ses cartes à la salle de soumissions des travaux et les donnait
à l‟un des opérateurs. Lorsque l‟ordinateur terminait un travail, un opérateur retirait les
résultats de l‟imprimante et les portait à la salle de retrait des travaux pour que le
programmeur puisse venir les prendre.
L‟idée directrice du traitement par lots était de collecter un ensemble des travaux codifiés
dans des cartes perforées, les soumettre au lecteur de cartes, avant qu‟ils puissent être
transférés dans les bandes magnétiques, en utilisant par exemples un petit ordinateur peu
onéreux (IBM 1401), qui était excellent pour lire les cartes, copier les bandes et imprimer les
résultats mais très mauvais pour les calculs numériques.
D‟autres machines, bien, plus chères, comme IBM 7094, étaient utilisées pour les calculs.
Sur la Fig.17.suivante est illustré un de premiers systèmes du traitement par lot.
Les opérations puissent être résumées de la manière suivante :
- les programmeurs portent les cartes IBM 1401, qui transcrit les travaux ;
- l‟opérateur porte la bande de données à l‟IBM 7094, qui va effectuer les calculs ;
- l‟opérateur fournit la bande des résultats à l‟IBM 1401, qui va s‟occuper de
l‟impression
Il s‟agit d‟une organisation assez répandue .Cette approche pourrait être surnommée « le
grand désordre ». La situation est qu‟il n‟ y a pas de structure.
Le système d‟exploitation est une collection de procédure, chacune pouvant appeler à
n‟importe quel moment n‟importe quelle autre .Chaque procédure du système doit de ce fait,
avoir une interface bien définie au niveau de ses paramètres et des résultats qu‟elle retourne et
peut appeler toute autre procédure qui lui est utile.
Pour construire le code objet du système d‟exploitation, il faut compiler toutes les procédures,
ou les fichiers qui les contiennent puis, les réunir au moyen d‟un éditeur de liens.
Même dans les systèmes monolithiques, il est possible d‟avoir une structure minimale .Les
services offerts par le système d‟exploitation sont adressés en mettant des paramètres dans des
endroits biens définis, (registres, piles,…) et en exécutant ensuite une instruction spéciale
nommée « appel au noyau, appel au superviseur. Cette instruction commute le mode
utilisateur au mode noyau (superviseur).
En nous appuyant sur la Fig.18 ci –dessous nous pouvons expliquer le fonctionnement :
4 Procédure
Service S.E
1 S‟exécute en mode
noyau
2 3
On dit d‟une machine qu‟elle est multiprogrammée si plusieurs programmes sont chargés en
même temps , en mémoire dans le but de partager le CPU . La multiprogrammation est donc
une technique qui vise l‟élimination du temps d‟attente du CPU pendant les opérations
Ordinateur
n programmes à la fois
E/S
Ordinateur
n programmes à la fois
E/S
Iimprimante
Fig.20. Principe d‟un système multiutilisateur (temps partage)
Dans la figure ci dessous est décrite la répartition du temps CPU entre utilisateur dans un
système multi utilisateur (time sharing)
USERS
USER4
USER3
USER2
USER1
0 t1 t2 t3 t4 t5 t6 t7 t8
Fig.21. Répartition du temps CPU entre utilisateur dans un système multi utilisateur (temps
parage).
Dans certains systèmes, on a eu l‟idée de déplacer une grande partie du code du système
d‟exploitation dans une couche plus élevée. Ainsi selon cette idée, la tendance des systèmes
d‟exploitation modernes tente de réduire le système d‟exploitation à un noyau minimal. Donc,
on a reporté la plupart des fonctions du système d‟exploitation dans un processus utilisateur.
Pour demander un service comme la lecture d‟un bloc d‟un fichier, un processus utilisateur
(aussi appelé client) envoie une requête à un processus serveur qui effectue le travail et lui
envoie la réponse sur la Fig.22.
Dans le modèle illustré sur la Fig.22 le noyau ne gère que la communication entre les
processus clients et serveurs.
La décomposition du système d‟exploitation en petites parties qui ont chacune une fonction
particulière, telle que la gestion des fichiers, processus, des terminaux, ou de la mémoire, rend
ces parties plus faciles à modifier. De plus, les serveurs s‟exécutent comme des processus en
mode utilisateur, et non en mode noyau, ne peuvent pas accéder directement au matériel. Une
conséquence notable est q‟un bogue dans le serveur de fichiers par exemple, n‟affectera pas
en général l‟ensemble de la machine. Le modèle client-serveur se prête par ailleurs très bien
à une utilisation dans les systèmes distribués tel qu‟on peut le constater sur la Fig.23.
Un client qui envoie des messages à un serveur, n‟a pas besoin de savoir si il est traité sur sa
propre machine ou s‟il est transmis au serveur d‟une machine au travers d‟un réseau. Du point
de vue de client la même chose se produit dans les deux cas : il va envoyer et puis, il va
reçevoir une réponse.
2. GESTION DE PROCESSUS
Il est l‟abstraction d‟un programme en cours d‟exécution. Un programme étant une suite
d‟instructions contenue dans un fichier. Tous les ordinateurs peuvent effectuer plusieurs
taches à la fois. Un ordinateur peut, pendant qu‟il exécute le programme d‟un utilisateur, lire
les données d‟un disque ou afficher les résultats sur écran ou une imprimante. Dans un
système multiprogrammé, le processus peut aussi commuté d‟un programme à un autre en
exécutant chaque programme pendant quelques dizaines ou centaines de millisecondes. Mais,
le processeur, à un instant donné, n‟exécute réellement qu‟un seul programme. Pendant une
seconde, le processeur peut exécuter plusieurs programmes et donne ainsi aux utilisateurs une
impression de parallélisme. Certains qualifient de pseudo parallélisme une commutation
instantanée du processeur d‟un processus à un autre,la différencier du vrai parallélisme qui se
produit au niveau du matériel lorsque le processeur travaille en même temps que certains
périphériques d‟entrée/sorties.
Les systèmes d‟exploitations qui font appel au concept de processus doivent permettre de
créer le processus requis. Dans la plupart des systèmes il faut pouvoir créer et détruire
dynamiquement les processus. Les processus dans MINIX, sont crées par l‟appel système
FORK( ) qui crée une copie conforme du processus appelant. Le processus fils peut aussi
effectuer un FORK( ), ce qui conduit rapidement à une arborescence de processus. D‟autres
systèmes d‟exploitation ont des appels système pour créer un processus, changer son état
concept et lancer son exécution. Quelle que soit la nature de l‟appel système, les processus
doivent pouvoir créer d‟autres processus. Notez qu‟un processus n‟a qu‟un père et peut avoir
plusieurs fils.
Les processus bien qu‟étant des entités indépendantes, doivent parfois interagir avec d‟autres
processus. Les résultats d‟un processus peuvent, par exemple,être les données d‟un autre,
comme ous pouvos le constater dans la commande shell.
Cat fichier1 fichier2 fichier3 /grep etudiant
Le processus qui exécute cat, concatène les trois fichiers (fichier1, fichier2, fichier3) et envoie
le résultat sur la sortie standard. Le deuxième processus qui exécute grep, recherche lignes qui
contiennent le mot étudiant.
Si grep est prêt à s‟exécuter et ne peut pas lire faute de données .Il doit se bloquer en
attendant les données, un processus peut être dans les états suivants :
- bloqué
- Elu
- Prêt
tel que nous pouvons aussi le constater sur la Fig.24. ci-dessous
ELU
1
2
3
BLOQUE
PRET
4 4
Fig.24. Etats d‟un processus
Etat bloqué : état d‟un processus qui a été exécuté (donc élu), mais ne peut pas poursuivre
son exécution suite à une raison logique, par exemple, lorsqu‟il attend des données qui ne sont
pas disponibles.
Etat Elu : un processus est élu, lorsqu‟il est en cours d‟exécution ,il peut être arrêté même s‟il
peut poursuivre son exécution ,si le système d‟exploitation décide d‟allouer le processeur à un
autre processus.
Etat prêt : il s‟agit de l‟état d‟un processus qui a été suspendu provisoirement par le système
d‟exécution afin de permettre l‟exécution d‟un autre processus ou un processus qui attendait
les données et vient de les recevoir, mais constate que le processeur est toujours occupé par un
autre processus.
Quand et comment fonctionne les transitions 1, 2, 3, 4 de la Fig.24.
Transition 1 :
- processus exécuté (élu) qui manque une donnée pour continuer logiquement son
exécution.
Transition 4 :
Transition 2 :
- l‟ordonnanceur retire le processeur au processus et choisit un autre processus.
Transition 3 :
- l‟ordonnanceur choisit un processus en lui allouant le processeur.
Processus
ORDONANCEUR (scheduler)
Fig.25. L‟ordonnenceur et les processus qu‟il gère la couche la plus basse d‟un système
d‟exploitation structuré en processus se charge des interruptions et effectue
l‟ordonnancement.
2.1.4. 1 . Introduction
Temps de réponse : le temps de réponse doit être faible de façon à réagir rapidement à un
événement externe. En fonction de l‟application d‟autres critères peuvent être appliqués.
Débit : l‟Ordonnanceur doit effectuer le plus de tâches possibles dans un intervalle de temps
donné.
Temps de réponse aux interruptions : le temps de réponse aux interruptions est un critère
important pour les noyaux temps réel. Ce temps doit être spécifié, car il fixe le délai maximal
au bout duquel une tâche matérielle peut être lancée. Il dépend de la durée pendant laquelle
les interruptions sont masquées dans les sections critiques du noyau. Durant
l‟ordonnancement des processus et l‟exécution de la plupart des primitives, le système
d‟exploitation est masqué (partiellement ou totalement) retardant l‟instant ou une interruption
peut être prise en compte.
Les critères énoncés, ci-dessus, sont parfois contradictoires. Un débit élevé n‟est pas
conciliable avec une bonne efficacité. Si le processeur commute les processus à intervalle de
trop rapprochés le temps passé dans la gestion de l‟ordonnancement peut devenir
prépondérant par rapport au temps consacré aux processus.
Le schéma de la Fig.32. ci-dessous montre la stratégie la plus simple d‟une file d‟attente
simple ou FIFO (first in first out) ou premier arrivé, premier servi. Cette stratégie ne tient
compte des temps d‟exécution. Elle est utilisée dans le système de traitement par lot.
Mais, il présente un inconvénient majeur, les travaux courts ont un temps de réponse élevé,
s‟ils arrivent après des travaux longs.
Ti : tache i
Pour pallier au désagrément que peut subir les petits travaux, lorsqu‟ils arrivent après de long
travaux, on a mis au point la méthode de file temps estimé d‟exécution .C‟est d‟ailleurs l‟objet
de la section suivante.
Quand un nouveau processus arrive, il est placé dans la file à l‟endroit correspondant à son
temps estimé d‟exécution,la file est ordonnée suivant les temps d‟exécution croissants :
l‟estimation est faite a priori et aucune correction n‟est tentée en cours d‟exécution. Le temps
de réponse de travaux courts est ainsi diminué, mais le travaux longs sont retardés (voir même
retardés indéfiniment si le débit d‟arrivé des travaux courts est assez grand)
Sur la figure ci-dessous est présente un schéma décrivant cet algorithme
T5 T4 T3 T2 T1 PROCES
SEUR
Conclusion :
Quand bien même cette méthode permet d‟abaisser le temps de réponse de travaux courts, elle
ne permet pas d‟apporter une solution fiable pour le temps réponse de travaux longs et
présente l‟inconvénients de se fier uniquement à un temps d‟exécution estimé, qui peut être
incorrect ou falsifié par des usagers de mauvaise foi.
Compte tenu de tout ce qui a été dit, nous allons faire appel à d‟autres méthodes notamment
celles qui appel au recyclage de travaux.
p6 p5 p2 p4 p3 p1 p7
Processus élu
Choix du quantum :
O
Tête de la
file p
Souvent l‟ordonnancement par file circulaire suppose que tous les processus (tâches) ont la
même priorité. Cette situation ne correspond pas à la réalité tant dans un milieu bureautique
universitaire que dans un milieu industriel de commande en temps réel :
Processus
termine
ou bloqué
Niveau priorité n
p6 Niveau priorité n – 1
p5
Processus prêts
Le principe de l‟ordonnancement des tâches par priorité est très simple. Chaque tâche reçoit
lors de sa création un niveau de priorité. L‟Ordonnanceur lance la tâche prête prioritaire.
Pour empêcher le processus de priorité élevée de s‟exécuter indéfiniment, l‟Ordonnanceur
diminue la priorité du processus à chaque impulsion de l‟horloge. Si cette priorité devient
inférieure à celle du deuxième processus de plus haute priorité, la commutation à lieu. Les
priorités peuvent être statique ou dynamiques.
Dans le cas de priorité dynamique, il y a lieu d‟envisager le cas suivant : certains processus
font beaucoup d‟entrée/sortie et attendent ainsi la majeur partie du temps la fin d‟une
opération d‟entrée/sortie. Il faut donc leur allouer le processus dès qu‟ils en demandent, pour
leur permettre d‟effectuer leur requête suivante d‟entrée/sortie. Cette opération d‟entrée/sortie
pourra s‟exécuter en même temps qu‟un autre processus qui fait des calculs. Si les processus
qui font beaucoup d‟opération d‟entrée/sortie n‟obtiennent pas rapidement le processeur, ils
occuperont la mémoire inutilement pendant leur attente. Un bon algorithme consiste à donner
à ces processus la priorité 1/f, où f la fraction du quantum que le processus a utilisé à sa
dernière activation (élection). Un processus qui n‟a utilisé que 2ms de son quantum de 100ms
La Fig.30.(1) présente une file chaînée simple dont chaque nœud comporte le numéro de la
tâche (x, y, z, w), et la valeur de la priorité (p, q, r, s) accordée à celle-ci. La file doit être triée
par priorités décroissantes pour éviter son parcours lors de la recherche de la tâche prioritaire.
De cette façon la tâche prioritaire est retirée en tête de file. L‟ajout d‟une tâche dans la file
d‟effectue en comparant, à partir de la tête, les priorités de chaque nœud avec celle de la tâche
à insérer.
p y
q z
r w
s
Tête de la file
x
p y
q z
r w
s
i
b
Fig.30.(2) insertion d‟une nouvelle tache dans la file de taches organisées par priorité.
Principes :
Ce type d‟ordonnancement est une variante de l‟ordonnancement par priorité. Comme nous
pouvons le constater sur Fig.31; le principe utilisé consiste à combiner l‟ordonnancement
Circulaire et l‟ordonnancement par priorité .Dans le modèle ci-dessous plusieurs taches
coexister au même niveau de priorité .Si plusieurs taches sont présentes dans la file de plus
forte priorité, ces taches seront exécutées, en utilisant le modèle circulaire (rund robin,
tourniquet) .S‟il n‟y a pas qu‟une seule tache par niveau de priorité le modèle est celui de
l‟ordonnancement par priorité .Entre ces deux modèles une multitudes de combinaisons sont
possibles.
P2 P4 P3 P1
P1 P5 P7
File prioritaire 0 (priorité supérieure)
P
R P9 P15
File prioritaire 1
O
C
E P11 P13 P6
S
File prioritaire 2
S
U
P8
S File prioritaire 3
1. Exemple 1
Mr et Mme Matumata ont un compte bancaire commun. Emettons l‟hypothèse selon laquelle
Mr et Mme Matumata se décident séparément à partir de deux guichets bancaires éloignés de
retrancher un montant de leur compte, en même temps. Si un système efficace de transactions
bancaires n‟est pas implémenté dans la base de données, on pourrait avoir la situation
suivante :
Le compte n est lu par Mr ;
Le compte n est lu par Mme ;
2. Exemple 2
Soit deux processus p et q qui produisent de données devant être imprimées par une
imprimante unique .L‟emploi de cette imprimante par p exclut son emploi pour q tant que
l‟impression n‟est pas terminée.
3 Exemple
En dehors de l‟informatique, le même problème deux trains ayant à circuler dans les deux
sens sur un tronçon de voie unique.
Ces trois exemple illustrent la notion de d‟exclusion mutuelle :le compte du client doit être
considéré comme une ressource à un seul point d‟accès,de même que l‟imprimante ou la voie
ferroviaire unique.
a) A tout instant, un processus au plus peut se trouver en section critique (par définition de
la section critique).
b) Si plusieurs processus sont bloqués en attente de la ressource critique ,alors qu‟aucun
processus ne se trouve en section critique,l‟un d‟eux doit pouvoir y entrer au bout d‟un
temps fini(il faut éviter qu‟un blocage mutuel des processus puisse durer indéfiniment.
c) Si un processus est bloqué hors de la section critique, ce blocage ne doit pas empêcher
l‟entrée d‟un autre processus en sa section critique.
d) La solution doit être la même pour tous les processus, cest à dire qu‟aucun processus ne
doit jouer le rôle de privilégié.
Cherchons à réaliser l‟exclusion mutuelle entre deux processus pi et pj qui veulent accéder à
une ressource critique en utilisant une seule variable booléenne commune.
Pour l‟écriture du programme de pi, on de signe « l‟autre processus »
Ai : si C alors aller à Ai ;
c :=vrai ;
section critique i ;
c :=faux ;
reste du programme i ;
Aller à Ai ;
Fin ;
Cet algorithme a une limitation : supposons que C=faux. Si chaque processus teste C avant
que l‟autre ne lui ait affecté la valeur vraie. Les deux processus s‟engagent dans leur section
critique. L‟exclusion mutuelle n‟est donc pas assurée.
Fin ;
Le processus pi ne peut entrer dans sa section critique que si t=i ;
L‟exclusion mutuelle est donc garantie par l‟indivisibilité de l‟opération de l‟accès à t.
Toutefois, la modification de t à chaque fin de section critique impose un fonctionnement en
bascule de deux processus, incompatibles avec la propriété d‟indépendance (condition c) de
l‟exclusion mutuelle. En particulier, l‟arrêt de pi dans la partie reste du programme i empêche
pj d‟exécuter plus d‟une fois sa section critique.
On pose encore j=3-i. Une solution conforme aux conventions de l‟énoncé peut s‟écrire :
On a traduit ici le fait qu‟un processus pi ne peut entrer en section critique que si c[j]:= faux.
Considérons toute fois la séquence suivante :
1. pi consulte c[i]et trouve faux ;
2. pj consulte c[j]et trouve faux ;
3. pi fait c[j] :=vrai et entre dans sa section critique ;
4. pj fait c[i] :=vrai et entre dans sa section critique ;
L‟exclusion mutuelle n‟est donc pas garantie, et la solution est inacceptable. On peut songer à
modifier le programme de façon à faire l‟affectation de c[i] avant le test de c[j], remplaçant
les deux instructions suivant Ai par
Ai : c[i] :=vrai ;
Si c[j] alors aller à Ai ;
L‟exclusion mutuelle est cette fois garantie : en effet, si pi trouve c[j]=faux, pj ne se trouve
pas en section critique p j et p j ne peut y entrer puisque c[i]=vrai au moment du test de c[j].
Mais la condition b) de l‟exclusion mutuelle n‟est maintenant plus vérifiée.
Ai : c[i] :=vrai ;
Si c[j] alors
Début
C[i] := faux ;
Aller à Ai
Fin
Cette solution est due à la Dekker, et a été développé dans le livre de Dijkstra (cooperating
sequential processes, in programming languages. Press 1967).
Elle satisfait au conditions requises, comme nous allons le voir dans ce qui suit :
On utilise alors le fait que la variable t ne pas modifier par l‟exécution des instructions A i, Li.
Si t = i alors pj entrera dans la boucle étiqueté Bj après avoir remis c[j] à faux : cela permet
donc l‟entrée en section critique de pj, qui était engagé dans la boucle Li. A la fin de sa section
critique, pi remet à la valeur j, ce qui libère pj, de la boucle Bj, lui permettant de tenter à
nouveau l‟entrée en section critique par Aj. Ainsi, on pourra éviter l‟attente infinie que
l‟entrée simultanée puisque le processus pi et lui seul entre en section critique en cas de
conflit.
En analysant les quatre exemples présentés, nous pouvons dire que le problème de l‟exclusion
mutuelle pourrait être résolu si on disposait d‟une instruction adéquate, le problème de
l‟exclusion mutuelle se résoudrait par :
Exclusion mutuelle (section critique) où section critique désigne une suite
d‟instructions utilisant la ressource critique.
Les propriétés a) , b), c), d) sont supposées vérifiées par l‟instruction appelée ici exclusion
mutuelle. Cette instruction se décompose en trois étapes suivantes :
Début
Entrée;
Section critique ;
Sortie
Fin
Une solution simple peut être obtenue en utilisant l‟attente active. Pour ce faire, nous faisons
appelle à une instruction spéciale TAS (Test And Set) qui existe sur certaines
machines ;cette instruction agissant sur une variable m, peut se décrire ainsi :
Début
bloquer l’accès à la cellule de mémoire m ;
Lire le contenu ;
si m=0 alors
début
m:=1 ;
section critique sur ressource ;
fin
sinon
Libérer accès cellule mémoire m ;
Fin
A1 : Ta (m)
Aller à A1
En commençant par exécuter TAS (m)
Q : bloque l‟accès de la cellule m ;
Lit le contenu du m ;
m=1
Un autre moyen simple de réaliser l‟attente active est que chaque processus masque les
interruptions avant d‟entrer dans une section critique et le restaure à la fin de la section
critique. L‟interruption horloge ne peut avoir lieu lorsque les interruptions sont masquées. Le
processeur ne pourra donc plus être alloué à un autre processus, puisque ce sont les
interruptions qui provoquent le changement d‟allocation.
Dès qu‟un processus a masqué les interruptions, il peut accéder à la ressource critique car il
est sur qu‟aucun autre processus ne pourra l‟interrompre.
Cette approche a un inconvénient majeur car elle permet aux processus utilisateurs de
masquer les interruptions. Supposer qu‟un de ces processus oublie de les restaurer. Ce serait
la fin du système.
De plus, si le système possède plus d‟un processeur, le masquage des interruptions n‟aura lieu
que sur le processus pour lequel le masquage a été défini.
Appelons verrou la variable p (qui a été utilisé dans l‟attente active), et nous y associons une
file d‟entente f (p). Si un processus ne peut entrer en section critique, dans la file d‟attente ;
lorsque un processus sort de la section critique, un des processus de la file d‟attente est activé
(élu), si bien sur la file d‟attente n‟est pas vide.
La valeur initiale de p est 0.
Nous pouvons alors définir les opérations suivantes :
Verrouiller (p) :
Si p=0 alors p :=1
Sinon
Mettre le processus dans la file f(p) ;
(Il passera à état prêt, non élu)
Déverrouiller (p) :
Si f (p) n’est pas vide
Alors
Sortir un processus de f (p)
(Ce qui le rend actif, élu)
Sinon
P :=0 ;
Les solutions sont différentes, selon que le système possède un seul ou plusieurs processeurs :
- dans un système monoprocesseur, il suffit de rendre les procédures
ininterruption ; on utilise le processeur comme ressource critique ;
- dans un système multiprocesseur, cette condition ne suffit pas car elle
n‟empêche pas deux processus de consulter et de modifier
simultanément p et f (p) ; on introduit donc une variable d‟exclusion
mutuelle dans les procédures, variable qui sera consulté par
l‟instruction de type TAS (Test And Set)
Un sémaphore S est constitué d‟une variable entière e(s) et d‟une file d‟attente f(s) .La
variable e(s) peut prendre des valeurs entières positives, négatives ou nulles ; cette variable
sera appelée valeur du sémaphore .La politique de la gestion de la file d‟attente est laissée en
guise du concepteur du système.
Un sémaphore s est créé par une déclaration qui doit spécifier la valeur initiale eo(s) de
e(s).Cette valeur initiale est nécessairement un entier non négatif. A la création d‟un
sémaphore, sa file d‟attente est toujours initialement vide.
Toute opération sur un sémaphore, est une opération indivisible. On peut agir sur un
sémaphore s, seulement par les primitives suivantes :
P(s) et V(s)
Le sémaphore peut prendre les valeurs entières positives, négatives ou nulles,ainsi les
primitives seront :
P(s) : début
e(s):= e(s) – 1
si e(s) < 0 alors
début
Commentaire : on suppose que cette primitive est exécutée
Par le processeur r ;
État(r) :=bloqué ;
Mettre le processus r dans la file f(s)
fin
V(s) : début
e(s): e(s) +1
si e(s) ≤ 0 alors
Début
Sortir un processus de la file f(s) ;
Commentaire : soit q le processus de la file f(s) ;
État (q) : actif
fin
fin
P(s): debut
Si e(s) = 0
Alors
e(s):=e(s)-1
Autrement
début
Commentaire : on suppose que cette primitive est exécutée par le processus r ;
État = bloqué ;
Mettre le processus r dans la file f(s)
fin
fin
V(s) : début
si file f(s) vide alors
e(s) := e(s) +1
Autrement
1) un sémaphore ne peut être initialisé à une valeur négative, mais il peut devenir négatif
après un certain nombre d‟opération P(s)
2) Soit np(s) le nombre d‟instructions P exécutées sur le sémaphore s,
nv(s) le nombre d‟instructions V exécutées sur le sémaphore s
eo(s) la valeur initiale du sémaphores
3) soit nf(s) le nombre de processus qui ont franchis la primitive P(s), c'est-à-dire qui, ou
bien n‟ont pas été bloqués par celle-ci, ou bien ont été bloqué, mais débloqués depuis ;
à tout instant on a
nf(s) ≤ np(s)
4) si e(s) est négative, sa valeur absolue égale le nombre de processus bloqués dans la file
d‟attente f(s)
e(s) =eo(s)-np(s)+nv(s)
e(s) < 0 ona eo(s)+nv(s) < np(s)
5) Si e(s) est positive ou nulle, sa valeur donne le nombre de processus pouvant franchir le
sémaphore s sans se bloquer.
Ainsi, en initialisant la valeur initiale du sémaphore à n,P et V peuvent être utilisés jusqu‟à
autoriser n processus dans leurs sections critiques.
Un sémaphore binaire est un sémaphore dont e(s) ne peut prendre que les valeurs 1 ou 0.
P(s): debut
si e(s)=1 alors
e(s) := e(s)-1
Autrement
début
État (p)= bloqué
Mettre le processus p dans la file f(s)
fin
fin
V(s) : début
si file f(s) vide
alors
e(s) :=1
Autrement
début
Sortir un processus de la file f(s)
état(q) := actif
fin
fin
début
P (mutex) ;
Section critique ;
V (mutex) ;
Suite d’instructions ;
Fin
2.3.1. Introduction
Les réseaux de PETRI ont été introduits au début des années 1960 par C.A. PETRI, puis
développés au MIT (Massachusetts Institute of Technology) autour de 1972.
Ils permettent zen particulier de :
Les places situées en amont d‟une transition sont appelées places d‟entrée de cette transition
(input places). Celles en aval d‟une transition portent le nom de places de sortie de cette
transition. Une place peut posséder 0,1 ou plusieurs jetons. La présence d‟un jeton (token)
dans une place indique que la condition associée à la place est remplie.
Une transition est régie par l‟ensemble des règles suivantes :
- une transition est franchissable (enabled ou firable) si chacune de ses places d‟entrées
contient au moins un jeton ;
- le franchissement d‟une transition consiste à prélever un jeton dans chaque place
d‟entrée et d‟en déposer un dans chaque place de sortie ;
- une transition peut ne pas être franchie immédiatement après la réalisation de ses
conditions de franchissement ;
- le franchissement d‟une transition, lorsqu‟il se produit ne prend aucun temps.
Au lieu du franchissement d‟une transition on parle parfois du tir d‟une transition (firing).
Prenons d‟une manière informelle un exemple qui n‟a rien à avoir avec la gestion de
processus :
C1 Elu
C2
C3
Election -OK
Si on analyse, les choses avec la minute d‟un clinicien, force est de constater que les places
permettent de représenter les états du système ; l „ensemble des transitions représente alors
l‟ensemble des évènements dont l‟occurrence provoque la modification de l‟état du système.
La Fig.36. Ci-dessous représente « attribution d‟une ressource ». Les deux places d‟entrée
correspondent aux préconditions « ressource libre » et « demande d‟attribution ». La présence
d‟un jeton indique que la ressource a été attribuée.
Ressource attribuée
D‟une manière formelle, le réseau de PETRI peut être défini comme un quadruplet (P,T,I,O),
avec,
P = p1, p2, …, pk l‟ensemble des places (conditions) ;
T = t1, t2, …, tn l‟ensemble des transitions (évents) ;
I = la fonction d‟entrée telle que I(ti) = pi, pk, …
O = la fonction de sortie telle que O(tj) = p1, pm, …
t1 t2
d e
2.4. 1. Introduction
Les divers processus d‟un système n‟évoluent généralement pas indépendamment : il existe
entre eux des relations qui dépendent de la logique de la tâche à accomplir et qui fixent leur
déroulement dans le temps. L’ensemble de ces relations est la synchronisation, bien
qu‟elles ne fassent pas intervenir le temps comme mesure de durée, mais seulement comme
moyen d‟introduire une relation d‟ordre entre des instructions exécutées par les processus.
Le problème de la synchronisation consiste donc à construire un mécanisme indépendant des
vitesses permettant à un processus actif (soit p) :
- d‟en bloquer un autre ou de se bloquer lui-même en attendant un signal d‟un autre
processus ;
- d‟activer un autre processus en lui transmettant éventuellement de l‟information.
Remarquons que, dans ce dernier cas, le processus q auquel est destiné le signal d‟activation
peut déjà se trouver à l‟état actif ; il faut donc définir de façon plus précise l‟effet de
l‟opération d‟activation lorsqu‟on se trouve dans cette circonstance. Deux possibilités se
présentent :
a) Le signal d‟activation n‟est pas mémorisé, et par conséquent il est perdu si le
processus q ne l‟attend pas.
b) Le signal est mémorisé et le processus q ne se bloquera pas lors de la prochaine
opération de blocage concernant ce processus.
Deux techniques sont concevables pour réaliser des opérations de synchronisation, appelées
primitives :
a) Action directe : un processus agit directement sur un autre processus.
b) Action indirecte : un processus actionne sur un mécanisme qui agit sur d‟autres
processus.
Autrement dit, dans le cas de l‟action directe, l‟identité du processus doit être un paramètre
d‟activation (ou de blocage) alors que dans le second cas, le nom et l‟identité des processus
visés peuvent être inconnue du processus agissant :
Les processus qui évoluent dans un système ne sont pas généralement tous a telle enseigne
que certain processus peuvent par exemple bouclé indéfiniment : il est alors indispensable de
pouvoir les suspendre en les faisant passer à l‟état bloqué.
Dans ce cas, l‟identité du processus que l‟on désire suspendre doit être un paramètre de la
primitive de blocage.
L‟instant où intervient cette action dans le cycle du processus à suspendre ne pas toujours
indifférent. En effet, pour assurer l‟homogénéité des variables, certaines opérations exécutées
par le processus à suspendre doivent être rendues logiquement in interruptibles, par exemple
lorsqu‟il accède à sa section critique.
Le mécanisme de synchronisation par action directe, peut être réalisé par des primitives :
- Bloquer ()
- éveiller ()
en outre à chaque processus q est associé un indicateur booléen noté état(q) qui indique l‟état
actif ou bloqué du processus q.
la primitive bloquer (q) force le passage du processus q à l‟état loqué ; l‟évolution du
processus reprendra, lorsque son état aura repris la valeur « actif » la primitive éveiller (q) a
pour effet de rendre actif le processus q, s‟il était bloqué, si la primitive éveiller (q) est
Dans un mécanisme d‟action indirecte la synchronisation met en jeu non plus le nom du
processus mais un ou plusieurs objets intermédiaires connus des processus coopérants, et
manipulables par eux uniquement à travers des opérations indivisibles spécifiques. Selon la
nature des opérations qui permettent de les manipuler, ces objets portent les noms :
- d‟évènements ;
- de sémaphores.
a) Evènement mémorisé
Un événement mémorisé est représenté par une variable booléenne ; à un instant donné la
valeur 1 ou 0, de cette variable traduit le fait que l‟événement est ou n‟est pas arrivé. Un
processus se bloque si et seulement si l‟événement qu‟il attend n‟est pas arrivé ; selon le
système, le déclenchement d‟un événement débloque un processus ou tous les processus qui
l‟attendent. Par exemple, en PL/1, il est possible, en utilisant l‟option task, d‟initialiser des
processus parallèles. Un évènement est représenté par un symbole déclaré explicitement par
l‟attribut évent ou implicitement lors de la création d‟un processus (option task).
L‟affectation d‟une valeur booléenne à un événement se fait au moyen d‟une pseudo variable
de type complétion :
Complétion (evt) = ‘0’B ; indique que l‟événement noté « evt » n‟est pas arrivé, ce qui
équivaut à une « remise à zéro » de l‟événement.
Lorsqu‟il n‟y a pas mémorisation, un événement émis alors qu‟aucun processus ne l‟attend est
perdu. Par contre, si un ou plusieurs processus sont bloqués dans l‟attente de cet événement au
moment où il se produit, ces processus deviendront actifs.
La notion d‟événement non mémorisé est très délicate à manipuler, car elle met en jeu la
vitesse des processus.
On retrouve souvent l‟événement non mémorisé dans les langages spécialement conçus pour
la commande de processus industriels.
On peut très bien imaginer le fait que l‟activation d‟un processus soit associée à des entités
plus complexes qu‟un simple événement, par exemple l‟occurrence conjointe de deux
évènements ou à l‟occurrence de l‟un ou l‟autre de deux évènements et plus généralement à
une expression booléenne d‟évènements.
Cette idée est illustrée dans le programme PL1 ci-dessous :
p1: procedure:
Call p2 event (e2) ;
Call p3 event (e3) ;
Wait (e2, e3) (i);
...;
end pl.
Dans ce programme, deux tâches parallèles sont initialisées au moyen d‟instruction call, avant
d‟exécuter une instruction wait l‟événement e2 déclaré explicitement par l‟attribut évent à la
création de la tâche p2, sera déclenché par la fin de l‟exécution de cette tâche ; il en est de
même de e3. Il en résulte que :
Si i = 2 la tâche pl reste bloquée sur l‟instruction wait jusqu'à l‟arrivée des deux événements
e2 et e3.
Si i = 1 l‟arrivée d‟un seul de deux événements suffit à débloquer la tâche pl.
Si i ≤ 0 l‟instruction wait est sans effet et la tâche pl ne se bloque pas.
Nous avons déjà rencontré le mécanisme des sémaphores pour résoudre le problème
d‟exclusion d‟accès à une ressource critique. On peut utiliser le sémaphore pour résoudre des
problèmes généraux de synchronisation : un signal d‟activation est envoyé par une primitive
v ; il est attendu par une primitive p.
Ainsi, un processus dont l‟évolution est subordonné à l‟émission d‟un signal par un autre
processus bloqué, au moyen d‟une primitive p, derrière son sémaphore initialisé à zéro, le
signal de réveil de ce processus bloqué est obtenu en faisant exécuter par un autre processus
une opération V sur le même sémaphore.
Nous allons voir en utilisant un outil de modélisation puissant comment on peut modéliser la
synchronisation et la communication entre deux processus. Soient deux processus : A et B.
1. A prépare les données ;
2. A transmet a B le message « request-to-send »;
3. A attend de B le message “ready-to-receive”;
4. A Envoi de données;
5. A signal a B par “data-sent”, la fin de l‟envoi;
6. A attend de B le message « data-consumed ».
Sur la Fig38a est illustre les processus A et B qui communiquent selon la description ci-
dessus et sur Fig38b est présenté la modélisation de leur synchronisation et communication
en utilisant le réseau de PETRI.
A r_t_s B
(source) r_t_r (destination)
d_s
d_c
1 b 2
get_data_ready
C Request_to_send
a 3 n m
d 4 4
13
15
p
f ready_to_receive
e 15
6
g 5 5 q
send_data
r
data_sent
9 9
i 16 s
8
k t
10 10 x
j w v
12
11 data_consmed 18
19
Source Destination
Si l‟on désir abstraire le modèle du tout détail non directement en rapport avec le protocole de
communication, il est possible de simplifier la Fig. 2.5 en éliminant tout ce qui modélise des
états et événement strictement interne aux processus source et destination et en ne conservant
que ceux lies aux interactions entre source et destination ainsi qu‟avec les parties externes de
processus A et B.
process 2
2.4.1 Introduction
La coopération des plusieurs processus a l‟exécution d‟une tache commune nécessite une
communication d‟information entre ces processus. Les primitives de synchronisation étudiées
précédemment réalise un mode de communication ou l‟information transmise est réduite a la
forme élémentaire d‟une autorisation ou d‟une interdiction de continuer l‟exécution au de la
d‟un certain point prédétermine. Le message se réduit donc dans ce cas a un potentiel
d‟activation. Ce mode de communication ne communication ne suffit pas a tous le besoins.
Ainsi lorsque les actions exécutées par un processus après son activation dépendent de
l‟identité du processeur activateur, cette identité doit pouvoir être transmise au processus
actif.
Sous le système prenant en charge les threads (sous-taches s‟exécutant d‟une manière
parallèle), la mémoire fait partie intégrante du concept de threads. Dans certain système
d‟exploitation le disque virtuel est utilisé comme mécanisme d‟échange entre processus. Le
système de fichier permet la création de ce disque virtuel qui est en réalité une zone de
l‟espace de mémoire interne. Donc les fichiers stocké sur le disque virtuel sont en réalité
enregistre en mémoire. Les primitives de signalisations dans certains systèmes d‟exploitations
peuvent être utilisés pour l‟envoie des messages :
React-signal (function, signal Id) : configure le processus pour qu‟a la réception d‟un numéro
de signal Id, celui réponde en passant en fonction « function ».
Il peut s‟agir d‟un processus, d‟une boite aux lettres, d‟un tampon de communication ;
l‟objet peut être identifié par un nom ou un numéro d‟identification.
Le système d‟exploitation peut exiger par exemple que toute communication soit
précédée d‟une primitive qui établi une connexion avec l‟objet de destination. Tout
processus peut être autorise a communiquer avec l‟objet destination, mais il est
possible de mettre en place certaines restrictions si l‟objet de destination est une boite
aux lettres ou tampon de communication, en ce moment la, il n‟est pas nécessaire
d‟établir une quelconque connexion
Les problèmes les plus généraux de communication entre processus peuvent être résolus en
rendant un ensemble des variables communes accessible a tous les processus. Toutefois
l‟accès simultané de plusieurs processus a des telles variables pose des problèmes de
cohérence soulevée a propos de l‟exclusion mutuelle. Les processus doivent donc s‟imposer
Les règles de communication que doivent observes les processus ne peuvent leur
imposées car on a aucune garantie contre le non respect de ces règles par un
processus défectueux ;
La communication par consultation et modification des variables communes se
prêtent assez mal a une interprétation du type „envoie des messages‟ un tel mode
d‟interaction entre processus p et q, serai par exemple :
PRODUCTEUR CONSOMMATEUR
Initialement,nous avons :
nplein=0, nvide=n
PRODUCTEUR CONSOMMATEUR
Entier nplein=0, nvide=n
PROD : produire un message ; CONS : nplein :=nplein-1 ;
nvide :=nvide-1 ; si nplein=-1 alors
si nvide=-1 alors
attendre ; attendre ;
deposer le message ; prelever un message ;
Les parties notées entre accolade doivent se dérouler de façon indivisible (elle sont
atomiques). Elles doivent se dérouler ainsi puisqu‟elles comprennent le test et la
modification de variables critiques. Considérons a présent le test sur la
condition « consommateur en attente »dans le processus producteur. On peut remarquer
qu‟en raison du caractère indivisible de la séquence de débit du consommateur ou pour
remplacer la condition « consommateur en attente » par la condition nplein=-1 qui lui est
équivalente (en faite, on compare nplein a 0 puisqu‟on fait nplein :=nplein+1).
La communication ente processus suivant la méthode de la boite aux lettres est une
application directe du modèle du producteur et du consommateur. Nous pouvons remarquer
que, lors du dépôt d‟un message par un producteur, un consommateur quelconque peut se
trouver activer, et pas nécessairement le destinataire prévu ; on voit donc que le dispositif
n‟est efficace que si tous les destinataires sont équivalent (c'est-à-dire s‟il est indifférent pour
accomplir la tâche demandée, d‟activer l‟un quelconque de ces processus). Sinon l‟identité du
destinataire doit faire partie du message ce qui implique un tri à la réception.
La solution généralement retenue consiste donc à prévoir une boite aux lettres par classe de
processus équivalents, évitant ainsi tout tri à la réception.
Les messages transmis dans les boîtes aux lettres contiennent l‟identité du fichier concerné
par l‟entrée/sortie
Processus
Imprimante 1
Processus
demandeurs boite aux lettres
d‟impression « impressions »
Processus
Imprimante 2
Processus
Opérateur lectures cartes
Le fonctionnement d‟une boîte aux lettres étant ainsi défini dans son principe, il reste à
examiner les modalités de son implémentation :
- l‟allocation d‟espace pour la (ou les) boîte(s) aux lettres.
- Accès à la boîte aux lettres : celle-ci doit être adressable par tous les processus qui
l‟utilisent.
Cette contrainte est à la source des principaux problèmes d‟implémentation d‟un système de
communication par boîte aux lettres en particulier dans le cas où chaque processus dispose
d‟un espace adressable distant.
2.4.2.4. Différence entre communication par boîte aux lettres et celle basée sur la
communication directe entre les processus
Pour que nous puissions bien saisir cette différence, analysons comment les deux concepts
sont implémentés dans certains systèmes.
Int send_process ( 765, Bonjour) : le processus qui exécute cette primitive envoie le message
« bonjour » au processus ayant pid (numéro d‟identification du processus) égal à 756. Le
Int receive_process (765, mareception) : le processus qui exécute cette primitive reçoit le
message dont le pid (processus d‟identification du processus) est 765 et le placera dans sa file,
mareception. Si au lieu de 765, on aurait mis 0, il recevrait un message de n‟importe quel
processus (on part du principe qu‟aucun processus ne peut avoir le numéro d‟identification 0).
Cette primitive échoue si un processus émetteur est spécifié et n‟existe pas.
Int_create_mailbox (boitelettre) : crée une boîte aux lettres appelée boite lettre. Cette
primitive échoue si la boîte aux lettres existe déjà.
Int delete_mailbox (boitelettre) : supprime une boîte aux lettres appelée boite lettre. Cette
primitive échoue si le processus qui émet la primitive n‟est pas propriétaire de la boîte aux
lettres ou si l boîte aux lettres n‟existe pas.
Int_send_mailbox (boitelettre, bonjour) : elle envoie le message « bonjour » dans la boîte aux
lettres dont le nom d‟identification est « boite lettre ». Le message est copié dans la boîte aux
lettres. Tout processus peut envoyer un message à n‟importe quelle boîte aux lettres.
L‟émetteur est bloqué jusqu'à réception du message. Cette primitive va échouer si la boîte aux
lettres n‟existe pas.
3 GESTION DE LA MEMOIRE
3.1. Introduction
La mémoire est une ressource importante qui doit être gérée avec prudence. Le moindre
ordinateur domestique a, de nos jours dix fois plus de mémoire que l‟IBM 7094, l‟ordinateur
le plus puissant du début des années soixante. Mais, la nature ayant honneur du vide, la taille
des programmes augmente tout aussi que celle des mémoires.
Cette section s‟occupe seulement de ceux qui ne font pas le swapping, ni la pagination. C‟est
ainsi que dans les sous sections qui suivent nous aborderons :
-le système d‟exploitation est situe en motte, au dessous de la mémoire vive, comme le
montre la Fig.40.(b) ;
-le système d‟exploitation au bas de la RAM, les pilotes en ROM (Read Only Memory)dans
la partie haute de la mémoire. Cela est illustre sur la Fig.40.(c). les pilotes étant situe dans un
bloc de 8Ko de l‟espace d‟adressage de 1 Mo. Les programmes en ROM, sont appelés le
BIOS (Basic Input Output système). Cette approche est celle du système d‟exploitation MS-
DOS, qui est un système : mono programme, mono utilisateur.
Système Pilotes de
D‟exploitation périphérique
ROM en Rom
Programme
Utilisateur Programme
Utilisateur
Système Système
D‟exploitation D‟exploitation
en RAM en RAM
Fig.40. Trois organisations possibles de la mémoire s‟il n‟y a que le système d‟exploitation et
un seul processus utilisateur.
960 ko Pilotes
mémoire réservée
768 ko Pilote
Video Ram
640 ko Processus
Utilisateur
+ Mémoire conventionnelle
Dos
Lorsque la mémoire est organisée de cette manière, il ne peut y avoir qu‟un seul processus qui
s‟exécute a une instante donne. L‟utilisateur tape une commande sur son terminale et le
système d‟exploitation change le programme demande en mémoire, puis l‟exécute. Lorsque le
processus se termine, le système d‟exploitation affiche une invite (prompt) sur le terminal et
attend et attend la commande suivante pour changer un nouveau processus qui remplace le
précèdent.
A A B C D
C Fig.42.(b)
Fig.42.(a)
Processus
B
A
Temps
(c)
(a) Multiprogrammation de 4 programma
(b) Modèle conceptuel de 4 processus séquentiels indépendants.
(c) un seul programme est actif à un instant donné.
Le coût d‟un programme non modulaire (n‟ayant pas de sous-programmes) est supérieur au
coût du même programme réaliser d‟une manière modulaire.
où,
P : programme réalisé d‟une manière non modulaire
SPi : le ième sous-programme du programme P.
- la multiprogrammation se justifie aussi dans un environnement multi-utilisateur,
« time sharing ».
c‟est ainsi qu‟il faut avoir plus d‟un processus en mémoire à la fois.
Partition 4 Partition 4
700 k
Partition 5 Partition 3
File d‟entrée
400 k unique
Partition 2 Partition 2
125 k
Partition 1 Partition 1
100 k
Système Système
D‟exploitation d‟exploitation
o
(a) (b)
Trier les tâches en fonction de leurs tailles dans des files multiples présente un inconvénient
majeur, lorsque la file des grandes partitions est vide et celle des petites pleine, comme c‟est
le cas dans la Fig.43. Une alternative consiste a utiliser ne fie comme celle de la Fig(b). Des
qu‟une partition se libère, on y place la première une seule file d‟attente qui peut y tenir et on
exécute. Comme il n‟est pas intéressant d‟allouer une grande partition a une petite tache, on
peut aussi parcourir la file d‟attente et choisir la plus grande tache que peut contenir la
partition. Cette stratégie désavantage les taches de petites tailles alors qu‟il faudrait
théoriquement les traiter en priorité.
3.3. 1. Introduction
L‟organisation de la mémoire en partition fines est une méthode adoptée avec systèmes a
traitement par lots. Avec le système en temps partages, la situation est différente : la mémoire
ne pouvant pas contenir les processus de tout les utilisateur, il faut placer quelques processus
sur le disque, qu‟il faudrait bien sur, ramener en mémoire principale avant de les exécuter.
Les mouvements de processus entre la mémoire principale et le disque est appeler va-et-vient
(swapping)
Ainsi, dans ce qui suit nous allons voir quelques méthodes de gestion de mémoire avec les
quatre swapping :
-multiprogrammation avec partitions variables ;
-gestion de la mémoire par tables de bits ;
Avec les partitions variables, le nombre et la taille des processus en mémoire varient au cours
du temps. La Fig.44. illustre le fonctionnement des partitions variables.
Au départ, un seul processus A, se trouve en mémoire (Fig.44a). Les processus B et C sont
crées ou charge à partir disque. A la Fig.44d, A se termine ou est déplace sur le disque. Puis
d‟arriver et B s‟en va. Enfin E est charge en mémoire (Fig.44g).
La différence fondamentales entre la position et les partitions fixes (Fig.43) et les partition
variables (Fig.44) est que le nombre, la taille de ces dernières varie dynamiquement au fur et
a mesure que les processus entrent ou sortent sont de la mémoire. On n‟est plus limite par un
nombre fixe de partition ou par le ait que les partitions sont très grandes ou trop petites. Cette
souplesse accrue améliore l‟usage de la mémoire mais complique son allocation et sa
libération
B B B
A A A
C C C
B
E
D D D
Une fois les processus crées et détermines, l‟utilisation de la mémoire évolue et devient une
alternance de sections d‟espace alloues et non alloues, tel un damier, tel que vous pouvez le
constater sur la Fig.….ci-dessous. Par conséquent bien qu‟il ait peut être plus des mémoires
non allouée que la taille d‟un processus en attente, la mémoire n‟est peut être utilisée pour ce
processus, car elle est dispensée dans un grand nombre de trois zones de mémoire, libre
(memory holes) cet espace qui n‟est pas alloue a aucune partition est appelée fragmentation
externe.
Pour gagner l‟espace inutilisé, on peut réunir les espaces inutilisés en une partition de grande
de grande taille en déplaçant tout les processus vers le bas de la mémoire. Il s‟agit du
compactage de la mémoire. Cette technique n‟est généralement pas utilisée, car elle requiet
beaucoup de temps processeur. Par exemple il faut une seconde pour compacter la mémoire
d‟un micro-ordinateur de 1 Mo qui peut copier un octet par micro seconde (1 Megaoctet/s).
A B C D E
8 17 24
(a)
11111000
11111111
11001111
11110000
(b)
P 0 5 H 5 3 P 8 6 P 14 3
4 17 6 P 23 3 H 26 4
Fig.45 une partie e la mémoire occupée par cinq processus et rois zones libres les tirets
matérialisent l‟unité d‟allocation de la mémoire. Les régions hachurées (0 dans la table de
bit) seront libres représentent les zones libres
Il convient de noter que la taille de l‟unité d‟allocation joue un rôle important. Néanmoins,
même si elle ne fait que n octets, il faut 1 bit de la taille de bits pour représenter 32 bits de la
mémoire. Une mémoire de 32 n bits va nécessiter une table de bits de n bits. Donc dans ce cas
la table de bits occupe 3% de la mémoire.
La table de bits permet donc de mémoriser l‟occupation de la mémoire dans un espace
mémoire de taille fixe car la taille „une table de bits ne dépend que de la taille de l‟unité
d‟allocation. Le seul problème survient lorsqu‟on doit ramener en mémoire un processus de k
unités. Le gestionnaire de 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
tâches de bits.
b) A X devient A
c) X B devient B
d) X devient
Fig.46 quatre combinaisons des voisins possibles d‟un processus qui se termine.
Cet algorithme est une légère variante de l‟algorithme précédent. Sa stratégie est identique au
précédent mais il mémorise en plus la position de l‟espace libre trouvé. La recherche
commencera a partir de cette position et non a partir du début.
Il consiste a rechercher dans la liste la plus petite zone libre qui convient. On évite ainsi de
fractionner une grande zone dont on pourrait avoir besoin ultérieurement.
Il consiste a 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
des bons résultats.
3.4.1. Introduction
L‟idée de base de la mémoire virtuelle est que la taille du programme, des données et de la
pile peut dépasser la mémoire interne disponible. Le système d‟exploitation garde en mémoire
les parties du programme qui sont utilisées et stocke le reste sur le disque. Par exemple, on
peut exécuter un programme de 1M sur une machines de 256 koctets en choisissant
judicieusement les 256 koctets du programme à mettre en mémoire principale à tout instant.
Les autre parties vont faire des vas – et – vient entre le disque et la mémoire.
La mémoire virtuelle peut aussi être utilisée sur un système multiprogrammé. On peut, par
exemple, allouer des partitions de 256 Ko à 8 programmes de 1M sur un système qui a 2M de
mémoire. Chaque programme se déroule comme s‟il avait sa propre machine de 256 ko. La
mémoire virtuelle et la multiprogrammation se complètent très bien.
Dans l‟explication ci-dessus, la capacité de la mémoire se référer à la partie de la mémoire
utilisée par le programme/application utilisateur ; on a fait fi de celle occupée par le système
d‟exploitation.
3.4.2. La pagination
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. Quand un programme effectue
une instruction comme MOVE REG, 1000, il copie le registre REG. Ces adresses manipulées
par les programmes sont appelées des adresses virtuelles et constituent l‟espace d‟adressage
virtuel. Sur les ordinateurs sans mémoire virtuelle, les adresses sont directement placées sur le
bus le bus d‟adresse de la mémoire et provoque la lecture ou l‟écriture du mot à l‟adresse
spécifiée. Lorsque l‟adresse mémoire virtuelle est utilisée, les adresses virtuelles ne sont pas
directement placées sur le bus d‟adresse de la mémoire. Elles sont envoyées à l‟unité de
gestion de la mémoire ou MMU (Memory Management Unit), composant qui traduit les
adresses virtuelles en adresses physiques, comme le montre la Fig.47
La fig. donne un exemple de cette conversion. L‟ordinateur de cet exemple peut générer des
adresses sur 16 bits de 0 à 64 koctets, mais on ne peut pas les changer entièrement en
mémoire. Une image mémoire de tout le programme (donc de moins de 64 koctets) doit alors
être stockée sur disque de telle sorte qu‟on puisse en placer, au besoin, différentes parties dans
la mémoire principal. L‟espace d‟adressage virtuel est divisée en petites unités appelées des
pages. Les unités correspondantes de la mémoire physique sont les cases mémoires (pages
frames). Les pages et les cases sont toujours de la même taille. Dans notre exemple, elles font
4 koctets mais on rencontre fréquemment des tailles de 512 octets,et 2 octets. Avec 64 koctets
de mémoire virtuelle 32 koctets de mémoire physique, on a 16 pages virtuelles et 8 cases. Le
transfert entre la mémoire et le disque se fait toujours par pages entières. Quand un
programme essaie de lire l‟adresse O, par exemple au moyen de l‟instruction MOV REG, O,
l‟adresse virtuelle O est envoyée au MMU. Ce dernier constate que cette adresse virtuelle se
situe a la page 0 (adresse 0 a 4095) qui appartient a la case 2(8192 a 12384). Elle reçoit tout
simplement une demande de lecture de l‟adresse 8192. Le MM a donc nappe les adresses
virtuelles comprises entre 0 et 4096 sur les adresses physiques 8192 a 12387.
De même, l‟instruction MOVE REG, 8192 est transformée en MOVE REG 24576
Parce que l‟autre adresse virtuelle 8192 est situe dans la page virtuelle 2 et que cette page est
mappée a la a la case physique 6 adresses physiques 42576 a 28671). L‟adresse virtuelle
Ce passage au moyen du MMU des 16 pages virtuelles sur n‟importe laquelle de 8 cases ne
résout pas le problème soulevé par le fait que l‟espace de l‟adresse virtuelle est plus grande
que la mémoire que la mémoire physique. Comme on a 8 cases physiques de la fig.47
Les autres pages signaler par « X » sur la figure, ne sont pas mappées. Le matériel mémorise
dans un bit de présence si une page est mappée ou non.
Espace des
adresses
virtuelles Adresse
mémoire
0-4K 2
physique
4K-8K 1
0-4K
6
8K-12K 4K-8K
12K-16K 0
4 8K-12K
16K-20K 12K-16K
3
16K-20K
20K-24K x
24K-28K
20K-24K
28K-32K x
x 24K-28K
32K-36K 28-K-32K
5
36K-40K
x
40K-44K 7
44K-48K
48K-52K x
Case physique
x
52K-56K
56K-60K
x
56K-64K x
Page virtuelle
Fig.47. table des pages faisant la relation entre les adresses virtuelles et celles physique.
Que se passe-t-il si le programme tente d‟utiliser une page non mappée, par exemple en
effectuant MOV REG, 32780 ?
(cette adresse se situe a 12 octets après le début de la page 8 qui commence a l‟adresse
32768. le MMU constate que cette page n‟est pas mappée et provoque un déroulement (trap) :
le processeur est restituer au système d‟exploitation.
0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 adresse
Virtuelle
En entrée
La page virtuelle 2 (8 196)
sert d‟index dans la table
des pages.
Adresse
Physique
1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 en sortie
A la suite d‟un défaut de page (on se réfère à une page ne se trouvant pas dans la mémoire
physique), le système d‟exploitation 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 changement 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.
Si on choisit de retirer la page peu utilisée, cela peut sensiblement améliorer les performances
du système.
Dans ce qui, sont présentés les algorithmes suivants de remplacement de page :
- le remplacement de page optimal.
- Remplacement de la page premier entré, première sortie FIFO
- Remplacement de la page la moins utilisée.
Cet algorithme est facile à décrire, mais presque impossible à mettre en œuvre. Au moment du
défaut de page, il existe en mémoire un certain nombre de pages. Une de ces pages risque
d‟être référence très vite, d‟autres ne seront référencées que dans 10, 100 ou 1000
instructions. On peut numéroter chaque page avec le nombre d‟instructions qui seront
exécutées avant qu‟elle ne soit référencée.
L‟algorithme de copie de page optimal consiste à retirer la page qui porte le plus haut
numéro. Si une page n‟est adresse qui dans 8 millions d‟instructions, et une autre dans 6
milliards d‟instructions il vaut mieux retirer la première car on repousse ainsi le défaut de
page suivant le plus tard possible.
Malheureusement cet algorithme est irréalisable, car le système d‟exploitation ne peut pas
connaître d‟avance le moment où les différents pages seront référencés.
Le système d‟exploitation mémorise une liste de toutes les pages en mémoire, la première
page de cette liste, la plus ancienne et la dernière la plus récente. Lorsqu‟il se produit un
défaut de page, on retire la première page de la liste et on place la nouvelle page à la fin de
cette liste.