NOTIONS DE BASE DES SYSTÈMES TEMPS-RÉEL Sujets Concepts de processus/thread concurrents –Windows NT et la programmation temps réel Lectures: Chapitres 3 et 4 (Real-Time Systems, Liu) INF-1019 Programmation en temps réel
Concepts de processus/thread concurrents Processus/thread concurrents WINDOWS NT (2000) (API WIN32) –Synchronisation des thread »Les principaux objets de synchronisation de l'API WIN32 sont les suivants: »OBJETS DE SYNCHRONISATION: »Les objets du noyau suivants sont utilisées pour synchroniser les threads (Richter p334): fichiers, entrée de console, notification de modification de fichier, mutex, sémaphore, événements, horloge de temporisation (Windows NT 4 et 2000). »Chaque objet peut se trouver à n'importe quel moment dans l'un des états suivants: signalé ou non-signalé. »Les threads peuvent être mis en veille jusqu'à ce qu'un objet soit signalé.
Concepts de processus/thread concurrents Processus/thread concurrents WINDOWS NT (2000) (API WIN32) –Synchronisation des thread »Les principaux objets de synchronisation de l'API WIN32 sont les suivants: »OBJETS DE SYNCHRONISATION: »Notez qu'un processus est signalé lorsqu'il se termine, même chose pour un thread. »Voir l’exemple CritSect ou le thread principal attend que les deux autres threads soit signalés (terminés) pour se terminer lui-même. »Les threads font appel à deux fonctions pour se mettre en sommeil en attendant que les objets du noyau soient signalés: WaitForSingleObject() et WaitForMultipleObjects() (Richter p 336).
Concepts de processus/thread concurrents Processus/thread concurrents WINDOWS NT (2000) (API WIN32) –Synchronisation des thread »Les principaux objets de synchronisation de l'API WIN32 sont les suivants: »OBJETS DE SYNCHRONISATION: »La fonction WaitForSingleObject() prend comme paramètre le handle de l'objet qui réveillera le thread, et un paramètre de "time- out" qui indique le temps en milliseconde, que le thread est prêt à attendre avant de se réveiller et de poursuivre son exécution. »Vous pouvez passer deux valeurs distinctes du paramètre spécial de "time out", soit 0 qui indique que l'on ne veut pas attendre, et INFINITE qui indique que l'on est prêt à attendre indéfiniment. (Richter p336).
Concepts de processus/thread concurrents Processus/thread concurrents WINDOWS NT (2000) (API WIN32) –Synchronisation des thread »Les principaux objets de synchronisation de l'API WIN32 sont les suivants: »OBJETS DE SYNCHRONISATION: »WaitForMultipleObject() prend quatre paramètres: soit le nombres d'objets qui peuvent réveiller un thread donné, un pointeur sur une table contenant la liste des handles des objets, un booléen qui indique si un thread attend que tous les objets soit signalés (TRUE) ou si seulement un d'entre eux réveillera le thread (FALSE). Vient ensuite le paramètre de "timeout". (Richter p338)
Concepts de processus/thread concurrents Processus/thread concurrents WINDOWS NT (2000) (API WIN32) –Synchronisation des thread (Projet CritSect: Procédure WinMain()
Concepts de processus/thread concurrents Processus/thread concurrents WINDOWS NT (2000) (API WIN32) –Synchronisation des thread (Projet CritSect: Procédure Dlg_OnInitDialog())
Concepts de processus/thread concurrents Processus/thread concurrents WINDOWS NT (2000) (API WIN32) –Synchronisation des thread (Projet CritSect: Procédure Dlg_OnInitDialog())
Concepts de processus/thread concurrents Processus/thread concurrents WINDOWS NT (2000) (API WIN32) –Synchronisation des thread (Projet CritSect: Procédure Dlg_OnInitDialog())
Concepts de processus/thread concurrents Processus/thread concurrents WINDOWS NT (2000) (API WIN32) –Synchronisation des thread (Projet CritSect: Procédure AcquisitionThread())
Concepts de processus/thread concurrents Processus/thread concurrents WINDOWS NT (2000) (API WIN32) –Synchronisation des thread (Projet CritSect: Procédure AcquisitionThread())
Concepts de processus/thread concurrents Processus/thread concurrents WINDOWS NT (2000) (API WIN32) –Synchronisation des thread (Projet CritSect: Procédure DisplayThread())
Concepts de processus/thread concurrents Processus/thread concurrents WINDOWS NT (2000) (API WIN32) –Synchronisation des thread (Projet CritSect: Procédure Dlg_OnCommand())
Concepts de processus/thread concurrents Processus/thread concurrents WINDOWS NT (2000) (API WIN32) –Synchronisation des thread (Projet CritSect: Procédure Dlg_OnCommand())
Concepts de processus/thread concurrents Processus/thread concurrents WINDOWS NT (2000) (API WIN32) –Synchronisation des thread (Projet CritSect: Procédure Dlg_OnCommand())
Concepts de processus/thread concurrents Processus/thread concurrents WINDOWS NT (2000) (API WIN32) –Synchronisation des thread (Projet CritSect: Procédure Dlg_OnCommand())
Concepts de processus/thread concurrents Processus/thread concurrents WINDOWS NT (2000) (API WIN32) –Synchronisation des thread »Les principaux objets de synchronisation de l'API WIN32 sont les suivants: »OBJETS DE SYNCHRONISATION: »MUTEX : »Les mutex ressemblent aux sections critiques mais peuvent êtres utilisés pour synchroniser l'accès aux données à travers des processus multiples. Un mutex est créé avec la fonction CreateMutex() (Richter p340). »Il faut créer le mutex avant de créer les threads qui l'utiliseront pour se synchroniser avec les fonctions WaitForSingleObject() et WaitForMultipleObjects(). »Le programme Mutex, fournit en exemple est une version modifiée du programme CritSect qui utilise l'objet de synchronisation Mutex.
Concepts de processus/thread concurrents Processus/thread concurrents WINDOWS NT (2000) (API WIN32) –Synchronisation des thread (Projet Mutex: Procédure WinMain())
Concepts de processus/thread concurrents Processus/thread concurrents WINDOWS NT (2000) (API WIN32) –Synchronisation des thread (Projet Mutex: Procédure OnInitDialog())
Concepts de processus/thread concurrents Processus/thread concurrents WINDOWS NT (2000) (API WIN32) –Synchronisation des thread (Projet Mutex: Procédure AcquisitionThread())
Concepts de processus/thread concurrents Processus/thread concurrents WINDOWS NT (2000) (API WIN32) –Synchronisation des thread (Projet Mutex: Procédure AcquisitionThread())
Concepts de processus/thread concurrents Processus/thread concurrents WINDOWS NT (2000) (API WIN32) –Synchronisation des thread (Projet Mutex: Procédure DisplayThread())
Concepts de processus/thread concurrents Processus/thread concurrents WINDOWS NT (2000) (API WIN32) –Synchronisation des thread »Les principaux objets de synchronisation de l'API WIN32 sont les suivants: »OBJETS DE SYNCHRONISATION: »SEMAPHORE: »Les sémaphores sont utilisés comme compteur de la disponibilité d’une ressource. »Lorsque qu’un thread demande une ressource en utilisant un sémaphore, le système d'exploitation vérifie si la ressource est disponible, décrémente le compte de ressources disponibles sans laisser la possibilité à un autre thread d'interférer. »Les sémaphores sont le plus souvent utilisés pour limiter l'accès concurrentiel, à un objet, ou à une partie de code (C'est dire de limiter le nombre de thread pouvant exécuter la même fonction) ou encore limiter l'accès à des ressources telles que des ports série.
Concepts de processus/thread concurrents Processus/thread concurrents WINDOWS NT (2000) (API WIN32) –Synchronisation des thread »Les principaux objets de synchronisation de l'API WIN32 sont les suivants: »OBJETS DE SYNCHRONISATION: »SEMAPHORE: »Comme plusieurs threads peuvent modifier le compte d'un sémaphore, il n'est donc pas considéré comme la propriété d'un thread, contrairement aux sections critiques et mutex. »Lorsqu'on crée un sémaphore avec la fonction CreateSemaphore() on doit lui indiquer sa valeur initiale et son compte maximum (Richter p358). »Le programme Semapho.c, fournit en exemple est une version modifiée du programme Mutex qui utilise l'objet de synchronisation semaphore. Dans cet exemple il n'y a qu'une ressource qui est constituée des deux variables globales contenant le numéro séquentiel de la lecture et la valeur lue.
Concepts de processus/thread concurrents Processus/thread concurrents WINDOWS NT (2000) (API WIN32) –Synchronisation des thread (Projet Semaphore: Procédure WinMain())
Concepts de processus/thread concurrents Processus/thread concurrents WINDOWS NT (2000) (API WIN32) –Synchronisation des thread (Projet Semaphore: Procédure Dlg_OnInitDialog())
Concepts de processus/thread concurrents Processus/thread concurrents WINDOWS NT (2000) (API WIN32) –Synchronisation des thread (Projet Semaphore: Procédure AcquisitionThread())
Concepts de processus/thread concurrents Processus/thread concurrents WINDOWS NT (2000) (API WIN32) –Synchronisation des thread (Projet Semaphore: Procédure AcquisitionThread())
Concepts de processus/thread concurrents Processus/thread concurrents WINDOWS NT (2000) (API WIN32) –Synchronisation des thread (Projet Semaphore: Procédure DisplayThread())
Concepts de processus/thread concurrents Processus/thread concurrents WINDOWS NT (2000) (API WIN32) –Synchronisation des thread »Les principaux objets de synchronisation de l'API WIN32 sont les suivants: »OBJETS DE SYNCHRONISATION: »MINUTERIE: »Les horloges de temporisation sont des objets du noyau qui se signalent eux-même à une heure prédéterminée (Richter p431). »Pour créer une horloge de temporisation il suffit d'appeler la fonction CreateWaitableTimer(). »Une fois créé, on configure l'horloge de temporisation avec SetWaitableTimer(). Le 2ième paramètre de cette fonction (*pDueTime) indique l'heure ou l'on veut que l'horloge s'active pour la première fois, et le 3ième paramètre (lPeriod) indique la période de temporisation pour les fois suivantes.
Concepts de processus/thread concurrents Processus/thread concurrents WINDOWS NT (2000) (API WIN32) –Synchronisation des thread »Les principaux objets de synchronisation de l'API WIN32 sont les suivants: »OBJETS DE SYNCHRONISATION: »MINUTERIE: »Par exemple on peut configurer l'horloge pour quelle s'active le 4 mars 2001 et quelle se réactive ensuite à tous les 6 heures d'intervalles (Richter p432). »Si vous donner une valeur négative (en nanosecondes) au 2ième paramètre, vous indiquez à la fonction de commencer à temporiser à partir de l'appel de SetWaitableTimer() pour le nombre de nanosecondes spécifiées (Richter p434). »Les horloges utilisateurs (définies avec SetTimer() ) ne sont pas implémentées dans le noyau du système d'exploitation. Donc, les horloges de temporisation consomment moins de ressources CPU que les horloges utilisateurs.
Concepts de processus/thread concurrents Processus/thread concurrents WINDOWS NT (2000) (API WIN32) –Synchronisation des thread »Les principaux objets de synchronisation de l'API WIN32 sont les suivants: »OBJETS DE SYNCHRONISATION: »MINUTERIE: »Les horloges utilisateurs génèrent des messages WM_TIMER qui reviennent au thread qui a appelé SetTimer() (Richter p437). »Ainsi un seul thread reçoit le message lorsque l'horloge utilisateur arrive à la fin de son temps. »Cependant, plusieurs threads peuvent attendre sur une horloge de temporisation. Le message WM_TIMER envoyé par les horloges utilisateur a cependant le désavantage d'être toujours de basse priorité. De plus, les intervalles de temps entre chaque événements (message WM_TIMER) deviennent imprécis lorsque l'intervalle de temps requis est inférieur à 100 millisecondes. (Richter p269).
Concepts de processus/thread concurrents Processus/thread concurrents WINDOWS NT (2000) (API WIN32) –Synchronisation des thread »Les principaux objets de synchronisation de l'API WIN32 sont les suivants: »OBJETS DE SYNCHRONISATION: »SUSPENSION DE THREAD »Comme nous l'avons vu, WaitForSingleObject() et WaitForMultipleObject() sont les fonctions les plus souvent utilisées par les threads pour se suspendre (Richter p438). » D'autres fonctions existent et la plus simple est certainement Sleep() qui suspend le thread pour un laps de temps spécifié en paramètre (millisecondes). »Il y a aussi les Entrée/Sortie asynchrones, les fonctions WaitForInputIdle(), MsgWaitForMultipleObjects(), WaitForDebugEvent(), SignalObjectAndWait() supportées seulement par Windows NT4/2000 qui signalent un objet du noyau (mutex, sémaphore etc.) et se met en attente sur un autre objet.