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 ocrep répartit automatiquement les programmes synchrones, en fonction de directives fournies par l'utilisateur.
Ocrep 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 ocrep utilise le format interne OC commun aux langages synchrones. En effet, les compilateurs Lustre, Esterel et Argos produisent du code OC. Sans entrer dans les détails, un programme OC est un automate d'états fini couplé à une mémoire finie pour les calculs. Ocrep prend en entrée :
foo.oc
, 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. Des directives plus fines peuvent être fournies en attribuant un site de calcul à des variables locales. Concrètement, le fichier des directives de répartition contient une table de sites, avec globalement la même syntaxe que les autres tables OC :
site_part : /* empty */ | 'sites:' number_of_sites site_table 'end:' ; number_of_sites : integer ; site_table : site_table site_definition ; site_definition : site_num ':' identifier '(' signal_list ')' | site_num ':' identifier '(' signal_list ')' '(' variable_list ')' ; site_num : integer ;
Ici, signal_list
est une liste de noms
d'entrées/sorties du programme OC. Plus de directives peuvent
être données en ajoutant à un site une liste optionnelle
variable_list
d'index de variables. Toutefois, dans la
mesure où OC est un format interne, il est difficile de relier
les variables OC au programme source. De plus, il ne doit pas y
avoir de conflits entre signal_list
et
variable_list
. En particulier, il est interdit
d'attribuer un site à un signal d'entrée et d'attribuer un autre site
à la variable véhiculée par ce signal. En cas de conflit, une erreur
sera signalée et ocrep s'arrêtera.
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 OC, 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
ocrep 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,x)
écrit la valeur x
dans la file dirigée vers le processeur s
; elle est
non bloquante ;x:=get(s)
extrait la valeur de tête
de la file provenant du processeur s
et l'affecte à la
variable x
; elle est bloquante quand la file est
vide.Ocrep produit un programme OC pour chaque site de calcul spécifié dans le fichier de directives de répartition. Chaque programme OC contient les instructions de communication nécessaires aux références aux variables non locales. Par exemple, la commande :
ocrep foo.oc
produit deux fichiers foo.2.0.oc
et
foo.2.1.oc
si le fichier foo.rep
spécifie
une répartition vers deux sites de calcul. Chaque fichier produit par
ocrep peut ensuite être compilé, par exemple par le compilateur
Esterel.
Les options sont les suivantes :
-h | Imprime le message d'aide. | ||
-version | Imprime le numéro de version d'ocrep. | ||
-info | Imprime toutes les informations à propos d'ocrep. | ||
-sb | Synchronise faiblement les programmes OC (seulement ceux qui communiquent). | ||
-st | Synchronise faiblement les programmes OC (tous). | ||
-e | Élimine localement les puts
redondants. | ||
-E | Élimine globalement les puts
redondants. | ||
-a | Insère les puts aussi
tôt que possible. | ||
-r | Réduit les branchements dont les deux branches ont des comportement équivalents. |
Ocrep est disponible pour les architectures Unix :<\p>
Cette distribution d'ocrep contient quatre répertoires :
bin
contient l'exécutable
ocrep
.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 OC
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
est utilisé par
distinet.c
pour tracer les connexions.demo
contient trois exemples
complets : Filter
, Lightbulb
et
Twocopies
.L'utilitaire poc qui permet de pretty-printer les programmes OC est disponible ici.
Bonne répartition avec ocrep !
Ce travail a été partiellement subventionné par la société Merlin-Gerin (aujourd'hui partie du groupe Schneider Electric), par l'Inria et par l'Université de Californie à Berkeley.