next up previous contents
suivant: Les appels systèmes monter: Mécanisme de communication : précédent: Récupération d'un message   Table des matières

Attente d'un message

Une tâche peut se mettre en attente d'un message, c'est-à-dire bloquer son exécution jusqu'à la réception d'un message (mode synchrone). Cette fonctionnalité est fournie par l'utilisation de deux fonction libc:

Comme d'habitude, ces deux fonctions sont des appels systèmes, déléguant ainsi le traitement au noyau. De même, nous n'expliquerons que le traitement de wait_msg(). En effet, celle-ci utilise la fonction get_msg(), alors que wait_msg_from(t_tskid src) utilise get_msg_from(t_tskid src). Il n'y a pas d'autres différences entre ces deux fonctions.

Le noyau commence par vérifier si un message est présent dans la file de messages de la tâche, par un appel à get_msg(). Si tel est le cas, le noyau retourne directement l'adresse du message et rend la main à la tâche appellante. Cette dernière continue donc son exécution, sans avoir été mise en pause.

Si aucun message n'était présent, le thread ayant effectué l'appel se voit affecté un statut d'ordonnancement particulier : STATUS_MSG. Puis le noyau demande à l'ordonnanceur de passer au thread suivant (bien sûr en réalisant la sauvegarde du contexte d'exécution et toutes les opérations usuelles). Le thread appelant est alors enlevé de l'ensemble des threads en cours d'exécution, et se retrouve donc en attente ou bloqué. Le noyau rend alors la main, et le prochain thread s'exécute.

Intéressons-nous pour finir au réveil du thread en attente. Cette opération s'effectue en fait au moment de l'envoi d'un message à cette destination. En effet, lors du traitement de send_msg(t_msg *msg_hdr), comme nous l'avons dit précédemment, le noyau récupère l'identifiant de tâche du destinataire. Il vérifie alors le statut du destinataire, et si celui-ci se trouve en statut STATUS_MSG. Si c'est le cas, le thread est réveillé, c'est-à-dire remis en statut d'ordonnancement STATUS_RUN, et replacé dans l'ensemble des threads en éxécution (c'est-à-dire l'ensemble de l'ordonnanceur). A sa prochaine exécution, c'est-à-dire quand l'ordonnanceur lui redonne la main, il récupère le message et poursuit son exécution.


next up previous contents
suivant: Les appels systèmes monter: Mécanisme de communication : précédent: Récupération d'un message   Table des matières
nicolas 2006-07-30