6.3 Propriété : absence d'interblocage externe
6.3.2 Démonstration d'absence d'interblocage externe
Nous devons montrer qu'il n'y a pas d'interblocage avec des ports non réentrants, dont nous rappelons la dénition :
Ext_deadlocknr(C) ,∃(ui)1..n∈ C tel que nonrentrant(u1) ∧ ∀k < n : uiSnrui+1∧ unSnru1
Preuve (Absence d'interblocage externe avec ports non réentrants). La démonstration se fait par induction structurelle sur les règles étendues du respect de contrat. Nous ne démontrerons pas la propriété d'absence d'interblocage externe que du point de vue des ports pairs ou réentrants (Pedf). En eet, comme
| A, la propriété Pedf, qui n'est pas concernée par l'extension de ce chapitre, est vériée par le théorème 2 page 87.
1. CREAT, REMVPORT, REMVREF, DEACT, OTHER Ces règles n'ajoutent pas de relation de dépendance. 2. BIND
Il y a éventuellement création d'une relation de dépendance. Deux cas se pré- sentent suivant la nature de v (le port en réception, qui est attaché en tant que partenaire) :
v est un port serveur non réentrant
Si v est actif, alors il n'y a pas de création de dépendance. (il y aura dépendance lors de l'application de la règle RECVx voir plus loin dans la démonstration). Si v est oisif, il y a création de la relation de dépendance u 999Knrv. Raisonnons
par l'absurde et supposons :
En particulier, u et v appartiennent à ce cycle. Nous choisissons u1 = v et
un= u. Nous avons bien uSnrv.
Avant l'attachement, nous avions donc la même suite (ui)1..n, mais telle que
¬(unSnru1).
Nous allons démontrer que (voir gure 6.5 page 112 pour avoir une représen- tation des suites) :
1. à l'assemblage, il existait une suite (vi)1..m indiquant que u et v seraient
partenaire ;
2. à l'assemblage, il existait une suite (wi)1..l indiquant que la suite (ui)1..n
se produirait ;
3. les deux suites sont telles que Prisque(v)est vraie à l'assemblage.
Ces trois points se démontrent de la manière suivante : 1. (suite (vi)1..m)
Il s'agit d'une application du lemme 5 page 113. Nous avons v1 =parent(u)
et vm=parent(v) = v. Cette suite a de plus les caractéristiques suivantes :
∀i, vi ↔ v♦ i+1 ∨ partenaire(vi, vi+1)
2. (suite (wi)1..l)
Cette suite est issue de la suite (ui)1..n, où les dépendances externes 999K
et 999Knr sont remplacées celles du lemme 5. Elle se construit donc de la
manière suivante : w1 = u1= v;
si wi = parent(uk) et uk uk+1 alors wi+1 = uk+1. Nous avons bien
sûr wi w i+1 déclaré à l'assemblage. Si uknruk+1 alors uk= wi =
parent(uk+1);
si wi =parent(uk) et uk 999Kuk+1 alors : d'après le lemme 5, ∃(u0j)1..p
tel que u0
1 = parent(uk), u0p = parent(uk+1) et u0j ↔ u♦ 0j+1 ∨ (u0j (
u0j+1) ∨ (u0j+1( u0j). Nous prenons alors wi+q tel que ∀q, 1 6 q < p :
wi+q = u0q+1. On remarquera que wi+p−1= u0p = uk+1.
La suite ainsi construite se termine par parent(un) : wl = parent(un) =
parent(u).
De plus, la dernière dépendance de la suite (wi)est . Ceci se démontre
comme suit :
Nous nous intéressons à la suite (ui), notamment à un= u, le futur client
du serveur v ; on remarquera que la première action de u est un envoi : u!σ. Nous avons un−1Snrun, ce qui se traduit par l'une des dépendances :
un−1 un
un−1 999Kun qui implique, sachant un!σ : (un( un−1)
un−1nrun qui implique : instance(un−1, un) donc ¬(un( ⊥)
un−1 999Knrun qui implique, entre autres : nonreentrant(un)
La seule relation de dépendance possible avant l'application de la règle BIND est donc un−1 un, donc wl−1 w l.
3. les deux suites (vi)et (wi)forment un cycle qui est le suivant :
v = w1 −→A ∗wl−1 w l=parent(u) =v1, . . . , vm
| {z }
= v (vi ↔ v♦ i+1 ∨ partenaire(vi, vi+1))
Soit Prisque(v)vraie, ce qui est contradictoire avec la dénition de l'assem-
blage sain. v est un port pair
Il y a création de la relation de dépendance v?a 999Ku!σ. Tout comme précé- demment, nous raisonnons par l'absurde. Soit
(ui)1..n tel que ∀i 6 n : uiSnrui+1 et ∃k : nonreentrant(uk)
Nous choisissons la suite de telle sorte que u1 = v et un = u. Nous prenons
aussi k tel que nonrentrant(uk). k > 1 car v est un port pair.
Nous avons uk−1 client de uk, car la seule relation de dépendance possible est
uk−1 999Knr uk. La dénition de cette relation donne uk−1!σ. Par conséquent :
uk−16= v et k > 2 ;
uk−2 uk−1 par un raisonnement similaire au cas précédent (c'est la seule
dépendance possible).
Comme précédemment, nous construisons deux suites (vi)1..m et (wi)1..l telles
que :
1. (suite (vi)1..m)
v1 = uk−1client de uk, et vm= ukserveur non réentrant. Le lemme 5 page 113
nous assure l'existence de cette suite, avec :
∀i, vi ↔ v♦ i+1 ∨ partenaire(vi, vi+1)
2. (suite (wi)1..l)
Nous prenons w1= uk et wl= uk−1. La suite se construit à partir de (ui)
selon le même principe que précédemment, mais auquel nous ajoutons : Si wi = parent(un) = u : le port u s'attache la référence v, donc par le
lemme 5 nous avons la suite (wp)i..i+q telle que :
wi+q= v = u1 et wi+j ↔ w♦ i+j+1 ∨ partenaire(wi+j, wi+j+1)
La n du raisonnement est similaire au cas précédent. Nous avons l'existence, à l'assemblage, de la suite (avec uk port serveur non réentrant) :
uk =w1 −→A ∗wl−1 w l
| {z }
=parent(uk−1) =v1, . . . , vm
| {z }
= uk
u, v ∈ (wi)1..l (vi ↔ v♦ i+1 ∨ partenaire(vi, vi+1))
Ce qui contredit ¬Pcycle(uk) (avec uk serveur non réentrant).
v est un port serveur
Il n'y a pas d'interblocage, par dénition du comportement d'un port serveur. 3. SEND
Soit u le port eectuant l'envoi d'un message vers le port v. Nous avons alors création d'une dépendance entre u et v (u 999Kv ou v 999Ku). Nous raisonnons comme
pour la règle BIND, en distinguant si v est non réentrant ou pas. La construction des suites (vi) et (wi) est similaire.
En fait, la création d'une dépendance entre les ports u et v nous donne la même démonstration que pour BIND. Si nous avons un changement de dépendance (u 999Kv modiée en v 999Ku), la démonstration peut tirer parti du fait que ces deux dépen- dances sont, à l'assemblage, modélisées de la même manière (par des dépendances bidirectionnelles ↔♦ et partenaire(·, ·))
4. RECV,RECV-UN,RECV*,RECVx
Les démonstrations pour les règles RECV, RECV-UN et RECV* sont soit évi- dentes, soit similaires aux précédentes.
Pour la règle RECVx, nous avons un port serveur non réentrant, u, qui reçoit le message provenant d'un client v. Le port u crée un port w qui traitera avec le client, et se suspend pendant toute la durée du traitement (soit : tant que w n'est pas supprimé). Nous avons création des dépendances :
u?i nrw!a et u = parent(w) v 999Knrw
où il est évident qu'il n'y a pas de cycles. La dépendance u nr w sera supprimée
avec la règle REINIT. 5. REINIT
Le port u est supprimé. Le port serveur non réentrant s devient actif en réception, et la dépendance s nru est supprimée.
6. SUSPEND
Démonstration similaires aux précédentes. On remarquera que si u v est créée suite à cette dépendance, alors à l'assemblage nous avons parent(u) parent(v).