Passage de message - Message passing

En informatique , la transmission de messages est une technique pour invoquer un comportement (c'est-à-dire exécuter un programme ) sur un ordinateur . Le programme appelant envoie un message à un processus (qui peut être un acteur ou un objet ) et s'appuie sur ce processus et son infrastructure de support pour ensuite sélectionner et exécuter un code approprié. Le passage de messages diffère de la programmation conventionnelle où un processus, un sous - programme ou une fonction est directement invoqué par son nom. La transmission de messages est la clé de certains modèles de concurrence et de programmation orientée objet .

La transmission de messages est omniprésente dans les logiciels informatiques modernes . Il est utilisé comme un moyen pour les objets qui composent un programme de fonctionner les uns avec les autres et comme un moyen pour les objets et les systèmes exécutés sur différents ordinateurs (par exemple, Internet ) d'interagir. La transmission de messages peut être mise en œuvre par divers mécanismes, notamment des canaux .

Aperçu

La transmission de messages est une technique pour invoquer un comportement (c'est-à-dire exécuter un programme) sur un ordinateur. Contrairement à la technique traditionnelle consistant à appeler un programme par son nom, la transmission de messages utilise un modèle objet pour distinguer la fonction générale des implémentations spécifiques. Le programme appelant envoie un message et s'appuie sur l'objet pour sélectionner et exécuter le code approprié. Les justifications de l'utilisation d'une couche intermédiaire se répartissent essentiellement en deux catégories : l'encapsulation et la distribution.

L'encapsulation est l'idée que les objets logiciels devraient pouvoir invoquer des services sur d'autres objets sans savoir ou se soucier de la façon dont ces services sont mis en œuvre. L'encapsulation peut réduire la quantité de logique de codage et rendre les systèmes plus faciles à gérer. Par exemple, plutôt que d'avoir des instructions IF-THEN qui déterminent le sous-programme ou la fonction à appeler, un développeur peut simplement envoyer un message à l'objet et l'objet sélectionnera le code approprié en fonction de son type.

L'un des premiers exemples de la façon dont cela peut être utilisé était dans le domaine de l'infographie. Il existe diverses complexités impliquées dans la manipulation d'objets graphiques. Par exemple, le simple fait d'utiliser la bonne formule pour calculer l'aire d'une forme fermée variera selon que la forme est un triangle, un rectangle, une ellipse ou un cercle. Dans la programmation informatique traditionnelle, cela se traduirait par de longues instructions IF-THEN testant le type d'objet de la forme et appelant le code approprié. La manière orientée objet de gérer cela est de définir une classe appelée Shapeavec des sous-classes telles que Rectangleet Ellipse(qui à leur tour ont des sous-classes Squareet Circle), puis d'envoyer simplement un message à toute personne Shapelui demandant de calculer son aire. Chaque Shapeobjet invoquera ensuite la méthode de la sous-classe avec la formule appropriée pour ce type d'objet.

La transmission de messages distribuée fournit aux développeurs une couche de l'architecture qui fournit des services communs pour créer des systèmes composés de sous-systèmes qui s'exécutent sur des ordinateurs disparates à différents endroits et à différents moments. Lorsqu'un objet distribué envoie un message, la couche de messagerie peut prendre en charge des problèmes tels que :

  • Trouver le processus en utilisant différents systèmes d'exploitation et langages de programmation, à différents endroits d'où provient le message.
  • Enregistrer le message dans une file d'attente si l'objet approprié pour gérer le message n'est pas en cours d'exécution, puis appeler le message lorsque l'objet est disponible. De plus, stocker le résultat si nécessaire jusqu'à ce que l'objet expéditeur soit prêt à le recevoir.
  • Contrôler diverses exigences transactionnelles pour les transactions distribuées, par exemple ACID -tester les données.

Transmission de messages synchrone ou asynchrone

Passage de messages synchrone

Le passage de message synchrone se produit entre des objets qui s'exécutent en même temps. Il est utilisé par les langages de programmation orientés objet tels que Java et Smalltalk.

La messagerie synchrone est analogue à un appel de fonction synchrone ; tout comme l'appelant de la fonction attend que la fonction se termine, le processus d'envoi attend que le processus de réception se termine. Cela peut rendre la communication synchrone impraticable pour certaines applications. Par exemple, les grands systèmes distribués peuvent ne pas fonctionner suffisamment bien pour être utilisables. Ces grands systèmes distribués peuvent avoir besoin de fonctionner pendant que certains de leurs sous-systèmes sont en panne pour maintenance, etc.

Imaginez un bureau d'affaires occupé avec 100 ordinateurs de bureau qui s'envoient des e-mails en utilisant exclusivement la transmission synchrone de messages. Un travailleur qui éteint son ordinateur peut bloquer les 99 autres ordinateurs jusqu'à ce que le travailleur rallume son ordinateur pour traiter un seul e-mail.

Passage de message asynchrone

Avec la transmission de message asynchrone, l'objet destinataire peut être en panne ou occupé lorsque l'objet demandeur envoie le message. Poursuivant l'analogie de l'appel de fonction, c'est comme un appel de fonction qui revient immédiatement, sans attendre que la fonction appelée se termine. Les messages sont envoyés dans une file d'attente où ils sont stockés jusqu'à ce que le processus de réception les demande. Le processus de réception traite ses messages et envoie les résultats à une file d'attente pour qu'ils soient récupérés par le processus d'origine (ou un processus suivant désigné).

La messagerie asynchrone nécessite des capacités supplémentaires pour stocker et retransmettre des données pour des systèmes qui peuvent ne pas fonctionner simultanément, et sont généralement gérées par un niveau intermédiaire de logiciel (souvent appelé middleware ) ; un type courant étant le middleware orienté message (MOM).

Le tampon requis dans la communication asynchrone peut causer des problèmes lorsqu'il est plein. Une décision doit être prise si bloquer l'expéditeur ou s'il faut rejeter les futurs messages. Un expéditeur bloqué peut entraîner un blocage . Si des messages sont abandonnés, la communication n'est plus fiable.

Hybrides

La communication synchrone peut être construite au-dessus de la communication asynchrone à l'aide d'un synchroniseur . Par exemple, le α-Synchronizer fonctionne en s'assurant que l'expéditeur attend toujours un message d'accusé de réception du destinataire. L'expéditeur n'envoie le message suivant qu'après réception de l'accusé de réception. D'autre part, la communication asynchrone peut également être construite sur la communication synchrone. Par exemple, les micronoyaux modernes ne fournissent généralement qu'une primitive de messagerie synchrone et la messagerie asynchrone peut être implémentée par dessus en utilisant des threads auxiliaires .

Objets distribués

Les systèmes de transmission de messages utilisent des objets distribués ou locaux. Avec des objets distribués, l'expéditeur et le destinataire peuvent se trouver sur des ordinateurs différents, exécutant des systèmes d'exploitation différents, utilisant des langages de programmation différents, etc. Dans ce cas, la couche de bus s'occupe des détails sur la conversion des données d'un système à un autre, l'envoi et la réception de données à travers le réseau, etc. Le protocole RPC ( Remote Procedure Call ) sous Unix en était un exemple précoce. Notez qu'avec ce type de transmission de message, il n'est pas obligatoire que l'expéditeur ou le destinataire utilise une programmation orientée objet. Les systèmes de langage procédural peuvent être enveloppés et traités comme des objets à gros grains capables d'envoyer et de recevoir des messages.

Des exemples de systèmes prenant en charge les objets distribués sont : Emerald , ONC RPC , CORBA , Java RMI , DCOM , SOAP , .NET Remoting , CTOS , QNX Neutrino RTOS , OpenBinder et D-Bus . Les systèmes d'objets distribués ont été appelés systèmes « de rien partagé » parce que l'abstraction de passage de message masque les changements d'état sous-jacents qui peuvent être utilisés dans la mise en œuvre de l'envoi de messages.


La transmission de messages distribuée ou asynchrone a une surcharge supplémentaire par rapport à l'appel d'une procédure. Lors de la transmission de messages, les arguments doivent être copiés dans le nouveau message. Certains arguments peuvent contenir des mégaoctets de données, qui doivent tous être copiés et transmis à l'objet récepteur.

Les appels de procédure traditionnels diffèrent de la transmission de messages en termes d'utilisation de la mémoire, de temps de transfert et de localité. Les arguments sont transmis au récepteur généralement par des registres à usage général ne nécessitant pas de stockage supplémentaire ni de temps de transfert, ou dans une liste de paramètres contenant les adresses des arguments (quelques bits). La transmission d'adresses n'est pas possible pour les systèmes distribués car les systèmes utilisent des espaces d'adressage séparés.

Les navigateurs Web et les serveurs Web sont des exemples de processus qui communiquent par transmission de messages. Une URL est un exemple de référencement d'une ressource sans exposer les éléments internes du processus.

Un appel de sous - programme ou un appel de méthode ne se terminera pas tant que le calcul invoqué ne sera pas terminé. Le passage de message asynchrone, en revanche, peut entraîner une réponse arrivant un temps significatif après l'envoi du message de demande.

Un gestionnaire de messages traitera, en général, les messages de plusieurs expéditeurs. Cela signifie que son état peut changer pour des raisons indépendantes du comportement d'un seul processus expéditeur ou client. Cela contraste avec le comportement typique d'un objet sur lequel des méthodes sont invoquées : ces derniers devraient rester dans le même état entre les appels de méthode. En d'autres termes, le gestionnaire de messages se comporte de manière analogue à un objet volatile .

Modèles mathématiques

Les principaux modèles mathématiques de transmission de messages sont le modèle d'acteur et le calcul Pi . En termes mathématiques, un message est le seul moyen de passer le contrôle à un objet. Si l'objet répond au message, il a une méthode pour ce message.

Alan Kay a fait valoir que la transmission de messages est plus importante que les objets en POO, et que les objets eux-mêmes sont souvent surestimés. Le modèle de programmation d' objets distribués en direct s'appuie sur cette observation ; il utilise le concept de flux de données distribué pour caractériser le comportement d'un système distribué complexe en termes de modèles de messages, en utilisant des spécifications de style fonctionnel de haut niveau.

Exemples

Voir également

Les références

Lectures complémentaires

Liens externes