• Aucun résultat trouvé

Démonstration d'absence d'interblocage externe

Dans le document Behavioural Contracts for Components (Page 136-139)

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). 

Dans le document Behavioural Contracts for Components (Page 136-139)