Places Send File Receive Messages
Implantation à l’aide de sémaphores Gestion des communications Boîte à lettres, synchrone, file de taille bornée, avec blocage Implantation à l’aide de sémaphores Structure de données typedef char t_msg[MAX_MSG] typedef struct { t_sema s_messages init 0; /* Sémaphore pour accès aux messages */ t_sema s_places init N_PLACES; /* Sémaphore pour accès place libre */ t_msg tampon[N_PLACES]; /* Tampon pour message en attente */ t_sema s_tampon init 1; /* Mutex sur tampon */ int i_msg init 0; /* Message à lire */ int i_place init 0; /* Place à remplir */ } t_port;
Gestion des communications Boîte à lettres, synchrone, file de taille bornée, avec blocage void receive (t_msg *msg, t_port *port) { /* On attend qu’un message soit la */ P(port->s_messages); /* Recopie message */ P(port->s_tampon); recopier(port->tampon[port->i_msg],msg); port->i_msg = (port->i_msg+1) modulo N_PLACES; V(port->s_tampon); /* On signale la libération d’une place vide*/ V(port->s_places); } void send (t_msg msg, t_port *port) { /* On attend qu’une place se libère */ P(port->s_places); /* Recopie message */ P(port->s_tampon); recopier(&msg,port->tampon[port->i_places]; port->i_places = (port->i_places+1) modulo N_PLACES; V(port->s_tampon); /* On signale son arrivée */ V(port->s_messages); } Cas problématique : Tâche moins prioritaire interrompue par une tâche plus prioritaire Lorsque le premier mutex (s_tampon) est consommé mais pas le second (s_places) Dessiner le contenu de la FIFO