• Aucun résultat trouvé

2 Le SDL de base

2.4 Structure du système

2.4.4 Processus

Une définition de processus définit un grand ensemble arbitraire d'instances de processus.

Grammaire abstraite

Process-definition :: Process-name

Number-of-instances

Process-formal-parameter *

Procedure-definition-set

Signal-definition-set

Data-type-definition

Syntype-definition-set

Variable-definition-set View-definition-set Timer-definition-set

Process-graph | Service-decomposition Number-of-instances :: Intg [Intg]

Process-name = Name

Process-graph :: Process-start-node

State-node-set

Process-formal-parameter :: Variable-name

Sort-reference-identifier

Service-decomposition :: Service-definition-set

Signal-route-definition-set

Signal-route-to-route-connection-set

Si une définition Process-definition a une décomposition Service-decomposition, il ne doit pas exister de Timer-definitions. La décomposition Service-decomposition doit contenir au moins une Service-definition.

Grammaire textuelle concrète

<process definition> ::=

process {<process name> | <process identifier> } [<number of process instances>] <end>

[<formal parameters> <end>] [<valid input signal set>]

{ <entity in process>

| <signal route to route connection> }*

[ <process body> ]

endprocess [ <process name> | <process identifier> ] <end>

<entity in process> ::=

<signal definition>

| <signal list definition>

| <textual procedure reference>

| <procedure definition>

| <remote procedure definition>

| <imported procedure specification>

| <macro definition>

| <remote variable definition>

| <data definition>

| <variable definition>

| <view definition>

| <select definition>

| <imported variable specification>

| <timer definition>

| <signal route definition>

| <service definition>

| <textual service reference>

| <textual typebased service definition>

| <service type definition>

| <textual service type reference>

<textual procedure reference> ::=

<procedure preamble>

procedure <procedure name> referenced <end>

<textual service reference> ::=

service <service name> referenced <end>

<valid input signal set> ::=

signalset [<signal list>] <end>

<process body> ::=

<start> {<state> | <free action>} *

<formal parameters> ::=

fpar <parameters of sort> {, <parameters of sort>}*

<parameters of sort> ::=

<variable name> {, <variable name>}* <sort>

<number of process instances> ::=

([<initial number>][,[<maximum number>]])

<initial number> ::=

<Natural simple expression>

<maximum number> ::=

<Natural simple expression>

Une définition <service definition>, une référence <textual service reference> ou une définition <textual typebased service definition> peut être présente uniquement si <process body> est omis.

Une définition <process definition> ne peut contenir des définitions <signal route definition> que si la définition <block definition> ou <textual typebased block definition> qui l'englobe contient des définitions <signal route definition>.

Le nombre initial d'instances et le nombre maximal d'instances contenus dans le nombre Number-of-instances sont tirés du nombre <number of process instances>. Si le nombre <initial number> est omis, <initial number> est 1. Si le nombre

<maximum number> est omis, <maximum number> n'est pas limité.

Le nombre <number of process instances> utilisé dans la dérivation est le suivant:

a) s'il n'y a pas de <textual process reference> pour le processus, le nombre <number of process instances>

dans la définition <process definition> ou dans la définition <textual typebased process definition> est utilisé. S'il ne contient pas un nombre <number of process instances>, on utilise le nombre <number of process instances> où le nombre <initial number > et le nombre <maximum number> sont omis;

b) si à la fois le nombre <number of process instances> dans la définition <process definition> et le nombre

<number of process instances> dans une référence <textual process reference> sont omis, on utilise le nombre <number of process instances> où sont omis à la fois le nombre <initial number> et le nombre

<maximum number>;

c) si soit le nombre <number of process instances> dans la définition <process definition> soit le nombre

<number of process instances> dans une référence <textual process reference> est omis, le nombre

<number of process instances> est celui qui est présent;

d) si à la fois le nombre <number of process instances> dans la définition <process definition> et le nombre

<number of process instances> dans une référence <textual process reference> sont spécifiés, les deux nombres <number of process instances> doivent être égaux lexicalement et ce nombre <number of process instances> est utilisé.

Une relation analogue s'applique au nombre <number of process instances> spécifié dans le diagramme <process diagram> et dans la référence <graphical process reference> définis ci-dessous.

Le nombre <initial number> d'instances doit être inférieur ou égal au nombre <maximum number> et celui-ci doit être supérieur à zéro.

L'utilisation de l'ensemble <valid input signal set> est précisée en 2.5.2, modèle.

Un exemple de définition <process definition> est donné à la Figure 2.10.9.

Grammaire graphique concrète

<process diagram> ::=

<frame symbol>

contains {<process heading>

{ {<process text area>}*

{<macro diagram>}*

{<type in process area>}*

{<process graph area> | <service interaction area> } }set } [is associated with {<signal route identifiers>}*]

L'identificateur <signal route identifier> identifie le trajet externe d'un signal relié à un trajet de signal dans le diagramme <process diagram>. Il est placé à l'extérieur du symbole <frame symbol> à proximité de l'extrémité du trajet du signal au symbole <frame symbol>.

<process text area> ::=

<text symbol> contains {

[<valid input signal set>]

{<signal definition>

| <signal list definition>

| <variable definition>

| <view definition>

| <imported variable specification>

| <imported procedure specification>

| <remote procedure definition>

| <remote variable definition>

| <data definition>

| <macro definition>

| <timer definition>

| <select definition> }* }

<process heading> ::=

process {<process name> | <process identifier>}

[<number of process instances> [<end>]]

