Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
1
Problématique 2
Dans un système multiprogrammée les processus/Les threads ont
parfois besoin d’interagir (coopérer) avec d’autres
processus/threads pour progresser.
L’exécution d’un processus/thread peut être affecté par l’exécution
des autres processus/threads ou il peut affecter lui-même leurs
exécutions.
Pour interagir (coopérer) il y a besoin de communication assurée
généralement par des données partagées qui peuvent se trouver dans la
mémoire principale ou dans un fichier.
Les accès concurrents (simultanés) à des données partagées peuvent
conduire à des incohérences dans les résultats obtenus.
Quand plusieurs Processus/threads s’exécutent en parallèle, nous ne
pouvons pas faire d’hypothèses sur leurs vitesses d’exécution, ni leur
entrelacements.
Exemple illustratif 3
Sachant que aucune hypothèse n’est connu sur les vitesses d’exécution
des processus et que ces derniers peuvent être interrompu à
n’importe quel moment.
Exemple illustratif (suite)
Deux scénarios possibles:
(1) les processus s’exécute itérativement et dans ce cas le
résultat dans b serais la valeur 2.
(2) P1
b=a interruption P2
b=a
b++
b++ a=b
a=b
5
Notion de ressource
Utilisation d'une ressource par un processus passe par trois étapes :
1. Allocation
2. Utilisation
3. Restitution
Contrainte :
Les phases d'allocation et de restitution doivent assurer que la
ressource soit utilisée conformément à son nombre de points d'accès
6
Section Critique
La partie de programme dans laquelle se font des accès à une
ressource partagée s'appelle une section critique.
7
Section critique
M. X demande une
réservation
d’avion
Base de données
dit que fauteuil
A est disponible
atomique
Fauteuil A est
assigné à X et
marqué occupé
8
Le problème de la section critique
Lorsqu’un processus manipule une donnée (ou ressource)
partagée avec d’autres, il se trouve dans une section
critique (associée à cette donnée)
Section d’entrée
Section de sortie
11
4 Conditions d'accès à une SC
Exclusion Mutuelle :Deux processus ne peuvent être
ensemble en section critique,
Progression Un processus bloqué en dehors de sa section
critique ne doit pas empêcher un autre d'entrer dans la sienne
(pas d’Interblocage)
Attente bornée Si deux processus attendent l'entrée dans
leurs sections critiques respectives, le choix doit se faire en un
temps fini, (pas de famine).
Aucune hypothèse Pas d'hypothèses sur les vitesses relatives
des processus (indépendance vis à vis du matériel). Tous les
processus doivent avoir la même chance d'entrer en section
critique,
12
Trois types de solutions
Solutions fournies par le matériel : s’appuient sur
l’existence de certaines instructions spéciales (du
processeur)
13
Solutions d’exclusion mutuelles
avec attente active.
Dans ce contexte on trouve les solutions
suivantes:
14
Masquage des interruptions
Avant d’entrer dans une section critique, le processus masque les
interruptions.
Il les restaure à la fin de la section critique.
Il ne peut être alors suspendu durant l’exécution de la section
critique.
Process Pi:
Répéter
Protocole d’entrée en SC = désarmer les Interruptions
Section critique ( SC In-interruptible, donc
indivisible car pas de commutation de contexte)
Protocole de sortie de SC = armer les Interruptions
Section restante
Fin Répéter
15
Masquage des interruptions
Problèmes
Solution dangereuse : si le processus, pour une raison ou
pour une autre, ne restaure pas les interruptions à la sortie de la
section critique, ce serait la fin du système.
Elle n’assure pas l’exclusion mutuelle, si la machine est
multiprocesseurs (le masquage des interruptions concerne
uniquement le processeur qui a demandé l’interdiction). Les
autres processus exécutés par un autre processeur pourront
donc accéder aux objets partagés.
Cette technique parfois utilisée et, est réservée aux
systèmes d’exploitation
16
Attente active et verrouillage
Utiliser une variable partagée verrou, unique, initialisée
à 0.
Pour rentrer en section critique, un processus doit tester la
valeur du verrou.
Si verrou = 0, le processus met le verrou à 1 puis
exécute sa section critique.
A la fin de la section critique , il remet le verrou à 0.
Sinon, il attend (attente active ) que le verrou devienne
égal à 0 : while(verrou !=0) ;
17
Attente active et verrouillage
18
Attente active et verrouillage
Problèmes
Elle n’assure pas l’exclusion mutuelle :
Supposons qu’un processus est suspendu juste après avoir lu la valeur du
verrou qui est égal à 0.
Ensuite, un autre processus est élu. Ce dernier teste le verrou qui est
toujours égal à 0, met le verrou à 1 et entre dans sa section
critique.
Ce processus est suspendu avant de quitter la section critique. Le
premier processus est alors réactivé, il entre dans sa section critique et
met le verrou à 1.
Les deux processus sont en même temps en section critique
20
Instruction indivisible: Test-and-Set
(TAS)
21
Attente active avec alternance
Utiliser une variable tour qui mémorise le tour
du processus qui doit entrer en section
critique. tour est initialisée à 0.
22
Attente active avec alternance
Processus P0 Processus P1
while (1) while (1)
{ /*attente active*/ { /*attente active*/
while (tour !=0) ; while (tour !=1) ;
section_critique_P0() ; section_critique_P1() ;
tour = 1 ; tour = 0 ;
…. ….
} }
25
Solutions d’exclusion mutuelle
sans attente active.
26
Les primitives SLEEP et WAKEUP
27
Les primitives SLEEP et WAKEUP
28
Les primitives SLEEP et WAKEUP
29
Dans le système Unix, les appels système qui assurent à peu
près, les mêmes fonctions que les primitives SLEEP et
WAKEUP sont :
pause( ) : suspend le processus appelant jusqu’à réception d’un
signal.
kill(pid, SIGCONT): envoie le signal SIGCONT au processus
pid. L’émission d’un signal est possible si l’une des deux
conditions est vérifiée :
1. L’émetteur et le destinataire du signal appartiennent au même
propriétaire
2. L’émetteur du signal est le super-utilisateur.
30
Problème du
producteur/consommateur
La solution du problème au moyen des sémaphores nécessite
deux sémaphores.
Le premier, nommé Plein, compte le nombre
d’emplacements occupés. Il est initialisé à 0.
Il sert à bloquer/débloquer le consommateur (P(Plein) et
V(Plein)).
Le second, nommé Vide, compte le nombre d’emplacements
Vide. Il est initialisé à N (N est la taille du tampon).
Il sert à bloquer/débloquer le producteur (P(Vide) et
V(Vide)).
34
Problème du
producteur/consommateur
tampon [N];
Consommateur :
Producteur :
{ int ic =0;
{ int ip =0;
Répéter
Répeter
{ P(Plein);
{ P(Vide) ;
consommer(tampon,ic);
produire(tampon, ip);
ic= Mod(ic+1, N);
ip = Mod(ip +1,N);
V(Vide);
V(Plein);
} tantque vrai
} tantque vrai
}
}35