Communication concurrente

Cette page décrit l'utilisation de communications entre plusieurs Thymio implémentant un programme distribué. Dans la programmation distribuée, les processus n'ont pas accès à une structure globale comme une sémaphore. A la place, la synchronisation doit être effectuée par le transmission de messages.

Explication des communications.

Deux processus participent à l'échange d'un message: le processus expéditeur S envoie des messages M1, M2, … à un processus destinataire R. Nous faisons la différence entre deux types de communication:

  • La communication synchrone: Un message M est envoyé par S si et seulement si le destinataire R est prêt à le recevoir. Ainsi, la communication synchrone résulte en une synchronisation directe entre S et R. Cette interaction entre les deux processus est appelée un rendezvous, due à la ressemblance à au comportement de deux personnes se donnant rendez-vous à un endroit spécifique.
  • La communication asynchrone: L’expéditeur S peut envoyer son message M dès qu'il est prèt, sans avoir besoin d'attendre le destinataire. De la même manière, le destinataire peut recevoir un message même si celui-ci à été envoyé plus tôt. Ce type de communication n'est pas dépendante du temps, et ne résulte pas directement à la synchronisation des processus. Cependant, elle nécessite un buffer B, dans lequel nous stockons les messages M1, M2,… qui ont déja été envoyés, mais pas encore reçus. Cela apporte des complications qui doivent être prises en compte: que faire quand B est plein et que S veut envoyer un message? et quand le B est vide mais que R veut recevoir un message?

Pouvez vous trouver des exemples de communication synchrone et asynchrone dans la vie courante?

Résoudre le problème du producteur-consommateur avec les Thymio:

Le problème du producteur-consommateur est l'un des problèmes fondamentaux dans la programmation concurrente et distribuée. Plusieurs processus, appelés producteur, génèrent des données, dont ont besoin d'autres processus, appelés consommateurs. Le projet présenté sur cette page décrit comment plusieurs Thymio producteurs transmettent des couleurs à plusieurs autres Thymio consommateurs.

Le programme exécute par les Thymio est implémenté sous forme de machine d'état. A chaque instant, le programme peut être dans un des différents états; le programme passe d'un état à l'autre suivant ce qu'il capte. L'état initial est l'état road

Le Thymio producteur: Ce Thymio “produit” des couleurs. Au début, les LEDs sont éteintes, puis, après un temps aléatoire, s'allument avec une couleur, aussi aléatoire. Celle-ci doit être envoyé par message, puis “consommée” par un Thymio consommateur. Une fois que la couleur a été envoyée, le Thymio producteur retourne à son état initial.

fr_state_prod.png

Road: Dans cet état, le robot se déplace sur la route. Le robot effectue le suivi de ligne ainsi qu’un évitement d’obstacle basique.
Action : Cet état correspond à la prise de décision lorsque le robot arrive au virage du parking. Le Thymio effectue soit le suivi de ligne, soit la traversée de ligne.
Send: Dans cet état, le message est envoyé. Le Thymio envoie un message en utilisant le protocole de communication.

Le Thymio consomateur: Ce Thymio “consomme” les couleurs envoyées par le Thymio producteur. A l'état initial, les LEDs sont éteintes. Quand il est prêt à recevoir une couleur, il prend l'intersection pour acceder à la zone de communication. Après avoir reçu la couleur, les LEDs s'allument de cette couleur, et après un temps aléatoire le Thymio retourne à son état initial.
fr_state_cons.png

Road: Dans cet état, le robot se déplace sur la route. Le robot effectue le suivi de ligne ainsi qu’un évitement d’obstacle basique.
Action : Cet état correspond à la prise de décision lorsque le robot arrive au virage du parking. Le Thymio effectue soit le suivi de ligne, soit la traversée de ligne.
Receive: Dans cet état, le message est reçu. Le Thymio reçoit une couleur et l'affiche.

Les section suivantes décrivent des méthodes de communication synchrone et asynchrone.

La communication synchrone par rendezvous:

En communication par renezvous, les Thymio producteurs et consommateurs doivent attendre qu'ils soient tout deux prêts à communiquer.

Le diagramme ci dessous décrit le protocole de communication:

fr_comm_rdv.png

Le comportement des Thymio exécutants ce programme est montré dans la vidéo suivante:

Ce programme est correct puisque les Thymio envoient et reçoivent les données dans le bon ordre, et sans perte d'information.

Pour aller plus loin:

Que se passe t-il si un des Thymio roule beaucoup plus vite que l'autre?

Les données sont-elles stockées quelque part pendant la communication?

Et si il y a plus de deux processus?

Communication asynchrone utilisant un buffer:

Un canal de communication utilisant un buffer permet d'avoir une communication asynchrone où les différents processus n'ont pas besoin de s'attendre les uns les autres. Les données transmises sont stockées dans un buffer. Ces canaux sont similaires à des boites aux lettres: le postier y dépose plusieurs lettres et les habitants peuvent les récupérer. De même, si ils sont en vacances, le postier passera plusieurs fois déposer des lettres avant qu'elle ne soient récupérées? Une boite aux lettres à une capacité, qui est le nombre de lettres que l'on peut mettre dans la boite avant que celle-ci déborde. De la même manière, un buffer a une capacité: le nombre de messages qu'il peu stocker. Dans notre exemple, nous spécifions que le buffer peut stocker 8 messages (couleurs).

Le diagramme suivant montre le protocole de communication:

fr_comm_buff.png

Le comportement des Thymio exécutant le programme est montré dans la vidéo suivante:

Pour aller plus loin

Quel est le comportement correct si buffer est vide quand le consommateur veut recevoir un message?

Quel est le comportement correct si le buffer est plein lorsque le producteur veut envoyer un message?

A faire soi même

  • Pour imprimer les routes que suivent les Thymio, imprimez les fichiers PDF des segments de route contenus dans cette archive.
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License