• Aucun résultat trouvé

6.3 Composants protocolaires de la couche neutre

6.3.2 Mécanismes de transport

Les mécanismes de transport sont les services offerts par le système d’exploi- tation qui permettent de transférer des messages d’un nœud à un autre d’un système réparti. Pour permettre l’utilisation de divers types de mécanismes de transport, en fonction des possibilités du système et des besoins de l’application, nous proposons une interface uniforme qui encapsule ces services, et permet à toute personnalité protocolaire de les utiliser.

Cette interface correspond à la fonction de transport que nous avons identi- fiée dans la section 4.5.2.

Elle est constituée de trois classes abstraites qui doivent être spécialisées pour chaque type de mécanisme de transport. Ces classes représentent respectivement les points d’accès et les points de terminaison du service de transport, ainsi que les sources d’événements asynchrones associées.

La séparation de ces trois classes a pour objectif d’exposer les différents aspects du sous-système de transport :

– synchronisation entre les événements extérieurs et l’intergiciel ; – établissement d’une relation de transport entre deux intergiciels ; – communication de données.

Elle permet ainsi l’intégration dans l’architecture de sous-systèmes de transport réalisant ces trois aspects de manières différentes.

Sources d’événements asynchrones

Les entités du service de transport (points d’accès et points de terminaison) doivent pouvoir déclencher des comportements de l’intergiciel en réponse à des événements extérieurs, provenant de nœuds distants. Elles sont donc vues par l’intergiciel comme des sources d’événements asynchrones.

Afin d’intégrer le traitement de ces événements dans l’ordonnancement des activités de l’intergiciel, nous associons chaque point d’accès et chaque point de terminaison à un objet le représentant en tant que source potentielle de tels

160 Réalisation d’une couche neutre de répartition événements, et permettant à l’intergiciel d’être informé des occurrences de ces événements. ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ✄ ☎ ✆ ✝ ✞ ✟ ✠ ✡ ☛ Ordonnanceur ☞ ☞ ☞ ☞ ✌ ✌ ✌ ✌ Attente sur S2 Source S3 Source S2 Source S1

Attente sur S1 Attente sur S3

Fig. 6.9 – Sources d’événements asynchrones

Une source d’événement asynchrone est conceptuellement une entité offrant une primitive permettant d’attendre qu’un événement se produise (figure 6.9). Cependant, pour des raisons d’efficacité de mise en œuvre, il est intéressant de permettre à une tâche de se mettre en attente d’événements non sur une seule source d’événements asynchrones, mais sur une source quelconque parmi un ensemble de sources de même nature.

Nous introduisons donc une deuxième catégorie d’objets : les groupes de surveillance de sources d’événements asynchrones. Ces objets sont ceux auxquels l’intergiciel fait appel lorsqu’il souhaite attendre des événements asynchrones ou déterminer si des événements se sont produits, comme illustré par la figure 6.10. Ainsi, lorsque le système d’exploitation permet de prendre connaissance d’événements asynchrones sur plusieurs entités de communication simultané- ment, il est possible de tirer parti de cette possibilité en définissant un seul groupe pour l’ensemble des sources.

Points d’accès du service de transport

Les points d’accès correspondent aux entités du système qui possèdent une adresse au sein d’un réseau de communication, et sont susceptibles de recevoir des connexions de nœuds distants ; les points de terminaison correspondent aux entités qui représentent une communication établie, et permettent l’échange de données. Dans le cas des modes de communication non connectés (par exemple le service de datagrammes UDP [85]), points d’accès et points de terminaison peuvent être deux vues différentes de la même entité du système d’exploitation. La primitive essentielle des points d’accès est l’acceptation d’une nouvelle relation avec un intergiciel distant. Le point d’accès crée alors un nouveau point de terminaison, qui est ensuite intégré au sein d’un objet de liaison.

6.3 Composants protocolaires de la couche neutre 161 ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ ✁ Groupe de surveillance ✂ ✂✄ ☎ ✆ Ordonnanceur✝✞ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✟ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✠ ✡ ✡ ✡ ✡☛ ☛ ☞ ✌ Attente sur S1+S2+S3 Source S3 Source S2 Source S1

Fig.6.10 – Groupes de surveillance de sources d’événements asynchrones Points de terminaison du service de transport

Les points de terminaison du service de transport sont les entités réalisant la communication de données proprement dite, à l’intérieur de la fonction de transport. Un point de terminaison existe, dans l’intergiciel, pour chaque rela- tion établie avec un intergiciel distant.

Les points de terminaison participent aux objets de liaison. Ils utilisent donc le patron Component ; leur interface est un sous-ensemble de celle des filtres, décrite plus en détail dans la section 6.3.3.

Les opérations primitives offertes par un point de terminaison consistent à : – émettre le contenu d’un tampon vers l’intergiciel tiers auquel ce point de

terminaison est associé ;

– recevoir des données provenant de cet intergiciel tiers.

La première est appelée par les couches supérieures de l’objet de liaison lorsque des données doivent être émises sur le réseau de communication.

La seconde est appelée par l’ordonnanceur lorsque la source d’événements asynchrones associée signale la présence de données reçues. Le point de terminai- son copie alors ces données dans un tampon, puis signale aux autres composants de l’objet de liaison dont il fait partie qu’ils doivent les traiter.

Un exemple de transport : les sockets TCP

Nous avons réalisé une mise en œuvre concrète du sous-système de trans- port basée sur des connexions TCP. Cette mise en œuvre est portable : elle fonctionne dans tous les environnements compatibles avec GNAT, car elle utilise le paquetage Ada GNAT.Sockets [79], qui encapsule les différentes variantes de l’interface de programmation sockets [112].

Les sources d’événements asynchrones associées utilisent un moniteur basé sur l’appel système select : toutes les connexions basées sur les sockets peuvent

162 Réalisation d’une couche neutre de répartition être surveillées par un unique groupe de surveillance.

L’uniformité de l’architecture de transport permet d’y intégrer d’autres mé- canismes de communication tels que :

– sockets Unix, pour la communication entre différents nœuds existant en fait sur une même machine physique ;

– liaisons point à point série, telles que la liaison radio pour robots auto- nomes que nous avons décrite dans la section 3.2.1.

Les objets de liaison n’utilisent que l’interface uniforme des mécanismes de transport, notre architecture permet de projeter un protocole donné sur n’im- porte lequel de ces mécanismes.

Le découplage entre les rôles de synchronisation, d’établissement de relation et d’échange de données permet la création de sous-systèmes de transports où ces aspects ne sont pas intrinsèquement liés, comme c’est le cas avec les sockets. Par exemple, un mécanisme de transport basé sur des segments de mémoire partagée et des mécanismes de synchronisation inter-processus pourrait être réalisé.