Académique Documents
Professionnel Documents
Culture Documents
Introduction
Gestion des processus
Synchronisation des processus
Gestion de la mémoire
Gestion des fichiers
Interblocage!!!
2
Chap:3
3
Communication inter-processus
Nous avons considéré, jusqu'à maintenant, les processus
comme des entités isolées n'ayant pour seul objectif que
leur exécution sur le processeur, et n'interagissant pas
avec le système ou avec d'autres processus.
Pourtant, des processus concurrents partagent des données
(zones mémoire, des fichiers, des ressources communes …)
entre eux, dans lesquels ils peuvent tous lire et écrire.
4
Communication inter-processus
Exemple1:
La commande unix suivante: $cat f1 f2 f3 | grep ''text'‘.
Les 2 processus (cat et grep) partagent le pipe (|) qui est une
sorte de fichier virtuel dans lequel un lit et l'autre écrit.
5
Communication inter-processus
6
Communication inter-processus
7
Communication inter-processus
8
Communication inter-processus
9
k
Communication inter-processus
10
Communication inter-processus
11
Communication inter-processus
12
Exemple 2-corruption de données
Deux processus P1 et P2 Procédure:
exécutent cette même * M. X demande une
procédure et partagent la
même base de données réservation d’avion
* Base de données dit
Ils peuvent être interrompus que fauteuil A est
n’importe où disponible
* Fauteuil A est assigné à
Le résultat de l’exécution X et marqué occupé
concurrente de P1 et P2
dépend de l’ordre de leur
entrelacement
13
Vue globale d'une exécution possible
P1 interruptions P2
M. X demande une
réservation d’avion
M. Y demande une
réservation d’avion
14
Communication inter-processus
15
Communication inter-processus
16
Communication inter-processus
Structure d'un programme
Chaque processus doit donc demander une permission avant d’entrer dans
une section critique (SC)
La section de code qui effectue cette requête est la section d’entrée
La section critique est normalement suivie d’une section de sortie
Le code qui reste est la section restante
section d’entrée
section critique
section de sortie
section restante
17
Application
18
Communication inter-processus
Race conditions (conditions de course)
Les situations dans lesquelles des processus peuvent être en ''course'
pour accéder à certaines ressources et dont le résultat dépend de
l'ordre d'accès sont appelées
conditions de course ( race conditions) .
=> Non déterminisme: le résultat est aléatoire avec les mêmes données.
19
Critères nécessaires pour solutions valides
20
Types de solutions
21
Remarques
Atomicité = indivisibilité
22
Solutions logicielles
23
Solutions logicielles
2-Variable verrou:
« Une variable de verrouillage est une variable binaire 0 ou
1 partagée par les processus, qui va indiquer si un
processus est en section critique ou non.»
Si verrou==0 SC est libre
Si verrou==1 SC occupée
24
Solutions logicielles
Algorithme:
entrer_SC()
sortir_SC()
{
{
If
(verrou==0)
verrou=0;
Verrou=1;
}
} /* attente active */
25
Solutions logicielles
3-l'alternance stricte:
On utilise une variable tour partagée qui va contenir le
numéro du processus à entrer en section critique.
Algorithme pour N processus:
entrer_SC(int NumProcess)
sortir_SC()
{
{
While ( tour != NumProcess) /*attente active*/
tour=(NumProcess+1) %N;
}
}
26
Solutions logicielles
Alternance stricte
27
Solutions logicielles
28
Algorithme de Peterson
#define N 2 /* nombre de processus */
/* variables partagées par tous les process */
int tour; /* à qui le tour */
int interesse[N]; /* initialisé à FALSE */
void entrer_region(int processus) /* process appelant vaut 0 ou 1 */
{
int autre; /* numéro de l'autre processus */
autre = 1-processus;
interesse[processus] = TRUE; /* indiquer son intérêt */
tour = processus; /* positionner le drapeau d'accès */
while(tour == processus && interesse[autre] == TRUE); /* attente active*/
}
void quitter_region(int processus) /* numéro du processus appelant ici
processus vaut 0 ou 1 */
{ interesse[processus] = FALSE;
/* indiquer la sortie de la section critique */
} 29
Algorithme de Peterson
Process P0: Process P1:
autre=1 autre=0;
interesse [0] = vrai; interesse[1] = vrai;
// 1 veut entrer
// 0 veut entrer
tour = 0; tour = 1;
while while
(intesse[1]==vrai&&tour=0) (intersse[0]==vrai&&tour=1
{}; {/*attente*/};
SC SC
interesse[0] = faux; interesse[1] = faux;
// 0 quitte section critique // 1 quitte section critique
SR SR
31
Algorithme de Peterson
Lorsqu'un processus veut entrer en section critique, il notifie les
autres de ses intentions en positionnant correctement son entrée
dans le tableau interesse[ ], puis il s'approprie le prochain tour.
32
Solutions logicielles
33
Solution matérielles
34
Solution matérielles
35
Solution matérielles
36
Avantage de l’instruction TSL
elle occupe le bus pendant toute son exécution. De ce
simple fait, elle empêche d'éventuels autres processeurs
d'accéder en même temps au mot mémoire LOCK.
37
Solution matérielles
quitter_region:
MOVE LOCK, #0 | écrire 0 dans lock
RTS | retourne à l'appelant; entre
| en section restante
38
Solutions avec attente passive
Problème:
Attente active: Consommation des ressources du processeur.
Un processus qui est en attente, effectue une boucle while,
gaspillant ainsi du temps processeur inutilement.
Exemple: supposons qu'on a 2 processus H avec une haute
priorité et B avec une basse priorité, dans le cas d'un système
temps réel.
Si H est entrain de réaliser une opération d' E/S et B entre en
SC. H termine son E/S élu prioritaire
va être exécuté avant que B ne sorte de sa SC donc
H va boucler indéfiniment.
39
Solutions avec attente passive
Solution:
Endormir un processus en attente et le réveiller dès
que la ressource est libre, pour cela , il y a 2 appels
système:
Sleep() pour endormir le processus appelant
Wakeup(...) pour réveiller le processus passé en
argument
40
Solutions avec attente passive
Problèmes:
41
Solutions avec attente passive
Algorithme
Soit N la taille du tampon.
On va jouer sur le nombre d'éléments dans le tampon qu'on va stocker dans
une variable compteur
43
Sémaphores
44
Sémaphores
La commande P(), décrémente le sémaphore.
45
Sémaphores
46
Sémaphores
47
Sémaphores
#define N 100 /* nombre de places dans le tampon */
Semaphore mutex = 1 ; /* contrôle d'accès au tampon */
semaphore libre = N ; /* nb de places libres */
Semaphore occupe = 0; /* nb de places occupées */
void producteur (void) {
Int element ;
while (TRUE) { produire_element (&element) ; /* produire l'élément suivant */
P (libre) ; /* déc. nb places libres */
P (mutex) ; /* entrée en section critique */
mettre_element (element) ; /* mettre l'élément dans le tampon */
V (mutex) ; /* sortie de section critique */
V (occupe) ; /* inc. nb place occupées et wakeup consommateur*/
}
}
48
Sémaphores
void consommateur (void)
{
int element ;
while (TRUE) {
P (occupe) ; /* déc. nb emplacements occupés */
P (mutex) ; /* entrée section critique */
prelever_element (element) ; /* retire un élement du tampon */
V (mutex) ; /* sortie de la section critique */
V (vide) ; /* inc. nb emplacements libres */
}
}
49
Sémaphores
Remarque
semaphore S;
P(S) décrémente le sémaphore S si S>0 sinon
blocage du processus appelant.
V(S) incrémente le sémaphore S si aucun
processus n'est bloqué par P(S), sinon l'un d'entre
eux sera choisi pour être élu
50
Problème proposé par Dijkstra en 1965 est le suivant :
5 philosophes sont assis autour d’une table ;
5 plats de spaghettis (un devant chaque philosophe) ;
5 fourchettes situées entre chaque plat.
Soit le philosophe mange, soit il réfléchit (il repose alors ses
fourchettes)
Pour manger, ils ont besoin de deux fourchettes ;
Quand un philosophe désire manger, il tente de prendre la fourchette
à sa droite et la fourchette à sa gauche, dans un ordre quelconque ;
Un philosophe mange pendent un moment donné, puis repose ses
fourchettes (pour réfléchir).
51
Procédure phi losophe ( i : entier )
Début
TantQue ( vrai ) Faire
penser ( )
prendre_fourchet tes ( i )
manger ( )
poser_fourchet tes ( i )
FinTantQue
Fin
Problème:
Que se passe-t-il si tous les philosophes ont faim en même temps ?
52
Si on prend un Sémaphore par fourchette ;
Chaque philosophe tente de prendre d’abord la fourchette de droite ;
Puis ensuite, celle de gauche. Pourquoi?
Problème:
Que se passe-t-il si tous les philosophes ont faim en même temps ?
Explications :
Le test et la modification de la valeur d’un sémaphore se font de manière
atomique ; entre deux test/modification, il peut y avoir commutation de contexte.
Description
On définit 3 états pour les philosophes :
Pense ;
Faim (en attente de manger) ;
Mange
53
Les états des philosophes sont placés dans un tableau états.
Lorsqu’un philosophe veut manger :
1. Il passe dans l’état Faim;
2. Vérifie qu’aucun de ces voisins ne mange ;
3. Si c’est le cas, il passe lui-même dans l’état Mange ;
4. Sinon, il est bloqué.
Pour s’assurer de ne pas être interrompu pendant cette phase :
utilisation d’un sémaphore S.
Lorsqu’un philosophe termine de manger
Lorsqu’un philosophe a faim et n’est pas en mesure de manger, il est
bloqué ;
Pour bloquer les philosophes, on utilise un sémaphore pour chacun :
Tableau de sémaphores T.
Lorsqu’un philosophe termine de manger :
Il passe dans l’état Pense
Vérifie si son voisin de gauche est bloqué :
Si c’est le cas, il vérifie s’il peut le débloquer ;
Idem avec le voisin de droite.
54
Procédure philosophe(i : entier)
TantQue ( vrai) Faire
penser ( )
prendre_fourchettes ( i )
manger ( )
poser_fourchettes ( i )
FinTantQue
55
Procédure prendre fourchette(i : entier)
P(S) / / Entrée en section critique
etats ( i ) <− faim / / On passe dans l ’état faim
test ( i ) / / On tes te s i on peut passer dans l ’état manger
V(S) / / Sortie de section critique
P(T [ i ] ) / / On bloque s i on n’a pu prendre les fourchet tes
56