# Cour 2 -- Théorie de la concurrence ###### tags `cour` `M1 S1` `Concurrence` [Somaire](IAsAMpizSpawifCj1gZ__g#)\ [precedent](/hkQL_-GXTG6nXzaiRtdNtg) > [time= 23 sept 2020] [TOC] {%hackmd B0rpdjqcRfel-RZiyDj0PA %} ### attente borné On sais qu'il n'y a pas famine. Mais on ne sais pas le nombre de fois que l'algorithme va attendre pour etre obligé de prendre la main. ## Logique temporelle ### LTL (linear-time temporal logic) :::success **Logique de temps linéaire.**\ le comportement d'un programme est vu comme l'ensemble ::: ## syntaxe :::success $$ \phi, \psi ::= P \:|\: \neg \phi \:|\: \textbf{X} \phi \:|\: \phi \: \textbf{U} \: \psi $$ ::: - $X \phi$: **next** (demain $\phi$) - $\phi \: \textbf{U} \: \psi$: **until** (un jour $\psi$ et avant $\phi$: "toujours $\phi$ jusqu'à $\psi$") :::success abréviation - $\textbf{F} \: \varphi= \top \: \textbf{U} \: \phi$: "un jour dans le futur" - $\textbf{G} \: \varphi= \neg \: \textbf{F} \: \neg \varphi$: globaly ("toujours dans le futur)" ::: ## sémantique on interprète les formules de LTL sur une ++exécution étiquetée++ $$ \rho = s_0 \rightarrow s_1 \rightarrow s_2 \rightarrow s_3 \cdots \rightarrow s_i \rightarrow s_{i+1} \cdots $$ - $s_0$ est le présent - $s_1 \rightarrow s_2 \rightarrow s_3 \cdots$ est le futur un étiquetage de chaque état $s_j$ par les propositions atomues vraies en $s_j$ est $\ell(s_j)$ $\rho^i \text{est le i-ème suffix:} s_i \rightarrow s_{i+1} \cdots$ On interprète les formules de LTL sur une ++éxécution++ d'un diagramme d'état.\ Chaque ***s~j~** est de la forme: **(p, q, v1, v2)**. Avec: - *p* et *q* les point d'instruction de chanque processus - *v1* et *v2* les valeur de chaque variable $S_0 \in Q, \rho = s_0 \: s_1 \: s_2 \: s_3 \: s_4 \: \cdots$ une éxécution et $\ell$ un étiquetage de chaque état par des proposition atomique. - $\rho \vDash P \text{ ssi } P \in \ell(s_0)$ - $\rho \vDash \varphi \lor \psi \text{ ssi } (\rho \vDash \varphi \text{ ou } \psi \vDash \rho )$ - $\rho \vDash \lnot \varphi \text{ ssi } (\rho \nvDash \varphi)$ - $\rho \vDash \: \textbf{X} \: \varphi \text{ ssi } (\rho^1 \vDash \varphi) \qquad \text{ avec } \rho^1 = s_1 \: s_2 \: s_3 \: \cdots$ - $\rho \vDash \varphi \: \textbf{U} \: \psi \text{ ssi } \exists \, i \geq 0 \,(\rho^i \vDash \psi \text{ et } (\forall \, 0 \leq j \lt i : \rho^j \vDash \varphi))$ $\vDash$ = statisfait ### Exemple ![Imgur](https://i.imgur.com/mJO897b.png) ![Imgur](https://i.imgur.com/a5grfSk.png) ![Imgur](https://i.imgur.com/60vS8ML.png) ![Imgur](https://i.imgur.com/Y6BH0jX.png) $$ \textbf{G}(\text{probleme}) \Rightarrow \textbf{F} \text{ alarme}\\ \textbf{G}(\text{request}) \Rightarrow \textbf{F} \text{ service}\\ \textbf{G}(\neg \text{ bug}) $$ - $\textbf{G F} \text{ acceuil}$ : infiniment souvent - $\textbf{F G} \text{ ok}$: un jour toujours ok - $\textbf{G F} \text{ request} \Rightarrow \textbf{G F} \text{ service}$ - $\textbf{G F}(a \land b) \Rightarrow \textbf{G F}\text{ a } \land \textbf{G F} \text{ b}$ - $\textbf{G F}\text{ a } \land \textbf{G F} \text{ b} \nRightarrow \textbf{G F}(a \land b)$ ### Exclusion mutuelle *Jamais* les 2 process us ne se trouve en meme temps en SC. $$ \neg \textbf{F} (SC_1 \land SC_2)\\ \textbf{G} (\neg SC_1 \lor \neg SC_2) $$ ### Absence de famine Si un processus demande l'acces à la SC, il y arrivera *un jour*. $$ \textbf{G} ( D_1 \Rightarrow \textbf{F} SC_1) \land \textbf{G} ( D_1 \Rightarrow \textbf{F} SC_2) $$ ### Propriété - **propriété de sureté**\ "une mauvaise chose n'arrive jamais"\ ex: l'exlusion mutuelle - **propriété de vivacité**\ "une bonne chose fini par arriver"\ ex: absence de famine - **propriété d'équité**\ exprime une forme d'équité sur une exécution\ ex: une éxécution où les 2 processus "avancent" infiniment souvent. ## Algorithme de Peterson (1981) ![Imgur](https://i.imgur.com/XKUWs8o.png) - Exlusion mutuelle\ $G(\neg p5 \lor \neg q5)$ - Absence de famine\ $G(p2 \Rightarrow \textbf{F }p5)$ ### Exlusion mutuelle Supposons que P~2~ rejoin P~1~ en SC\ on sais que on a D1 = D2 = True\ P~2~ à franchie q4 comme D2 == True alors on a turn == 2\ donc on est passé par p3\ Comment P1 a passé p4: 1. D2 == False?\ Donc depuis, P~2~ a fait D2 := True et turn := 1\ Et P2 ne peut franchir le await... 3. turn == 1 ?\ Mais alors si turn vaut toujours 1 tant que P~1~ est en SC alors P2 ne peut pas le rejoindre ### Absense d'interblocage interblocage si:\ $$ \neg (turn == 1 \lor \neg D2) \land \neg(turn == 2 \lor \neg D1)\\ (turn \neq 1 \land D2) \land (turn \neq 2 \land D1)\\ (turn = 2 \land D2 \land turn == 1 \land D1) \qquad \textbf{faux} $$ ### Absence de famine :::success L’algo. de Peterson garantit l'absence de famine sous hypothèse: - d'équité entre processus - en supposant que: - toute section critique termine - conduit à l'exécution du post-protocole. ::: Supposons P~1~ en famine.\ Alors on a toujours $D1=\top$\ Et $D2 =\top$ et $turn == 1$ ++inifiniment souvent++. (pour ne pas pouvoir passer le await)\ $D2 =\top \Rightarrow$ P~1~ est en *q3, q4, q5, q6* - de *q3* il irait à *q4* et on a $turn == 1$ **(donc P1 peut passer)** :x: - de *q4* il irait *q5* si - $turn == 2$ *(impossible car on a exécuté *q3*)* - $D1=\bot$ *(impossible $D1=\top$) toujours* - de *q5* il irait en q6 - de *q6* il irait donc $D2=\bot$, puis irais en *q1*, puis *q2* et *q3* ### Attente borné oui il y a attente borné. ### privilege On a pas besoin d'initialiser turn donc l'algo ne **donne aucun privilège**. ## Extention de l'algorithme de Peterson ## Filter Lock ### Peterson revu ![Imgur](https://i.imgur.com/YD76idH.png) ### Algorithme ![Imgur](https://i.imgur.com/kY5dqaT.png) Définition: - un processus a passé le niveau k lorsqu’il a dépassé le « await » (p5) pour l’itération j=k. \ (et si k=0: lorsqu’il a commencé son préprotocole). - $nb_{\geq k}$ est le nombre de processus ayant passé le niveau k. #### Propriété $$ \forall \: 0 \leq j \leq n - 1, nb_{\geq j} \leq n - j $$ - $j = 0$: oui $nb_{\geq 0} \leq n$ - $j \gt 0$: par hypothèse d’induction, on sait qu’il y a au plus $n - j + 1$ processus qui ont passé le niv. $j - 1$. Supposons que tous (donc $n - j + 1$) processus aient passé le niveau j.\ Soit *P* le dernier à avoir fait $victim[j]:=id_P$\ Tout autre *P'* (au delà du niveau j) a donc fait **avant**: - $level[id_{P'}]:= j$ et ensuite: - $victim[j] := id_{P'}$ ![Imgur](https://i.imgur.com/BAT8N1n.png) #### Corrolaire $$ nb_{\geq n - 1} \leq 1. $$ ### Exclusion mutuelle On a donc bien l'exclusion mutuelle. (grace au corraolaire) ### Absence de famine L’algo. Filter Lock garantit l'absence de famine sous hypothèse d'équité entre processus et en supp. que toute SC termine (et conduit à l’exéc. du post-protocole). #### proriété Tout proc. ayant atteint le niveau $j \geq 1$, arrivera au niveau $j + 1$ (ou en SC si $j = n - 1$). $j = n - 1$ oui, il y a bien absence de famine $j < n - 1$: Soit *P* ayant atteint le niveau *j* et supposons qu’il soit bloqué dans le **await** à ce niveau pour toujours... 1. Par h.i., les proc. des niveaux supérieurs accéderont à la CS... 2. Aucun proc du niveau j-1 ne pourra accéder au niveau j (sinon victim serait mis à jour et P serait débloqué !). Donc **victim est figée**. 3. Si P n’est pas le seul au niv. j, c’est le seul à être bloqué. Et après le succès des autres, il finira par passer (∀ ...) ! [suivant](hH2Gad18QOOHxIbJMKa81A)