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

95 lines
3.5 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.

# TP2: problème du choix distant en asynchrone
Dans la séance précédente vous avez vu comment créer de nouveaux _templates_ (de processus); déclarer des variables; utiliser les _gardes_ et les _updates_ (mises à jour) dans les transitions pour simuler le passage de valeurs dans les communications.
Dans cette nouvelle séance, vous allez étudier plus profondément la notion _dinstanciation_ de système. Lobjectif est de modéliser le comportement dun système communicants au-dessus dun réseau asynchrone, à capacité bornée, dans lequel les messages ne peuvent pas se dépasser (FIFO).
## Le process Fifo
le process `fifo` modélise le comportement dun canal de communication FIFO à capacité (`cap`) finie.
```uppaal
process fifo(const int cap, chan &get, chan &put, int &vget, int &vput){
int cpt := 0;
int buf[cap];
int ixP := 0;
int ixG := 0;
state service, erreur;
init service;
trans
service -> service{
guard cpt > 0;
sync get!;
assign vget:= buf[ixG],
cpt:= cpt - 1, ixG:= (ixG == (cap - 1))?0:(ixG + 1);
},
service -> service{
guard cpt < cap;
sync put?;
assign buf[ixP]:= vput, cpt:= cpt + 1,
ixP:= (ixP == (cap - 1))?0:(ixP + 1);
};
}
```
Une instance de `fifo`contient un buffer (`buf`) de capacité `cap` , un compteur du nombre de message contenu dans `buf` (la variable `cpt`) et deux canaux en paramètres qui définissent les _services_ du composant: `put` pour ajouter un message et `get`pour récupérer le message le plus ancien. Chacun de ces services est associé à une variable, `vput` et `vget`, qui sert à communiquer une valeur lors dune synchronisation.
<figure>
<img src="docs/fifo.png" alt="Le composant FIFO" />
<figcaption>Fig. 1: Le composant FIFO</figcaption>
</figure>
La fifo se comporte comme un _buffer circulaire_; on écrit à la position `ixP` et on lit à la position `ixG`. On nefface jamais les messages écrit mais on peut réécrire dessus.
<figure>
<img src="docs/uppaal_buffer_circulaire.jpg" alt="Buffer circulaire" />
<figcaption>Fig. 2: Buffer circulaire</figcaption>
</figure>
## Le système “choix asynchrone”
Le système global est constitué de deux instances de `fifo`et deux instances du composant `site`. Un site peut émettre (sur le canal `out` en utilisant la variable `vout` ) ou recevoir (sur `in`).
```uppaal
chan LRGET, LRPUT;
int LRVG, LRVP;
chan RLGET, RLPUT;
int RLVG, RLVP;
process site(chan &in, chan &out, int &vin, int &vout){ ... }
process fifo(const int cap, chan &get, chan &put, int &vget, int &vput){ ... }
FifoLR := fifo(4,LRGET,LRPUT,LRVG,LRVP);
FifoRL := fifo(4,RLGET,RLPUT,RLVG,RLVP);
gauche := site(RLGET,LRPUT,RLVG,LRVP);
droit := site(LRGET,RLPUT,LRVG,RLVP);
system gauche, FifoLR, FifoRL, droit;
```
En suivant les déclarations, on voit que le canal (paramètre) `out` de linstance `gauche` de `site` est `LRPUT`, qui est aussi le canal `put` de linstance `FifoLR` de `fifo`. Donc le site gauche émet ses messages dans FifoLR, et ces messages arriveront éventuellement sur un `in?` du site droit.
On peut illustrer ces relations à laide dun schéma comme celui en Fig. 3.
<figure>
<img src="docs/uppaal_instantiation.jpg" />
<figcaption>Fig. 3: instantiation du système choixasync</figcaption>
</figure>