next up previous contents
suivant: Attente d'un message monter: Mécanisme de communication : précédent: Envoi d'un message   Table des matières

Récupération d'un message

La récupération d'un message, en mode asynchrone, s'effectue en utilisant les fonctions libc suivantes:

Là encore ces fonctions sont des appels systèmes, et la récupération des messages est donc effectuée par le noyau. Nous n'expliquerons ici que le traitement effectué lors de l'appel de get_msg(), puisque le traitement de get_msg_from(t_tskid src) ne diffère que par un test entre le champs src de la structure message noyau et le paramètre src fourni par la tâche appelante.

Le noyau commence par vérifier si un message est présent dans la file de messages de la tâche appelante. Si c'est le cas, il récupère l'adresse physique du message, en utilisant l'adresse virtuelle du message dans la tâche émettrice (identifiée par le champs src du message noyau). Cette adresse virtuelle est fournie, rappelons le, par le champs msg du message noyau.

Le noyau effectue alors une réservation d'espace mémoire virtuel dans l'espace d'adressage de la tâche appelante (c'est-à-dire le destinataire du message), suffisamment grande pour contenir le message en entier (header et données). Puis il référence la zone physique du message en utilisant l'adresse virtuelle réservée. Enfin, il change la valeur de l'adresse (virtuelle) des données dans le header, pour qu'elle corresponde avec l'adresse virtuelle réservée à laquelle est ajoutée la taille du header. Ainsi les données seront accessible par la tâche appelante.

Le noyau termine le traitement en renvoyant l'adresse virtuelle du message, et rend la main à la tâche appelante, qui peut alors lire le message.


next up previous contents
suivant: Attente d'un message monter: Mécanisme de communication : précédent: Envoi d'un message   Table des matières
nicolas 2006-07-30