Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare une entreprise Scribd logo
Systèmes
d'exploitation
Synchronisation de
exécution
Lesslie Lamport
• Américain
• MIT
• LaTeX
• L’algorithme Lamport
bakery
• Tolérance aux fautes
Byzantines
– Utilise sur blockchain
• L’algorithme Paxos
• Signature de Lamport
2
Pirates of Silicon Valley
Questions?
• Qui a construit le premier ordinateur pour
Apple?
• Qu'est-ce que est considéré comme l'un des
plus stupide erreurs dans l'histoire de
l'ordinateur?
• Lequel des personnages avez-vous le plus
aimé?
Questions?
• Qui a construit le premier ordinateur pour Apple?
– Steve Wozniak
• Qu'est-ce que est considéré comme l'un des plus
stupide erreurs dans l'histoire de l'ordinateur?
– Les bénéfices sont dans le matériel
– La vente de DOS
– Computers? Why would ordinary people use computers
for?
• Lequel des personnages avez-vous le plus aimé?
– votre choix
Contenu
• course
• espace critique
• opérations atomique
• busy waiting
• semaphore
• mutex
6
Bibliographie pour aujourd'hui
• Modern Operating Systems
– Chapitre 4
• 4.4
• 4.5
• 4.6
• Operating Systems Concepts
– Chapitre 9
• 9.1 – 9.4
• 9.6
• 9.7
7
COURSE
8
Course
Processus 1
// shared variable a
int a = 0;
if (a == 0)
{
a++;
}
printf ("%dn", a);
// shared variable a
int a = 0;
if (a == 0)
{
a++;
}
printf ("%dn", a);
9
Processus 2
Course – variante séquentiel
Processus 1
// shared variable a
int a = 0;
if (a == 0) {
a++;
}
printf ("%dn", a);
// shared variable a
int a = 0;
if (a == 0) {
a++;
}
printf ("%dn", a);
10
Processus 2
1 1
Course – variante intercalé
Processus 1
// shared variable a
int a = 0;
if (a == 0) {
a++;
}
printf ("%dn", a);
// shared variable a
int a = 0;
if (a == 0) {
a++;
}
printf ("%dn", a);
11
Processus 2
2 2
Course – désiré
Processus 1
// shared variable a
int a = 0;
if (a == 0) {
a++;
}
printf ("%dn", a);
// shared variable a
int a = 0;
if (a == 0) {
a++;
}
printf ("%dn", a);
12
Processus 2
espace critique
1 1
Espace critique
• une partie du code qui doit être exécuté seul
– l'accès aux variables (ressources) qui doit être
exécuté seul
13
if (a == 0) {
a++;
}
if (a == 1) {
a--;
}
Le raison est l’accès de variable a
Operation atomique
• Un opération qui est exécute sans interruption
• Interruptions possible
– interruption matériel
– signaux
– changement de contexte
• Les instructions de CPU sont atomique
14
Exemple
int main ()
{
int a = 0;
a++;
}
15
Plus des exemples sur https://godbolt.org/
Exemple – x86-64
int main ()
{
int a = 0;
a++;
}
; rbp-4 address of
variable a
mov DWORD PTR [rbp-4], 0
add DWORD PTR [rbp-4], 1
16
a++ est atomique
Exemple – ARM
int main ()
{
int a = 0;
a++;
}
; fp-8 address of
variable a
mov r3, #0
str r3, [fp, #-8]
ldr r3, [fp, #-8]
add r3, r3, #1
str r3, [fp, #-8]
17
a++ n’est pas atomique
Instruction pour synchronisation
if (test == 0)
{
test = 1;
// do some work
test = 0;
}
cmp DWORD PTR [rbp-4], 0
jne .L2
mov DWORD PTR [rbp-4], 1
; do some work
mov DWORD PTR [rbp-4], 0
.L2:
18
; rbp-4 address of variable test
N’est pas atomique
Test and set
• Une instruction qui
– Fait un comparaison
– Fait un attribution en dépendent de la
comparaison
• TSL
19
tsl r, valuetsl (r, value)
if (r == 0)
r = value;
Instruction pour synchronisation
if (tsl(test, 1))
{
// do some work
test = 0;
}
mov eax, 0
lock cmpxchg DWORD PTR
[rbp-4], 1
jne .L2
; do some work
mov DWORD PTR [rbp-4], 0
.L2:
20
; rbp-4 address of variable test
est atomique
Fair le code executer atomique
• Spinlock
• Semaphore
• Mutex
21
SPINLOCK
22
Spinlock
while (test != 0)
continue;
test = 1;
// do some work with
test = 0;
23
Spinlock
Atomique?
Spinlock x86
while (test != 0)
continue;
test = 1;
// do some work with
test = 0;
.L2:
cmp DWORD PTR [rbp-4], 0
jne .L2
mov DWORD PTR [rbp-4], 1
; do some work
mov DWORD PTR [rbp-4], 0
24
N’est pas atomique
; rbp-4 address of variable test
Spinlock
while (tsl(test, 1))
continue;
// do some work with
test = 0;
25
Spinlock
Spinlock x86
while (tsl(test, 1))
continue;
// do some work with
test = 0;
mov eax, 0
.L2:
lock cmpxchg DWORD PTR
[rbp-4], 1
jne .L2
; do some work
mov DWORD PTR [rbp-4], 0
26
Est atomique
; rbp-4 address of variable test
lock et unlock
• lock
– prend le spinlock
• unlock
– libère le spinlock
27
lock et unlock
void lock (s)
{
while (tsl(s, 1));
}
void unlock (s)
{
s = 0;
}
28
// s - spinlock
Exemple
Processus 1
// shared variables a and s
int a = 0;
int s;
lock (s);
if (a == 0)
{
a++;
}
unlock (s);
printf ("%dn", a);
// shared variables a and s
int a = 0;
int s;
lock (s);
if (a == 0)
{
a++;
}
unlock (s);
printf ("%dn", a);
29
Processus 2
1 1
Exemple
Processus 1
// shared variables a and s
int a = 0;
int s;
lock (s);
if (a == 0)
{
a++;
}
unlock (s);
printf ("%dn", a);
// shared variables a and s
int a = 0;
int s;
lock (s);
if (a == 0)
{
a++;
}
unlock (s);
printf ("%dn", a);
30
Processus 2
1 1
Deadlock
Que se passe-t-il si nous oublions d'utiliser le
unlock?
Que se passe-t-il si nous utilisons plusieurs de fois
lock sans unlock?
Que se passe-t-il si le program s’arrêt avant unlock?
31
Oublier unlock
Processus 1
// shared variables a and s
int a = 0;
int s;
lock (s);
... waits a lot
// shared variables a and s
int a = 0;
int s;
lock (s);
if (a == 0)
{
a++;
}
printf ("%dn", a);
32
Processus 2
... 1
Plusieurs de lock
Processus 1
// shared variables a and s
int a = 0;
int s;
lock (s);
... waits a lot
// shared variables a and s
int a = 0;
int s;
lock (s);
lock (s);
...waits a lot
33
Processus 2
... ...
Arrête avent unlock
Processus 1
// shared variables a and s
int a = 0;
int s;
lock (s);
... waits a lot
// shared variables a and s
int a = 0;
int s;
lock (s);
if (a == 0)
{
a++;
}
34
Processus 2
... erreur
SÉMAPHORE
35
Spinlock
while (tsl(test, 1))
continue;
// do some work with
test = 0;
36
Spinlock
Busy Waiting
Busy Waiting
• Essayer en permanence de tester la valeur de
la variable
• Le CPU fait des instructions inutiles
• Le processus va consume toute le quantum de
temps pur tester la valeur
37
Les états de processus
38
Spinlock
Les états de processus
39
Attende la resource
Sémaphore
• Object du Système d’Exploitation
• Partage entre plusieurs processus
• Fonctions exécuté atomique
– P (attendre) / wait / down
– V (signaler) / signal / up
• Value initiale
• Queue de processus qui attende
40
Fonctions de sémaphore
void wait (s)
{
while (s <= 0);
s = s - 1;
}
void signal (s)
{
s = s + 1;
}
41
// s - semaphore
Busy waiting
block et wakeup
• block
– arrête le processus curent
• état WAITING
• wakeup
– démarre touts les processus qui sont bloque sure
le sémaphore
• état READY
42
Les états de processus
43
block
wakeup
Fonction de sémaphore
void wait (s)
{
while (s <= 0)
block (s);
s = s - 1;
}
void signal (s)
{
s = s + 1;
wakeup (s);
}
44
// s - semaphore
Types des sémaphores
• binaire
– la valeur peut être seulement 0 ou 1
• comptage
– La valeur est une valeur entier
45
Sémaphore binaire
void wait (s)
{
while (s == 0)
block (s);
s = 0;
}
void signal (s)
{
s = 1;
wakeup (s);
}
46
// s - semaphore
Exemple
Processus 1
// shared variables a and s
int a = 0;
int s;
wait (s);
if (a == 0)
{
a++;
}
signal (s);
printf ("%dn", a);
// shared variables a and s
int a = 0;
int s;
wait (s);
if (a == 0)
{
a++;
}
signal (s);
printf ("%dn", a);
47
Processus 2
1 1
Exemple
Processus 1
// shared variables a and s
int a = 0;
int s;
wait (s);
if (a == 0)
{
a++;
}
signal (s);
printf ("%dn", a);
// shared variables a and s
int a = 0;
int s;
wait (s);
if (a == 0)
{
a++;
}
signal (s);
printf ("%dn", a);
48
Processus 2
1 1
Deadlock
Que se passe-t-il si nous oublions d'utiliser le
signal?
Que se passe-t-il si nous utilisons plusieurs de fois
wait sans signal?
Que se passe-t-il si le program s’arrêt avant signal?
49
Oublier signal
Processus 1
// shared variables a and s
int a = 0;
int s;
wait (s);
... waits a lot
// shared variables a and s
int a = 0;
int s;
wait (s);
if (a == 0)
{
a++;
}
printf ("%dn", a);
50
Processus 2
... 1
Plusieurs de wait
Processus 1
// shared variables a and s
int a = 0;
int s;
wait (s);
... waits a lot
// shared variables a and s
int a = 0;
int s;
wait (s);
wait (s);
...waits a lot
51
Processus 2
... ...
Arrête avent signal
Processus 1
// shared variables a and s
int a = 0;
int s;
wait (s);
... waits a lot
// shared variables a and s
int a = 0;
int s;
wait (s);
if (a == 0)
{
a++;
}
52
Processus 2
... erreur
MUTEX
53
Mutex
• Mutual Exclusion
• Similaire avec le sémaphore binaire
• Utilisez pour threads (même processus)
54
lock et unlock
• lock
– prend le mutex et mémorise le id de thread qui a
le pris
• la fonction lock est réentrante dans le même thread
• unlock
– libéré le mutex
• au fin du program (thread) le mutex est libéré
55
Deadlock
Que se passe-t-il si nous oublions d'utiliser le
unlock?
Que se passe-t-il si nous utilisons plusieurs de fois
wait sans lock?
Que se passe-t-il si le program s’arrêt avant unlock?
56
Oublier unlock
Processus 1
// shared variables a and s
int a = 0;
mutex s;
lock (s);
if (a == 0)
{
a++;
}
unlock (s);
printf ("%dn", a);
// shared variables a and s
int a = 0;
mutex s;
lock (s);
if (a == 0)
{
a++;
}
printf ("%dn", a);
57
Processus 2
1 1
Plusieurs de lock
Processus 1
// shared variables a and s
int a = 0;
mutex s;
lock (s);
if (a == 0)
{
a++;
}
unlock (s);
printf ("%dn", a);
// shared variables a and s
int a = 0;
mutex s;
lock (s);
lock (s);
if (a == 0)
{
a++;
}
unlock (s);
printf ("%dn", a);
58
Processus 2
1 1
Arrête avent unlock
Processus 1
// shared variables a and s
int a = 0;
mutex s;
lock (s);
if (a == 0)
{
a++;
}
unlock (s);
printf ("%dn", a);
// shared variables a and s
int a = 0;
mutex s;
lock (s);
if (a == 0)
{
a++;
}
59
Processus 2
1 erreur
Synchronization en Java
class Run
{
private Object a;
public synchronized void runAlone ()
{
// run some work
}
public void run ()
{
synchronized (a)
{
// run some work using the variable a
}
}
}
60
Mot clés
• course
• espace critique
• opération atomique
• busy waiting
• spinlock
• lock
• unlock
• sémaphore
• sémaphore binaire
• sémaphore comptage
• deadlock
• wait
• signal
• mutex
61
Questions
62

Contenu connexe

SdE 8 - Synchronization de execution

  • 2. Lesslie Lamport • Américain • MIT • LaTeX • L’algorithme Lamport bakery • Tolérance aux fautes Byzantines – Utilise sur blockchain • L’algorithme Paxos • Signature de Lamport 2
  • 4. Questions? • Qui a construit le premier ordinateur pour Apple? • Qu'est-ce que est considéré comme l'un des plus stupide erreurs dans l'histoire de l'ordinateur? • Lequel des personnages avez-vous le plus aimé?
  • 5. Questions? • Qui a construit le premier ordinateur pour Apple? – Steve Wozniak • Qu'est-ce que est considéré comme l'un des plus stupide erreurs dans l'histoire de l'ordinateur? – Les bénéfices sont dans le matériel – La vente de DOS – Computers? Why would ordinary people use computers for? • Lequel des personnages avez-vous le plus aimé? – votre choix
  • 6. Contenu • course • espace critique • opérations atomique • busy waiting • semaphore • mutex 6
  • 7. Bibliographie pour aujourd'hui • Modern Operating Systems – Chapitre 4 • 4.4 • 4.5 • 4.6 • Operating Systems Concepts – Chapitre 9 • 9.1 – 9.4 • 9.6 • 9.7 7
  • 9. Course Processus 1 // shared variable a int a = 0; if (a == 0) { a++; } printf ("%dn", a); // shared variable a int a = 0; if (a == 0) { a++; } printf ("%dn", a); 9 Processus 2
  • 10. Course – variante séquentiel Processus 1 // shared variable a int a = 0; if (a == 0) { a++; } printf ("%dn", a); // shared variable a int a = 0; if (a == 0) { a++; } printf ("%dn", a); 10 Processus 2 1 1
  • 11. Course – variante intercalé Processus 1 // shared variable a int a = 0; if (a == 0) { a++; } printf ("%dn", a); // shared variable a int a = 0; if (a == 0) { a++; } printf ("%dn", a); 11 Processus 2 2 2
  • 12. Course – désiré Processus 1 // shared variable a int a = 0; if (a == 0) { a++; } printf ("%dn", a); // shared variable a int a = 0; if (a == 0) { a++; } printf ("%dn", a); 12 Processus 2 espace critique 1 1
  • 13. Espace critique • une partie du code qui doit être exécuté seul – l'accès aux variables (ressources) qui doit être exécuté seul 13 if (a == 0) { a++; } if (a == 1) { a--; } Le raison est l’accès de variable a
  • 14. Operation atomique • Un opération qui est exécute sans interruption • Interruptions possible – interruption matériel – signaux – changement de contexte • Les instructions de CPU sont atomique 14
  • 15. Exemple int main () { int a = 0; a++; } 15 Plus des exemples sur https://godbolt.org/
  • 16. Exemple – x86-64 int main () { int a = 0; a++; } ; rbp-4 address of variable a mov DWORD PTR [rbp-4], 0 add DWORD PTR [rbp-4], 1 16 a++ est atomique
  • 17. Exemple – ARM int main () { int a = 0; a++; } ; fp-8 address of variable a mov r3, #0 str r3, [fp, #-8] ldr r3, [fp, #-8] add r3, r3, #1 str r3, [fp, #-8] 17 a++ n’est pas atomique
  • 18. Instruction pour synchronisation if (test == 0) { test = 1; // do some work test = 0; } cmp DWORD PTR [rbp-4], 0 jne .L2 mov DWORD PTR [rbp-4], 1 ; do some work mov DWORD PTR [rbp-4], 0 .L2: 18 ; rbp-4 address of variable test N’est pas atomique
  • 19. Test and set • Une instruction qui – Fait un comparaison – Fait un attribution en dépendent de la comparaison • TSL 19 tsl r, valuetsl (r, value) if (r == 0) r = value;
  • 20. Instruction pour synchronisation if (tsl(test, 1)) { // do some work test = 0; } mov eax, 0 lock cmpxchg DWORD PTR [rbp-4], 1 jne .L2 ; do some work mov DWORD PTR [rbp-4], 0 .L2: 20 ; rbp-4 address of variable test est atomique
  • 21. Fair le code executer atomique • Spinlock • Semaphore • Mutex 21
  • 23. Spinlock while (test != 0) continue; test = 1; // do some work with test = 0; 23 Spinlock Atomique?
  • 24. Spinlock x86 while (test != 0) continue; test = 1; // do some work with test = 0; .L2: cmp DWORD PTR [rbp-4], 0 jne .L2 mov DWORD PTR [rbp-4], 1 ; do some work mov DWORD PTR [rbp-4], 0 24 N’est pas atomique ; rbp-4 address of variable test
  • 25. Spinlock while (tsl(test, 1)) continue; // do some work with test = 0; 25 Spinlock
  • 26. Spinlock x86 while (tsl(test, 1)) continue; // do some work with test = 0; mov eax, 0 .L2: lock cmpxchg DWORD PTR [rbp-4], 1 jne .L2 ; do some work mov DWORD PTR [rbp-4], 0 26 Est atomique ; rbp-4 address of variable test
  • 27. lock et unlock • lock – prend le spinlock • unlock – libère le spinlock 27
  • 28. lock et unlock void lock (s) { while (tsl(s, 1)); } void unlock (s) { s = 0; } 28 // s - spinlock
  • 29. Exemple Processus 1 // shared variables a and s int a = 0; int s; lock (s); if (a == 0) { a++; } unlock (s); printf ("%dn", a); // shared variables a and s int a = 0; int s; lock (s); if (a == 0) { a++; } unlock (s); printf ("%dn", a); 29 Processus 2 1 1
  • 30. Exemple Processus 1 // shared variables a and s int a = 0; int s; lock (s); if (a == 0) { a++; } unlock (s); printf ("%dn", a); // shared variables a and s int a = 0; int s; lock (s); if (a == 0) { a++; } unlock (s); printf ("%dn", a); 30 Processus 2 1 1
  • 31. Deadlock Que se passe-t-il si nous oublions d'utiliser le unlock? Que se passe-t-il si nous utilisons plusieurs de fois lock sans unlock? Que se passe-t-il si le program s’arrêt avant unlock? 31
  • 32. Oublier unlock Processus 1 // shared variables a and s int a = 0; int s; lock (s); ... waits a lot // shared variables a and s int a = 0; int s; lock (s); if (a == 0) { a++; } printf ("%dn", a); 32 Processus 2 ... 1
  • 33. Plusieurs de lock Processus 1 // shared variables a and s int a = 0; int s; lock (s); ... waits a lot // shared variables a and s int a = 0; int s; lock (s); lock (s); ...waits a lot 33 Processus 2 ... ...
  • 34. Arrête avent unlock Processus 1 // shared variables a and s int a = 0; int s; lock (s); ... waits a lot // shared variables a and s int a = 0; int s; lock (s); if (a == 0) { a++; } 34 Processus 2 ... erreur
  • 36. Spinlock while (tsl(test, 1)) continue; // do some work with test = 0; 36 Spinlock Busy Waiting
  • 37. Busy Waiting • Essayer en permanence de tester la valeur de la variable • Le CPU fait des instructions inutiles • Le processus va consume toute le quantum de temps pur tester la valeur 37
  • 38. Les états de processus 38 Spinlock
  • 39. Les états de processus 39 Attende la resource
  • 40. Sémaphore • Object du Système d’Exploitation • Partage entre plusieurs processus • Fonctions exécuté atomique – P (attendre) / wait / down – V (signaler) / signal / up • Value initiale • Queue de processus qui attende 40
  • 41. Fonctions de sémaphore void wait (s) { while (s <= 0); s = s - 1; } void signal (s) { s = s + 1; } 41 // s - semaphore Busy waiting
  • 42. block et wakeup • block – arrête le processus curent • état WAITING • wakeup – démarre touts les processus qui sont bloque sure le sémaphore • état READY 42
  • 43. Les états de processus 43 block wakeup
  • 44. Fonction de sémaphore void wait (s) { while (s <= 0) block (s); s = s - 1; } void signal (s) { s = s + 1; wakeup (s); } 44 // s - semaphore
  • 45. Types des sémaphores • binaire – la valeur peut être seulement 0 ou 1 • comptage – La valeur est une valeur entier 45
  • 46. Sémaphore binaire void wait (s) { while (s == 0) block (s); s = 0; } void signal (s) { s = 1; wakeup (s); } 46 // s - semaphore
  • 47. Exemple Processus 1 // shared variables a and s int a = 0; int s; wait (s); if (a == 0) { a++; } signal (s); printf ("%dn", a); // shared variables a and s int a = 0; int s; wait (s); if (a == 0) { a++; } signal (s); printf ("%dn", a); 47 Processus 2 1 1
  • 48. Exemple Processus 1 // shared variables a and s int a = 0; int s; wait (s); if (a == 0) { a++; } signal (s); printf ("%dn", a); // shared variables a and s int a = 0; int s; wait (s); if (a == 0) { a++; } signal (s); printf ("%dn", a); 48 Processus 2 1 1
  • 49. Deadlock Que se passe-t-il si nous oublions d'utiliser le signal? Que se passe-t-il si nous utilisons plusieurs de fois wait sans signal? Que se passe-t-il si le program s’arrêt avant signal? 49
  • 50. Oublier signal Processus 1 // shared variables a and s int a = 0; int s; wait (s); ... waits a lot // shared variables a and s int a = 0; int s; wait (s); if (a == 0) { a++; } printf ("%dn", a); 50 Processus 2 ... 1
  • 51. Plusieurs de wait Processus 1 // shared variables a and s int a = 0; int s; wait (s); ... waits a lot // shared variables a and s int a = 0; int s; wait (s); wait (s); ...waits a lot 51 Processus 2 ... ...
  • 52. Arrête avent signal Processus 1 // shared variables a and s int a = 0; int s; wait (s); ... waits a lot // shared variables a and s int a = 0; int s; wait (s); if (a == 0) { a++; } 52 Processus 2 ... erreur
  • 54. Mutex • Mutual Exclusion • Similaire avec le sémaphore binaire • Utilisez pour threads (même processus) 54
  • 55. lock et unlock • lock – prend le mutex et mémorise le id de thread qui a le pris • la fonction lock est réentrante dans le même thread • unlock – libéré le mutex • au fin du program (thread) le mutex est libéré 55
  • 56. Deadlock Que se passe-t-il si nous oublions d'utiliser le unlock? Que se passe-t-il si nous utilisons plusieurs de fois wait sans lock? Que se passe-t-il si le program s’arrêt avant unlock? 56
  • 57. Oublier unlock Processus 1 // shared variables a and s int a = 0; mutex s; lock (s); if (a == 0) { a++; } unlock (s); printf ("%dn", a); // shared variables a and s int a = 0; mutex s; lock (s); if (a == 0) { a++; } printf ("%dn", a); 57 Processus 2 1 1
  • 58. Plusieurs de lock Processus 1 // shared variables a and s int a = 0; mutex s; lock (s); if (a == 0) { a++; } unlock (s); printf ("%dn", a); // shared variables a and s int a = 0; mutex s; lock (s); lock (s); if (a == 0) { a++; } unlock (s); printf ("%dn", a); 58 Processus 2 1 1
  • 59. Arrête avent unlock Processus 1 // shared variables a and s int a = 0; mutex s; lock (s); if (a == 0) { a++; } unlock (s); printf ("%dn", a); // shared variables a and s int a = 0; mutex s; lock (s); if (a == 0) { a++; } 59 Processus 2 1 erreur
  • 60. Synchronization en Java class Run { private Object a; public synchronized void runAlone () { // run some work } public void run () { synchronized (a) { // run some work using the variable a } } } 60
  • 61. Mot clés • course • espace critique • opération atomique • busy waiting • spinlock • lock • unlock • sémaphore • sémaphore binaire • sémaphore comptage • deadlock • wait • signal • mutex 61