ELE-542 Systèmes ordinés en temps réels Cours # 10 Contrôle d accès et synchronisation Jean-Marc Beaulieu et Bruno De Kelper Site internet: http://www.ele.etsmtl.ca/academique/ele542/ Systèmes ordinés en temps réel Cours 10 1 Queues de messages Objets qui permettent de transmettre un message (i.e. une variable de la dimension d un pointeur). Une queue permet d emmagasiner plusieurs messages (OS_MAX_QS). Les messages sont gardés dans un tampon circulaire. Ajout d un message à la fin (OSQPost) FIFO Tête (IN) Queue (OUT) Ajout d un message au début (OSQPostFront) LIFO Queue (OUT) Tête (IN) Une tâche peut spécifier le délai maximum qu elle veut attendre. Une queue peut simuler un sémaphore à valeur entière (pas très inefficace). Systèmes ordinés en temps réel Cours 10 2 Contrôle d'accès et synchronisation cours 10 1
µc/os-ii Queues de messages OSQCreate OSQPost OSQPostFront OSQPend OSQAccept OSQFlush OSQQuery Création Retourne un pointeur sur le bloc événement Envoi d un message dans la queue (à la fin) Envoi d un message dans la queue (au début de la queue) Réception d un message et attend si nécessaire Réception d un message mais n attend pas Vide la queue (sans traiter les messages) Retourne un ensemble d informations sur la queue Tâche ISR Réf. : Labrosse, chap. 6 OSQPost() OSQCreate() OSQPostFront() OSQPostOpt() OSQFlush() Queue OSQPost() OSQPostFront() OSQPostOpt() OSQFlush() OSQAccept() OSQPend() OSQAccept() OSQQuery() Plusieurs messages (32 bits) Tâche Systèmes ordinés en temps réel Cours 10 3 µc/os-ii Queues de messages OS_EVENT *OSQCreate(void **queue, INT8U taille) (IN) queue = pointeur vers un tableau de pointeur qui sert de queue (IN) taille = nombre maximum de message que peut contenir la queue (OUT) Retourne un pointeur sur le bloc événement void *OSQPend(OS_EVENT *pevent, INT16U timeout, INT8U *err) (IN) pevent = Pointeur vers la queue de message (IN) Timeout en ticks ( 0 = infini) (OUT) err = Code d erreur (OUT) Retourne un pointeur vers le message pris dans la queue INT8U OSQPost(OS_EVENT *pevent, void *msg) (IN) pevent = Pointeur vers la queue de message (IN) msg = pointeur vers le message (ne pas utiliser NULL) (OUT) Retourne un code d erreur INT8U OSQPostFront(OS_EVENT *pevent, void *msg) (IN) pevent = Pointeur vers la queue de message (IN) msg = pointeur vers le message (ne pas utiliser NULL) (OUT) Retourne un code d erreur Systèmes ordinés en temps réel Cours 10 4 Réf. : Labrosse, chap. 6 Contrôle d'accès et synchronisation cours 10 2
µc/os-ii Queues de messages INT8U OSQPostOpt(OS_EVENT *pevent, void *msg, INT8U opt) (IN) pevent = Pointeur vers la queue de message (IN) msg = pointeur vers le message (ne pas utiliser NULL) (IN) opt = option tel que : OS_POST_OPT_BROADCAST et OS_POST_OPT_FRONT (OUT) Retourne un code d erreur void *OSQAccept(OS_EVENT *pevent) (IN) pevent = Pointeur vers la queue de message (OUT) Retourne un pointeur vers le message (NULL = pas de message) INT8U OSQQuery(OS_EVENT *pevent, OS_Q_DATA *pdata) (IN) pevent = Pointeur vers la queue de message (OUT) pdata = Pointeur vers la structure contenant l information (OUT) Retourne un code d erreur Systèmes ordinés en temps réel Cours 10 5 Réf. : Labrosse, chap. 6 Exemples de synchronisation Problème 1 : Remplissage de bocaux de confiture Séquence : Confiture Horloge Solution sera fait en classe 1 Place bocal 2 Ouvre valve 3 Attend 30 sec. 4 Ferme valve 5 Enlève bocal Bocal Valve Problème de synchronisation Tâches : Tâche Bocal () { while(1) { PlaceBocal(); EnlèveBocal(); Tâche Valve () { while(1) { OuvreValve(); FermeValve(); Tâche Horloge () { while(1) { Attend(30); Systèmes ordinés en temps réel Cours 10 6 Contrôle d'accès et synchronisation cours 10 3
Exemples de synchronisation Problème 2 : Atelier automatisé Séquence : 1 Produit pièce 2 Place pièce 3 Tourne plateau 4 Retire pièce 5 Consomme pièce Producteur Consommateur Solution sera fait en classe Traitement séquentiel : (3) (15) (5) Enlève Consomme pièce (10) (3) Tourne plateau Produit pièce Place Produit pièce 10 13 18 21 36 Systèmes ordinés en temps réel Cours 10 7 Problème 2 : Exemples de synchronisation Atelier automatisé (suite) Traitement concurrent : Producteur Consommateur Enlève Tâches : Produit pièce Tâche Producteur () { while(1) { ProduitPièce(); PlacePièce(); Place Enlève Tourne plateau Produit pièce Place Consomme pièce Tourne plateau Produit pièce 10 13 18 21 36 Problème de synchronisation Tâche Plateau () { while(1) { TournePlateau(); Enlève Place Solution sera fait en classe Tâche Consommateur () { while(1) { RetirePièce(); ConsommePièce(); Systèmes ordinés en temps réel Cours 10 8 Contrôle d'accès et synchronisation cours 10 4
Exclusion mutuelle - MUTEX Le Mutex est un cas particulier de sémaphore. C est un sémaphore binaire qui sert au contrôle d accès à une ressource. Le Mutex utilise la méthode d héritage de priorité pour éviter les inversions de priorité. Une priorité est réservée pour l héritage et est associée au Mutex. Seul le propriétaire du Mutex peut le libérer (contrairement au sémaphore). Un Mutex ne peut pas être utilisé par une ISR (jamais). OSMutexCreate() Tâche OSMutexPost() OSMutexDel() Mutex OSMutexPend() OSMutexAccept() OSMutexQuery() Tâche Réf. : Labrosse, chap. 8 La clé Systèmes ordinés en temps réel Cours 10 9 µc/os-ii Mutex OS_EVENT *OSMutexCreate(INT8U Priorité, INT8U *Erreur) (IN) Priorité = Niveau de priorité associé au Mutex pour l héritage. (OUT) Retourne un pointeur sur le bloc événement void OSMutexPend(OS_EVENT *pevent, INT16U timeout, INT8U *err) (IN) pevent = Pointeur vers le sémaphore (IN) Timeout en ticks ( 0 = infini) (OUT) err = Code d erreur INT8U OSMutexPost(OS_EVENT *pevent) (IN) pevent = Pointeur vers le sémaphore (OUT) Retourne un code d erreur INT16U OSMutexAccept(OS_EVENT *pevent) (IN) pevent = Pointeur vers le sémaphore (OUT) Retourne la valeur de le sémaphore ou 0 INT8U OSMutexQuery(OS_EVENT *pevent, OS_SEM_DATA *pdata) (IN) pevent = Pointeur vers le sémaphore (OUT) pdata = Pointeur vers la structure contenant l information Systèmes ordinés en temps réel Cours 10 10 Réf. : Labrosse, chap. 6 Contrôle d'accès et synchronisation cours 10 5
µc/os-ii Mutex OS_EVENT *OSMutexCreate(INT8U Priorité, INT8U *Erreur) (IN) Priorité = Niveau de priorité associé au Mutex pour l héritage. (IN) Erreur = Code d erreur (ex. : priorité déjà occupée OS_PRIO_EXIST) (OUT) Retourne un pointeur sur le bloc événement void OSMutexPend(OS_EVENT *pevent, INT16U Timeout, INT8U *Erreur) (IN) pevent = Pointeur vers le Mutex (IN) Timeout en ticks ( 0 = infini) (OUT) Erreur = Code d erreur INT8U OSMutexPost(OS_EVENT *pevent) (IN) pevent = Pointeur vers le Mutex (OUT) Retourne un code d erreur INT16U OSMutexAccept(OS_EVENT *pevent) (IN) pevent = Pointeur vers le Mutex (OUT) Retourne la valeur 1 (disponible) ou 0 (occupé) INT8U OSMutexQuery(OS_EVENT *pevent, OS_MUTEX_DATA *pdata) (IN) pevent = Pointeur vers le Mutex (OUT) pdata = Pointeur vers la structure contenant l information Réf. : Labrosse, chap. 8 Systèmes ordinés en temps réel Cours 10 11 µc/os-ii Bloc de contrôle d événement uc/os-ii utilise une structure spéciale appelée bloc de contrôle d événement (ECB) pour gérer les événements tels que : sémaphore, mutex, boite à lettre et queue de message. Une quantité limité de ECB (OS_MAX_EVENTS) est déclaré lorsque de l initialisation de uc/os-ii. Type d événement Utilisé par les sémaphores Type : sémaphore Compteur : 7 Pointeur : Liste d attente : vers une boite à lettre ou queue de message Tâche Tâche Tâche Tâche Tâche Systèmes ordinés en temps réel Cours 10 12 Contrôle d'accès et synchronisation cours 10 6
Interblocages ( Deadlocks ) Définition : Chaque processus d'un ensemble attend un événement qui ne peut être produit que par un autre processus de l'ensemble Ne pas confondre avec BLOCAGE : arrêt d'un processus pour un temps indéterminé Systèmes ordinés en temps réel Cours 10 13 Graphe d'allocation des ressources PROCESSUS P0 P1 P2 RESSOURCE A B classe unité ou instance Requête Allocation Systèmes ordinés en temps réel Cours 10 14 Contrôle d'accès et synchronisation cours 10 7
Graphe d'allocation des ressources relations entre les processus et les ressources R1 R3 P1 P2 P3 R2 R4 relations entre les processus P1 P2 P3 Systèmes ordinés en temps réel Cours 10 15 Utilisation d'une ressource Processus requête UTILISATION allocation relâche Systèmes ordinés en temps réel Cours 10 16 Contrôle d'accès et synchronisation cours 10 8
CONDITIONS D'INTERBLOCAGE (structure) Exclusion mutuelle au moins une ressource n'est pas partageable Pas de «préemption» (réquisition) (comportement) Retient et attend un processus retient des ressources et attend d'autres déjà allouées Attente circulaire ensemble circulaire de processus en attente Systèmes ordinés en temps réel Cours 10 17 CONDITIONS D'INTERBLOCAGE Retient et attend un processus retient des ressources et attend d'autres déjà allouées Attente circulaire ensemble circulaire de processus en attente P2 P3 P1 P4 P5 Systèmes ordinés en temps réel Cours 10 18 Contrôle d'accès et synchronisation cours 10 9
Les quatre conditions sont NÉCESSAIRES, mais NON SUFFISANTES R1 R3 P1 P2 P3 R2 R4 P1 P2 P3 Systèmes ordinés en temps réel Cours 10 19 Conditions non suffisantes R1 R3? P1 P2 P3 Détection des interblocages Dessiner le graphe d allocation des ressources Simplifier (plusieurs itérations) Enlever les processus non-bloqués et libérer leurs ressources R2 P4 R4 Systèmes ordinés en temps réel Cours 10 20 Contrôle d'accès et synchronisation cours 10 10
Exercice Simplifier R1 P1 P2 P3 R2 P4 R3 P5 P6 R4 P7 R5 R6 Systèmes ordinés en temps réel Cours 10 21 RISQUE DE FAMINE Famine (starvation) un processus est retardé indéfiniment par l'action des autres processus pas de famine Attente bornée La synchronisation doit éviter les risques de famine Systèmes ordinés en temps réel Cours 10 22 Contrôle d'accès et synchronisation cours 10 11
Drapeaux d événements Les drapeaux d événements permettent de transmettre un signal à une tâche. Une tâche peut attendre un ou plusieurs drapeaux d événements ou signaux. Les drapeaux d événements servent pour la synchronisation des tâches. 2 types de synchronisation : Synchronisation disjonctive Synchronisation conjonctive Drapeaux Drapeaux POST OR PEND Tâche POST AND PEND Tâche Tâche OSFlagPost() OSFlagDel() OSFlagCreate() OSFlagPend() OSFlagAccept() OSFlagQuery() Tâche ISR OSFlagPost() Groupe de drapeaux d événements OSFlagAccept() OSFlagQuery() Systèmes ordinés en temps réel Cours 10 23 Réf. : Labrosse, chap. 8 ISR µc/os-ii Drapeaux d événements OS_FLAG_GRP *OSFlagCreate(OS_FLAGS Flags, INT8U *Erreur) (IN) Flag = valeur initiale des drapeaux d événements. (OUT) Retourne un pointeur sur le groupe de drapeaux. OS_FLAGS OSFlagPend(OS_FLAGS *pgroupe, OS_FLAG Flags, INT8U Wait_Type, INT16U Timeout, INT8U *Erreur) (IN) pgroupe = Pointeur vers le groupe de drapeaux. (IN) Flags = patron de drapeaux à tester. (IN) Wait_Type = type de synchronisation : OS_FLAG_WAIT_CLR_ALL OS_FLAG_WAIT_SET_ALL OS_FLAG_WAIT_CLR_ANY OS_FLAG_WAIT_SET_ANY + OS_FLAG_CONSUME (IN) Timeout en ticks ( 0 = infini) (OUT) Erreur = Code d erreur (OUT) Retourne l état actuel des drapeaux ou l état après qu ils ont été consumé. Systèmes ordinés en temps réel Cours 10 24 Réf. : Labrosse, chap. 6 Contrôle d'accès et synchronisation cours 10 12
µc/os-ii Drapeaux d événements OS_FLAGS OSFlagPost(OS_FLAG_GRP *pgroupe, OS_FLAGS Flags, INT8U Option, INT8U *Erreur) (IN) pgroupe = Pointeur vers le groupe de drapeaux. (IN) Flags = patron de drapeaux à activer. (IN) Option = met les drapeaux à 0 (OS_FLAG_CLR) ou à 1 (OS_FLAG_SET) (OUT) Erreur = code d erreur (OUT) Retourne la nouvelle valeur des drapeaux du groupe INT16U OSFlagAccept(OSFlagPend(OS_FLAGS *pgroupe, OS_FLAG Flags, INT8U Wait_Type, INT16U Timeout, INT8U *Erreur) (comme pour OSFlagPend) OS_FLAGS OSFlagQuery(OS_FLAG_GRP *pgroupe, INT8U *Erreur) (IN) pgroupe = Pointeur vers le groupe de drapeaux (OUT) Erreur = Code d erreur (OUT) Retourne l état actuel des drapeaux du groupe. Systèmes ordinés en temps réel Cours 10 25 Réf. : Labrosse, chap. 6 Contrôle d'accès et synchronisation cours 10 13