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

3.5 KiB
Raw Blame History

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.

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 fifocontient 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 getpour 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.

Le composant FIFO
Fig. 1: Le composant FIFO

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.

Buffer circulaire
Fig. 2: Buffer circulaire

Le système “choix asynchrone”

Le système global est constitué de deux instances de fifoet deux instances du composant site. Un site peut émettre (sur le canal out en utilisant la variable vout ) ou recevoir (sur in).

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.

Fig. 3: instantiation du système choixasync