Chapitre 02
Chapitre 02
Chapitre 02
Bessouf Hakim
CHAPITRE 2:
• Cette méthode peut être utilisé seulement dans le cas des machines
avec un seul processeur. Elle consiste à masquer les interruptions
avant d'entrer en SC puis de les démasquer après l'exécution de la SC.
• Problèmes:
- si un processus se bloque dans sa SC tous le système sera affecté.
- elle ne peut pas être utilisé dans les machine multiprocesseurs.
Solutions matériels basées sur des instruction indivisibles
L'instruction SWAP:
Une instruction indivisible qui
permute deux variable données en
paramètre, elle s'exécute comme suit:
Pour effectuer l'exclusion mutuelle on
utilise deux variables, Une variable
globale lock initialisé a faux et une
variable locale key pour chaque
processus. Les deux variables sont
utilisés comme suit :
• Les solutions logiciels et matériels basé sur l'attente active vu
précédemment, malgré elles fonctionnes, elle sont inefficaces, un
processus ne pouvant pas entrer en SC va rester en exécution et
utilise l'unité centrale inutilement, et ralenti aussi l'accès à la
mémoire à cause des accès répétés aux variables de synchronisation.
• D'autre solutions plus efficaces au problème de l'exclusion mutuelle
qui sont basées sur l'attente passive seront présentées dans les
sections suivantes.
Solutions basées sur l’attente passive (verrou)
• Ces solution permettent de libérer le processeur quand les processus sont
bloqués, parmi ces solutions on cite : les verrous, les sémaphores, les
régions critiques et les moniteurs.
- Les verrous:
• Des structures de données partagées par le système d’exploitation.
• Un verrou est représenté par une variable booléenne «libre» et une file
d'attente des processus.
• Au début la variable libre est initialisé à vrai et la file d’attente des
processus est vide.
Solutions basées sur l’attente passive (verrou)
• On peut accéder a un verrou seulement en utilisant les deux
opérations indivisibles (deux primitives) « prendre » et « libérer » qui
sont implémentés comme suit :
Solutions basées sur l’attente passive (verrou)
• Pour réaliser l’exclusion mutuel a l’aide d’un verrou on procède
comme suit :
Solutions basées sur l’attente passive (sémaphore)
• Les sémaphores sont des outils qui permettent de mettre en œuvre
des problème de synchronisation complexes. Un sémaphore est
représenté par une variable entière « value » et une file d'attente des
processus . On peut accéder à la variable entière S.value seulement
en utilisant les deux opérations indivisibles (deux primitives) Wait : P
et Signal : V
Solutions basées sur l’attente passive (sémaphore)
• La valeur (s.value) d’un sémaphore est initialisé à 0 ou à une valeur
positive.
• La file d’attente des processus est initialement vide.
• Pour mettre en œuvre des problèmes de synchronisation on peut
utiliser plusieurs sémaphores à la fois.
Remarque importante :
• Pour implémenter les sémaphores et les verrous dans les machines
monoprocesseurs ont peut utiliser le masquage des interruptions, par
contre dans les machines multiprocesseurs le masquage des
interruptions n’est pas approprié , des solutions matériels comme les
instruction SWAP et TAS sont donc nécessaire
Exclusion mutuel par sémaphore
• Pour réaliser l'exclusion mutuel entre n processus on peut utiliser un
sémaphore (appelé généralement mutex) initialisé à 1
• Le programme d'un processus Pi est comme suit :
Précédence des tâches par sémaphores
• Les sémaphores peuvent être utilisés pour synchroniser les systèmes
de tâches.
• On considère un système de tâche composé de deux tache T1 et T2.
T1 doit être exécuté avant T2. Ce système peut être synchronisé par
un sémaphore S initialisé à 0. Le système sera composé de deux
processus (un processus pour chaque tâche). Les deux processus sont
comme suit :
Précédence des tâches par sémaphores
• Exemple : On veut réaliser le système de tâche
représenté par le graphe de précédence suivant :
• Pour mettre en œuvre ce système on utilise 6
sémaphore S2,S2,S3,S4,S5,S6 tous initialisés à 0. Le
système sera composé de 6 processus comme suit:
Coopération entre N processus(sémaphore)
• Les sémaphores peuvent être utilisé pour faire en sorte qu'un nombre
précis de processus seulement coopèrent ensemble.
Exemple (parking)
• On suppose qu'on a N emplacements au parking,
• N conducteur seulement peuvent stationner leurs voitures.
• On peut régler ce problème en utilisant les sémaphores.
Coopération entre N processus(sémaphore)
- Chaque voiture est représenté par un processus
- On utilise une variable sémaphore appelé «parking» initialisée à N.
• Pour entrer dans le parking chaque processus exécute le protocole
suivant :
Rendez-vous entre deux processus (sémaphore)
• On peut établir un point de synchronisation (rendezvous) entre deux
processus. Pour cela on utilise deux sémaphores, un pour chaque
processus:
• On utilise deux variables sémaphore S1 et S2 initialisées à 0.
Modèle producteur/consommateur (sémaphore)
• Un processus Producteur • Première solution: utilisation d'un
crée à chaque fois un sémaphore d'exclusion mutuel
messages, le place dans une initialisé à 1
variable tampon, et un
processus Consommateur
récupère le message et le
traite.
Modèle producteur/consommateur (sémaphore)
• Un processus Producteur • Deuxième solution: utilisation de
crée à chaque fois un deux sémaphores, s_vide initialisé à 1
messages, le place dans une pour vérifier si le tampon est vide et
variable tampon, et un s_plein initialisé à 0 pour vérifier si le
processus Consommateur tampon est plein.
récupère le message et le
traite.
Modèle producteur/consommateur (sémaphore)
• Cas tampon de N
emplacement:
Un sémaphore s_vide
initialisé à N
Un sémaphore s_plein
initialisé à 0
Une variable i initialisé a 0
Une variable j initialisé a 0
Modèle producteur/consommateur (sémaphore)
• Cas M producteurs , K consommateurs et un tampon de N emplacement
• mutex1 et mutex2 pour garantir
qu'un seul producteur à la fois
accède à la variable « i » et qu'un
seul consommateur à la fois accède
à la variable « j ».
• Un sémaphore s_vide initialisé à N
• Un sémaphore s_plein initialisé à 0
• Un sémaphore mutex1 initialisé à 1
• Un sémaphore mutex2 initialisé à 1
• Une variable i initialisé à 0
• Une variable j initialisé à 0
Modèle du Lecteur / Rédacteur
• Dans ce modèle plusieurs processus veulent accéder à une ressource
commune. Un exemple d'utilisation est l'accès à un fichier partagé.
Plusieurs lecteurs peuvent accéder simultanément au fichier puisque la
lecture ne modifie pas les données, mais un seul rédacteur à la fois peut
accéder au fichier.
• Pour lire le fichier, un lecteur exécute la fonction Lire_fichier() ;
• Pour écrie dans le fichier, un rédacteur exécute la fonction Ecrire_fichier() ;
• On utilise une variable nbr_lec pour déterminer le nombre de lecteurs
utilisant le fichier à un instant données et deux sémaphores : mutex pour
garantir l'exclusion mutuel de la variable « nbr_lec » et S_fichier pour
déterminer si le fichier est libre ou non.
Modèle du Lecteur / Rédacteur
Les régions critiques
• Les programme basé sur les sémaphore sont très difficile à corriger, la
détection des erreurs dans le programme est très difficile.
• Des programme qui sembles correctes donnes parfois des résultats
imprévisibles qui sont inacceptable.
• Les régions critique sont un moyen de programmation qui facilite
l'utilisation des variables partagés.
• Les variables partagés sont déclarés par un mot clé shared et la partie
du code ou on utilise ces variables (section critique) est déclaré en
utilisant le mot clé region
Les régions critiques
• Seulement un processus à la fois peut exécuter la partie
region, l'exclusion mutuel dans une région est garantie.
• En utilisant une programmation structuré les erreurs
de programmation peuvent être détectés par les
compilateurs.
• Les région critiques sont réalisées en utilisant des
sémaphores mutex d'exclusion mutuel.
• Les appels P(mutex) avant d'exécuter la region critique
et V(mutex) après l'exécution de la region critique
seront automatiquement générés par le compilateurs.
• L'inconvénient des régions critique est qu'il sont limités
et ne permettent pas de réaliser des synchronisation
complexe.
Les moniteurs
• les moniteurs sont une amélioration des
régions critique. Un moniteur peut être
vu comme une classe qui rassemble à la
fois les données partagés et le code pour
accéder à ces données (section critique).
• A un instant donnée un seul processus
peut être actif dans le moniteur (un seul
processus à la fois exécute les procédures
du moniteur). L'exclusion mutuelle à
l’intérieur du moniteur est donc garantie.
Les moniteurs
• En utilisant les moniteur un seul
client à la fois peut mettre à jour le
solde du compte. La cohérence des
données est donc assuré.
• Le moniteur peut suspendre
l'exécution d'un processus et le
mettre dans une file d'attente si un
autre processus exécute une
procédure du moniteur.
Les variables conditions(Moniteur)
• L'exclusion mutuelle dans le moniteur n'est pas suffisante, on a
besoin d'un mécanisme qui permet de bloquer et débloquer les
processus. Par exemple si on veut traiter le problème du
producteur/consommateur on a besoin d'un mécanisme pour
suspendre les producteurs si le tampon et plein et aussi pour
suspendre les consommateurs si le tampon et vide.
• Dans les moniteurs on peut déclarer des variables spéciales appelés
variables conditions. Ces variables n'ont pas de valeurs et ne sont pas
initialisées, ils ont deux opération permises wait et signal.
Les variables conditions(Moniteur)
• L'opération wait suspend l'exécution du processus appelant et le met
dans une file d'attente des processus suspendus.
• L'opération signal réveil un processus suspendu de la file d'attente.
• s'il n' y a aucun processus dans la file l'opération signal n'a aucun
effet à l'inverse de la primitive V (s) des sémaphore qui enregistre
l'appel en ajoutant 1 au sémaphore.
producteurs/consommateurs
avec un tampon de N cases.
• Remarque importante:
• Une question se pose lorsque un
processus P éveil un autre processus Q
dans le moniteurs en exécutant une
instruction signal, on aura donc deux
processus dans le moniteurs (P et Q) mais
un seul doit pouvoir s'exécuter.
• On a donc deux possibilité :
• 1) P attend que Q quitte le moniteur (ou
se bloc dans une autre condition),
• 2) Q attend que P quitte le moniteur (ou
se bloc dans une autre condition).
Les moniteurs
• La première alternative (Q attend P) semble raisonnable puisque P est
déjà en exécution, mais dans ce cas la condition pour laquelle on a
réveillé Q peut changer, la deuxième solution semble donc plus
approprié.
• par la suite on va faire en sorte qu'un processus réveil un autre
processus à la fin de son exécution ou lorsque il vas se bloquer dans
une condition.
Les moniteurs
• Pour implémenter les moniteurs on utilise les sémaphores comme suit :
1) On utilise un sémaphore mutex initialisé à 1 qui permet de garantir l'exclusion
mutuelle pour l'accès aux procédures du moniteur. On ajoute à chaque
procédure du moniteur un P(mutex) au début et un V(mutex) à la fin,
2) Pour chaque variable condition C on associe un sémaphore SC initialisé à 0
pour suspendre les processus qui exécutent un wait d'une condition et libérer
ces processus quant on exécute un signal, on lui associe aussi un entier nbr_C
pour compter le nombre de processus bloqués dans la condition C.
3) Un autre sémaphore SM (sémaphore moniteur) initialisé à 0 pour suspendre
les processus dans le moniteur après l'exécution d'un signal, Ainsi qu'un entier
nbr_SM pour compter le nombre de processus bloqués dans le sémaphore SM.
Les moniteurs
• Une procédure du moniteur est implémenté comme suit:
Les moniteurs
• Une condition est déclaré comme suit :
• Remarque :
• Il existe d’autres formalismes d’expression
de chemin qui permettent de fixer le
nombre d’occurrences parallèle mais il ne
serons pas abordé dans ce cours.
• 2.1 Introduction
• 2.2 Problème de l’exclusion mutuelle
• 2.3 Solutions pour l'exclusion mutuelle (section critique)
• 2.3.1 Solutions logiciels basées sur l'attente active
CHAPITRE 2
• 2.3.2 Solutions matériels basées sur le masquage des interruptions
• 2.3.3 Solutions matériels basées sur des instruction indivisibles
• 2.3.4 Solutions basées sur l’attente passive
• 2.4 Les verrous
• 2.5 Les sémaphores
• 2.5.1 Exclusion mutuel par sémaphore
• 2.5.2 Précédence des tâches
• 2.5.3 Coopération entre N processus
• 2.5.4 Rendez-vous entre deux processus
• 2.5.5 Modèle du producteur / consommateur
• 2.5.6 Modèle du Lecteur / Rédacteur
• 2.6 Les régions critiques
• 2.7 Les moniteurs
• 2.7.1 Les variables condition
• 2.8 Les expressions de chemins