Les systèmes réactifs sont des systèmes informatiques dont le rôle est de réagir continûment à leur environnement, à une vitesse imposée par celui-ci. Les langages synchrones ont été inventés pour faciliter la programmation des systèmes réactifs. Les principaux langages synchrones sont Esterel, Lustre, Argos et Signal.
Beaucoup de systèmes réactifs doivent être réparti sur plusieurs sites de calcul, pour des raisons diverses : amélioration des performances, localisation des capteurs et actionneurs, tolérance aux pannes ... L'outil screp répartit automatiquement les programmes synchrones, en fonction de directives fournies par l'utilisateur.
Screp est fondé sur la méthode de répartition du code objet. Cela consiste à compiler le programme source en un programme objet centralisé, et ensuite à répartir ce programme centralisé en autant de programmes qu'il y a de sites de calcul, de telle sorte que chaque site n'effectue que les calculs qui lui sont propres. Aussi screp utilise le format interne SC du compilateur Esterel. Sans entrer dans les détails, un programme SC est un circuit booléen synchrone couplé à une mémoire finie pour les calculs. Screp prend en entrée :
foo.sc
, etfoo.rep
.Les directives de répartition consistent en une partition de l'ensemble des entrées/sorties du programme en autant de sous-ensembles qu'il y a de sites de calcul. Ceci permet d'attribuer un site de calcul unique à chaque entrée/sortie. Concrètement, le fichier des directives de répartition contient une table de sites, avec la même syntaxe que les autres tables SC :
site_part : /* empty */ | 'sites:' integer site_table 'end:' ; site_table : site_table site_definition ; site_definition : integer ':' identifier '(' signal_list ')' ;
Ici, signal_list
est une liste de noms
d'entrées/sorties du programme SC.
Quelques mots sur les signaux de type local
et
exception
. Ils proviennent de programmes Esterel et expriment
des synchronisations entre des modules en parallèle, des constructions
trap/exit
... Cependant, au niveau du code
SC, toutes ces synchronisations sont exprimées directement pas
la structure de contrôle de l'automate : les signaux de type
local
et exception
sont traduits en
transitions par le compilateur Esterel. Par
conséquent, il ne devrait jamais y avoir d'action output
ou present
impliquant des signaux de type
local
ou exception
. C'est pourquoi
screp décide arbitrairement de localiser tous les signaux de
type local
ou exception
sur le site
0. Notons que comme ces signaux n'ont pas de nom, il ne peuvent
apparaître dans aucune liste signal_list
.
Les communications ont lieu par l'intermédiaire d'un réseau complet de files d'attente FIFO. Deux primitives de communication sont utilisées :
put(s,v,x)
écrit la valeur
x
dans la file dirigée vers le processeur s
et relative à la variable v
; elle est non
bloquante ;v:=get(v,s)
extrait la valeur de tête
de la file provenant du processeur s
et relative à la
variable v
et l'affecte à la variable
v
; elle est bloquante quand la file est vide.Screp produit un programme SC pour chaque site de calcul spécifié dans le fichier de directives de répartition. Chaque programme SC contient les instructions de communication nécessaires aux références aux variables non locales. Par exemple, la commande :
screp foo.sc
produit deux fichiers foo.2.0.sc
et
foo.2.1.sc
si le fichier foo.rep
spécifie
une répartition vers deux sites de calcul. Chaque fichier produit par
screp peut ensuite être compilé par le compilateur Esterel.
Les options sont les suivantes :
-h | Imprime le message d'aide. | ||
-version | Imprime le numéro de version de screp. | ||
-info | Imprime toutes les informations à propos de screp. |
L'outil screp est disponible pour les architectures Unix :
La distribution de screp contient quatre répertoires :
bin
contient l'exécutable
screp
.man
contient le manuel
utilisateur.src
contient les fichiers C
distinet.c
et trace.h
:distinet.c
contient les procédures de création de
l'environnement d'exécution des programmes SC répartis
(procédures pour connecter les files d'attente FIFO ainsi que les
procédures put
et get
pour échanger les
données à travers les files d'attente).trace.h
utilisé par distinet.c
pour
tracer les connections.demo
contient l'exemple complet
prog
.Bonne répartition avec screp !