[<formal parameters>]

<process graph area> ::=

<start area> { <state area> | <in-connector area> }*

<service interaction area> ::=

{ <service area>

| <signal route definition area> }+

<service area> ::=

<graphical service reference>

| <service diagram>

| <graphical typebased service definition>

| <existing typebased service definition>

<graphical service reference> ::=

<service symbol> contains <service name>

<service symbol> ::=

Un exemple de diagramme de processus est donné à la Figure 2.10.10.

Sémantique

La suite de ce paragraphe s'applique lorsque la définition Process-definition contient un graphe Process-graph. La sémantique supplémentaire concernant le cas où la définition Process-definition contient des définitions Service-definitions est traitée en 2.4.5.

Une définition de processus définit un ensemble de processus. Plusieurs instances du même processus peuvent exister au même moment et s'exécuter de manière asynchrone et en parallèle entre elles et avec des instances d'autres ensembles de processus dans le système.

Dans le nombre Number-of-instances, la première valeur représente le nombre d'instances du processus qui existe à la création du système, la deuxième valeur représente le nombre maximal d'instances simultanées du type de processus.

Une instance de processus est une machine à états finis étendue communicante qui assure un certain nombre d'actions, appelées transitions, suite à la réception d'un signal donné, chaque fois qu'elle se trouve dans un certain état. La réalisation de la transition aboutit à l'attente du processus dans un autre état, qui n'est pas nécessairement différent de l'état d'origine.

Le concept de machine à états finis a été étendu pour couvrir les aspects suivants:

a) variables et branchement: l'état qui résulte après une transition, outre le signal qui a été à l'origine de la transition, peut être affecté par des décisions prises concernant les variables connues du processus;

b) transition spontanée: il est possible d'activer une transition de manière spontanée sans qu'aucun signal n'ait été reçu. L'activation est non déterministe et, par conséquent, elle rend instable l'état auquel elle est attachée;

c) sauvegarde: la construction de sauvegarde permet de spécifier pour le traitement des signaux un ordre différent de leur ordre d'arrivée dans la file.

Lorsqu'un système est créé, les processus initiaux sont créés dans un ordre arbitraire. La communication des signaux entre les processus ne commence que lorsque tous les processus initiaux ont été créés. Les paramètres formels de ces processus initiaux n'ont pas de valeurs associées, c'est-à-dire qu'ils sont initialisés avec une valeur non définie.

Les instances de processus existent à partir du moment où un système est créé ou peuvent être créées par une des actions de demande de création qui lance les processus à interpréter; leur interprétation commence lorsque l'action de départ est interprétée; des actions d'arrêt peuvent arrêter leur existence.

Les signaux reçus par les instances de processus sont appelés signaux d'entrée, et les signaux envoyés par les instances de processus sont appelés signaux de sortie.

Les signaux peuvent être traités par une instance de processus seulement lorsque celle-ci se trouve dans un certain état.

L'ensemble complet de signaux d'entrée valides est l'union de l'ensemble des signaux se trouvant dans tous les trajets des signaux conduisant à l'ensemble des instances désigné par la définition du processus, de l'ensemble <valid input signal set>, des signaux d'entrée implicites introduits par les concepts supplémentaires des paragraphes 4.10 - 4.14 et des signaux de temporisation.

Un accès d'entrée unique est associé à chaque instance de processus. Lorsqu'un signal d'entrée parvient au processus, il est appliqué à l'accès d'entrée de l'instance de processus.

Le processus peut être soit mis en attente, en occupant un état, soit en activité, en effectuant une transition. Pour chaque état, il existe un ensemble de signaux de mise en réserve (voir également 2.6.5). Dans le cas d'attente dans un état, le premier signal entrant dont l'identificateur ne figure pas dans l'ensemble des signaux de sauvegarde est extrait de la file d'attente, et traité par le processus. Toute transition peut également être lancée en tant que transition spontanée indépendamment de la présence de tout signal dans la file.

L'accès d'entrée peut retenir un nombre quelconque de signaux, de sorte que plusieurs signaux entrants sont mis dans une file d'attente pour le processus. L'ensemble des signaux retenus est ordonné dans la file d'attente, selon l'ordre d'arrivée. Si deux ou plusieurs signaux arrivent simultanément, ils sont ordonnés arbitrairement.

Lorsqu'un processus est créé, on lui attribue un accès d'entrée vide, et il y a alors création de variables locales.

Les paramètres formels sont des variables qui sont créées soit lorsque le système est créé (mais aucun paramètre réel ne lui est transmis et par conséquent ces paramètres sont non définis), soit lorsque l'instance de processus est dynamiquement créée.

Pour toutes les instances de processus, on peut utiliser quatre expressions produisant une valeur de PId (voir D.10): self, parent, offspring et sender. Elles donnent un résultat pour:

a) l'instance de processus (self);

b) l'instance du processus créateur (parent);

c) l'instance de processus la plus récente créée par l'instance du processus (offspring);

d) l'instance de processus en provenance de laquelle le dernier signal entrant a été utilisé (sender) (voir également 2.6.4).

Ces expressions sont expliquées dans le détail en 5.4.4.3.

self, parent, offspring et sender peuvent être utilisés dans des expressions à l'intérieur des instances de processus.

Pour toutes les instances de processus qui se trouvent présentes au moment de l'initialisation du système, l'expression prédéfinie parent présente toujours la valeur Null.

Pour toutes les instances de processus nouvellement créées, les expressions prédéfinies sender et offspring ont la valeur Null.