systemes-concurrents/TP1/TP1.md
Raphaël LACROIX f570469914 los fichios
2023-03-31 14:13:28 +02:00

140 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# TP1: problème du choix distant
Familiarisez vous avec loutil UPPAAL.
Le point fort dUppaal cest le temps; ici on ne lutilise que pour simuler/vérifier des _produits dautomates asynchrone_ (vous verrez le temps lan prochain).
Ce TP est facile; il faut avoir commencé le TP2 avant la fin de la première séance.
## Étudiez les différents onglets de léditeur graphiques
* `editor` qui permet de modifier les _déclarations_; les _templates_ de processus; et la _déclaration du système_
* `simulator` affiche le _système instancié_ et permet dexplorer les états du système
* `verifier` le model-checker intégré à UPPAAL
## Il y a trois types de fichiers (extensions)
* `.xta` format textuel pour définir des _process_ ; déclarer de nouveaux types et constantes; et déclarer le _system_. Vous pouvez écrire directement dans ce format.
* `.ugi` format de déclaration des propriétés graphiques (couleur et emplacement des états, … ). Utilisé en interne par loutil.
* `.q` format _query_, pour déclarer de nouvelles propriétés
* il y a aussi possibilité dutiliser un langage `XML`
## Synchronisation en UPPAAL
Les transitions dun _template_/_process_ UPPAAL peuvent avoir quatre types de propriétés
<figure>
<img src="docs/1586956621847.png" alt="Edit edge in UPPAAL" />
<figcaption>Fig. 1: edit edge in UPPAAL</figcaption>
</figure>
* `select` choix “non-déterministe” dune valeur
* `guard` (condition) sur les données
* `sync` synchronisation sur un canal
* `update` mis à jour des données
Une transition sans `sync` est dite interne. Elle peut se déclencher indépendamment des autres instances de process.
Il y a deux _polarités_ sur les canaux `!` (émettre) et `?` recevoir. On peut émettre sur un canal `a` (noté `a!`) ou recevoir (noté `a?`).
> __Convention:__ on dit que le message transite de `a!` vers `a?`
&nbsp;
> __Convention:__ on exécute toujours lupdate de lémetteur avant celui du récepteur (utile seulement si on a des données)
## Espace détat dun système
On peut explorer les états du système en construisant un graphe qui énumère toutes les transitions/synchronisations possibles depuis un état; en partant de __létat initial__.
Cest ce quon appelle la __sémantique__ du système.
Le _model-checking_, cest utilisé des formules de logique temporelle pour “poser des questions” sur le graphe, par exemple pour découvrir la présence de _deadlock_ (états sans transitions sortantes); savoir si le système est _vivant_ et/ou ré-initialisable; …
<figure>
<img src="docs/state_space.png" alt="State space for the first example" />
<figcaption>Fig. 2: espace d'état pour l'exemple de la question 1</figcaption>
</figure>
## Rappel sur les formules de logique temporelle en UPPAAL
Il existe des formules qui parlent de “létat courant” du système: conjonction, notée `and`; disjonction, notée `or`; et négation, notée `not`, de _propriétés atomiques_.
* linstance `gauche` est dans létat `a` sécrit `gauche.a`
* la valeur de la variable `cpt` de linstance `FifoRI` est inférieure à 2 sécrit `FifoRI.cpt <=2`
Il y a des modalités
* deux _modifiers_ de contexte: `A` (All, ∀) et `E` (Exists, ∃)
* deux modalités temporelles: `[]` (partout, tout le temps) et `<>` (éventuellement)
* donnent 4 possibilités (`A[]`, `E[]`, `A<>`, `E<>`) + une formule spéciale (_leadsto_) `.. > ..`
Il est impossible dimbriquer (dutiliser) une formule à lintérieur dune autre: `E<> gauche.a` est correct, mais pas `(E<> gauche.a) > gauche.b`
Les formules parlent et quantifient des __chemin maximaux__ dans le __graphe/espace détat__ du système.
| | `[]` | `<>` |
|:----:|:--------------------------------:|:----------------:|
| `A` | __always__ | __inevitably__ |
| `E` | __potentially__<br />__always__ | __reachable__ |
> __Exemple de formules classiques:__
>
> * `A[] not deadlock` (invariant) toujours létat nest pas un deadlock
## Données et expressions en UPPAAL
On peut définir des variables, en plus des canaux, en utilisant une syntaxe “à la C” avec différents types de données possible
* `int[0,3] x;` déclare une variable `x` qui peut prendre comme valeur 0, 1, 2 ou 3
* `int y;` domaine par défaut
* `int tab[n];` tableau de `n` valeurs, de `tab[0]` à `tab[n-1]`
On peut aussi définir des constantes `const bool KO = false;`
Ces valeurs peuvent être utilisées pour instancier des paramètres, et donc pouvoir définir deux instances dun même _template_ qui ont des comportements différents.
<figure>
<img src="docs/1586962032896.png" />
<figcaption>Fig. 3: exemple d'utilisation de paramètres et déclarations locales dans un template</figcaption>
</figure>
```uppaal
gauche = Agent(0);
droit = Agent(1);
system gauche, droit;
```
## Format textuel
On peut également écrire un modèle UPPAAL directement dans le format XTA (textuel)
```uppaal
int[0,1] vp;
chan s, a, b ;
process Agent(int kind) {
int lkind := kind;
state
idle,
choice,
before_a,
before_b;
init idle;
trans
before_b -> idle { guard lkind==1; sync b!; },
before_a -> idle { guard lkind==1; sync a?; assign lkind := 1 - lkind; },
idle -> choice { guard lkind==1; sync s?; },
idle -> choice { select p : int[0,1]; guard lkind==0; sync s!; assign vp := p; },
choice -> before_a { guard (vp == 1); },
choice -> before_b { guard vp == 0; },
before_a -> idle { guard lkind==0; sync a!; assign lkind := 1 - lkind; },
before_b -> idle { guard lkind==0; sync b?; };
}
gauche = Agent(0);
droit = Agent(1);
system gauche, droit;
```