Académique Documents
Professionnel Documents
Culture Documents
Communication interprocessus
Système d’exploitation
Module: M18 - IRISI S3
FST Marrakech
Université Cadi Ayyad
Synchronisation des
processus
Processus parallèles
Processus parallèles
Selon la nature des relations existantes entre les processus parallèles, on peut
distinguer deux types :
Processus disjoints (Indépendants) qui n’ont aucune relation commune.
Leurs exécutions respectives sont indépendantes et leurs contextes respectifs
sont disjoints.
I Deux processus P1 et P2 sont disjoints si les exécutions suivantes sont
équivalentes (donnent les mêmes résultats ): (P1 ||P2 ), (P1 ;P2 ), (P2 ;P1 ) .
I Dans ce cas, P1 et P2 n’ont aucune interaction (sauf le processeur en cas de
monoprocesseur) ; De plus, l’exécution parallèle de P1 et P2 permettra
d’optimiser le temps total d’exécution.
Processus concurrents qui interagissent les uns avec les autres durant leur
évolution.
I On dira que P1 et P2 sont concurrents si les exécutions suivantes ne sont pas
équivalentes : (P1 ||P2 ), (P1 ;P2 ), (P2 ;P1 )
I De plus (P1 ||P2 ) peut donner des résultats aléatoires si certaines précautions
ne sont pas prises. Les dangers d’une telle exécution sont dus au fait que P1
et P2 utilisent des ressources communes.
Processus parallèles
Synchronisation
Synchronisation
Exclusion mutuelle
Position du problème
Exclusion mutuelle
Position du problème : exemple du compte bancaire
Exclusion mutuelle
Position du problème : exemple du compte bancaire
Ordre d’exécution P1 P2
1 A1: Lire Cpt ;
2 A2: Lire Cpt ;
3 B1: Cpt = Cpt+SV
4 B2: Cpt = Cpt-SR
5 C1: Ecrire Cpt ;
6 C2: Ecrire Cpt ;
Valeur finale du Compte Cpt-SR
Pr. Abdessamad EL BOUSHAKI (FST Marrakech) Système d’exploitation 18/72
Synchronisation des processus
Communication interprocessus
Exclusion mutuelle
Position du problème : exemple du compte bancaire
Exclusion mutuelle
Notion de section critique
Pratiquement, les SC
doivent être détectées par
les concepteurs de
programmes
Exemple du compte
bancaire :
Exclusion mutuelle
Définition
Pour éviter toute utilisation incorrecte d’une ressource critique, les Sections
Critiques (SC) qui la manipulent dans les différents processus ne doivent
jamais s’exécuter simultanément.
Autrement dit, ces SC doivent s’exécuter en Exclusion Mutuelle (EM ou
mutex).
I c-à-d une SC ne peut être entamée que si aucune autre SC du même
ensemble n’est en exécution.
L’exclusion mutuelle est une méthode qui permet de s’assurer que si un
processus utilise une variable ou une ressource partagée, les autres processus
seront exclus de la même activité.
Pour assurer l’exécution des SC des processus en EM il est nécessaire de
trouver une solution qui permet d’éviter les conditions de concurrence.
Exclusion mutuelle
Principe
Exclusion mutuelle
Principe
...
< Instructions hors de la SC >
...
Protocole d entr é e en SC
SC
Protocole de sortie de SC
...
< Instructions hors de la SC >
...
Fin
Exclusion mutuelle
Principe
L’EM des processus dans leurs SC n’est garantie que si les protocoles
d’entrée et de sortie sont correctement utilisés.
En effet, en cas où ces protocoles sont mal construits, les problèmes suivants
peuvent se produire:
I L’interblocage qui caractérise une situation où les processus ne peuvent plus
progresser par manque de ressources. Chaque processus détient des ressources
dont l’autre a besoin.
I La famine qui est une situation où certains processus n’accèdent jamais à
leurs sections critiques et sont ainsi mis en attente indéfiniment alors que
d’autre accèdent à leurs sections critiques selon leurs besoins.
Exclusion mutuelle
Hypothèses
Exclusion mutuelle
Propriétés
Solutions matérielles
Solutions matérielles
Masquage des Interruptions: L’idée principale de cette solution est le
masquage d’interruptions les commutations de processus qui pourraient
violer l’exclusion Mutuelle des SC.
chaque processus entrant dans la section critique désactive toutes les
interruptions et les réactive à sa sortie de la section critique.
Inconvénients
Les interruptions restent masquées pendant toute la SC, d’où risque de perte
d’interruptions ou de retard de traitement.
Une SC avec while(1) bloque tout le système
Fonctionnel que sur des machines monoprocesseurs.
N’est accessible qu’aux programmeurs privilégies (super utilisateurs) pour des
raisons de fiabilité.
Pr. Abdessamad EL BOUSHAKI (FST Marrakech) Système d’exploitation 29/72
Synchronisation des processus
Communication interprocessus
Solutions matérielles
Solutions matérielles
Instruction TAS (Test And Set) consiste à déclarer une variable « verrou
» donnant l’état de la ressource critique (vrai ou 1 ressource occupée ; faux
ou 0 ressource libre).
L’instruction TAS garantit une EM au niveau machine entre les processus
désirant tester et modifier la variable d’état « verrou ».
Soit verrou une variable commune aux processus, concernée par la SC. Elle
doit être initialisée à faux (ressource libre).
Solutions matérielles
Instruction SWAP : permet d’échanger le contenu de deux mots de manière
atomique.
void SWAP ( int * x , int * y )
{
int z ;
Sa forme générale est la suivante : z = *x;
*x= *y;
*y = z;
}
Solutions logicielles
L’attente active
Solution 1
consiste à laisser les deux processus partager une variable entière commune
« tour », initialisée à 0 (ou 1).
Si la valeur de tour=i, alors on permet au processus Pi d’exécuter sa SC.
La solution garantit qu’un seul processus à la fois peut se trouver dans sa SC.
Cependant:
I l’hypothèse 3 de Dijkstra n’est pas respectée, car cette solution exige une
alternance stricte ; les processus entrent en SC à tour de rôle dans un ordre
forcé. ⇒ Par exemple, si tour=0 et P1 est prêt à entrer dans sa SC, cela ne
lui est pas possible même si P0 peut se trouver dans sa section restante.
I les propriétés b et c de Dijkstra ne sont pas vérifiées.
Pr. Abdessamad EL BOUSHAKI (FST Marrakech) Système d’exploitation 34/72
Synchronisation des processus
Communication interprocessus
L’attente active
Solution 2
L’attente active
Solution 2
L’attente active
Solution 3 : Algorithme de Dekker
L’attente active
Solution 3 : Algorithme de Dekker
Pour entrer dans la SC, le processus Pi met son état Etat[i] à Vrai et
permet à l’autre processus d’entrer en SC en mettant la variable tour à j.
Si les deux processus tentent d’entrer en même temps en SC, tour sera fixé
à i et à j presque au même moment.
Evidemment, une seule des ces affectations se produira, l’autre sera perdue
(la seconde affectation écrasera la première valeur).
La valeur de tour décidera quel processus entrera dans sa SC.
Cet algorithme vérifie toutes les hypothèses et les propriétés de
Dijkstra.
L’attente active
Solution 4 : Algorithme de Boulanger
L’attente active
Solution 4 : Algorithme de Boulanger
L’attente active
Inconvénients:
En considérant l’attente active, tout processus désirant entrer en SC est
susceptible de consommer du temps (éventuellement tout son quantum de
temps, voire même plusieurs) en bouclant inutilement.
I Un processus souhaitant entrer en SC vérifie s’il en a le droit sinon il entre en
boucle d’attende de l’autorisation de l’entrée en SC.
Cette attente équivaut à une forme d’autoconsommation du système. Le
temps d’allocation de la ressource principale, c.à.d., du processeur est
fâcheusement gaspillé.
L’attente passive
L’attente passive
Les verrous
typedef struct {
bool etat = 0;
CB * file ;
} verrou ;
L’attente passive
Les verrous
L’attente passive
Les verrous
L’attente passive
Les verrous
L’attente passive
Les sémaphores
typedef struct {
unsigned int valeur ;
CB * file ;
} semaphore ;
L’attente passive
Les sémaphores
Un sémaphore est une variable globale manipulé par les opérations suivantes :
Init(s, x) : initialiser le sémaphore « s » avec la valeur x qui indique le
nombre de permissions;
P(s) [Proberen « tester »]: décrémenter la valeur de sémaphore et
bloquer le processus si sa valeur est strictement négative ( < 0).
V(s) [Verhogen « incrémenter »]: incrémenter la valeur du sémaphore et
réveiller un processus bloqué si sa valeur est négative (≤ 0).
L’attente passive
Les sémaphores
void P ( semaphore s )
{
s . valeur = s . valeur -1;
if ( s . valeur < 0)
suspendre et ajouter le processus appelant dans la file associ é e à s
}
void V ( semaphore s )
{
s . valeur = s . valeur + 1;
if ( s . valeur <= 0)
d é bloquer un des processus de la file associ é e à s
}
L’attente passive
Les sémaphores
L’attente passive
Les moniteurs
L’attente passive
Les moniteurs
L’attente passive
Les moniteurs
L’attente passive
Les moniteurs
Void retirer ()
{
if ( cpt == 0) wait ( vide ) ; /* ne pas retirer s ’ il n ’y pas d ’ objet */
retirer_objet () ;
cpt - -;
if ( cpt == N -1) signal ( plein )
}
cpt = 0;
end monitor ;
L’attente passive
Les moniteurs
void .......()
{
......
nom_moniteur . mettre ;
.....
}
void .......()
{
.....
nom_moniteur . retirer ;
.....
}
Communication
interprocessus
Processus indépendants
I Ne peuvent pas affecter ou être affecté par d’autres processus
Processus coopératifs
I Peut être affecté ou affecter d’autres processus
Le partage de données définit le type de processus
I Indépendant sans partage et coopératif avec
Processus coopératif
Modèles de communication
On recense essentiellement deux principaux moyens de communication entre
processus :
Création d’une zone de mémoire partagée : échange coordonné
d’information par cette zone de mémoire
Utilisation d’un passage de messages : échange de messages entre les
processus
Modèles de communication
Mémoire partagée
I Très rapide à exécuter une fois la zone partagée établie
Aucune sollicitation de l’OS une fois la zone établie
I Protection à faire contre les modifications concurrentes
Utilisation, par exemple, de sémaphores
I Éventuel problèmes de cohérence de cache
En particulier sur les systèmes multiprocesseurs
Passage de messages
I Passage de messages utilisé pour des petits messages
Car il n’y a pas de conflits à éviter
I Plus facile à implémenter dans un système distribué
Primitives simples à utiliser
I Plus lent à exécuter et consommateur de temps
De nombreux appels systèmes à utiliser en permanence
Dans un programme donné, lorsque l’on souhaite modifier une variable V par
plusieurs procédures, celle-ci est passée en paramètres par adresse à chaque
procédure.
On peut alors dire que les procédures communiquent entre elles au moyen de
la variable V.
Transposons cet exemple pour deux processus :
I la même variable V ne peut être modifiée par les deux processus pour une
raison de visibilité car généralement chaque processus s’exécute dans un
espace d’adressage séparé.
I Les données d’un processus P1 sont modifiées à l’intérieur de son segment de
données et donc inaccessibles à un autre processus P2 .
Le programmeur doit recourir à une technique explicite de communication
entre les processus afin d’échanger entre eux les valeurs de la variable V.
# define BUFFER_SIZE 10
typedef struct {
// ...
} item ;
Producteur :
1 Attendre que le buffer ne soit pas plein
2 Ajouter un élément dans le buffer
3 Avancer le pointeur in d’une position
while ( true )
{
// tant que le buffer est plein
while ((( in + 1) % BUFFER_SIZE ) == out )
{
// on ne fait rien
}
buffer [ in ] = next_produced ;
in = ( in + 1) % BUFFER_SIZE ;
}
Consommateur :
1 Attendre que le buffer ne soit pas vide
2 Prendre un élément dans le buffer
3 Avancer le pointeur out d’une position
while ( true )
{
// tant que le buffer est vide
while ( in == out )
{
// on ne fait rien
}