INF4033 - Partie 6 : Pour aller plus loin avec les Pthread PDF
Document Details
Uploaded by Deleted User
ESIEA
Alexandre BRIÈRE
Tags
Summary
This presentation covers various aspects of threads in programming, including thread management, signals, semaphores, unique execution, specific data, and scheduling in a computer system. It includes theoretical diagrams of the internal components and their usage.
Full Transcript
INF4033 - Partie 6 : Pour aller plus loin avec les Pthread Alexandre BRIÈRE [email protected] Plan Rappels Threads et gestion des processus Threads et signaux Les sémaphores Exécution unique d’une fonction Données spécifiq...
INF4033 - Partie 6 : Pour aller plus loin avec les Pthread Alexandre BRIÈRE [email protected] Plan Rappels Threads et gestion des processus Threads et signaux Les sémaphores Exécution unique d’une fonction Données spécifiques L’ordonnancement Rappels (1/2) Les threads sont des « processus légers » s’exécutant à l’intérieur d’un processus : partage de la mémoire (sauf pile) communications simplifiées (par passage de pointeurs) commutation entre threads plus rapide qu’entre processus Rappels (2/3) Gestion de la mémoire (par Andrew S. Tanenbaum CC BY-SA 3.0) Rappels (3/3) Pthread - création : pthread_create - destruction : pthread_exit - attente : pthread_join Mutex - création : pthread_mutex_init - destruction : pthread_mutex_destroy - acquisition : pthread_mutex_lock ou pthread_mutex_trylock - relâchement : pthread_mutex_unlock Condition - création : pthread_cond_init - destruction : pthread_cond_destroy - attente : pthread_cond_wait - réveil : pthread_cond_signal ou pthread_cond_broadcast —> exemple_1.c & exemple_2.c Threads et gestion des processus fork Le nouveau processus possède : Uniquement le thread ayant appelé fork Les données allouées sur le tas par TOUS les threads du processus parent => mais plus les threads pour les désallouer Les différents verrous possédés par TOUS les threads du processus parent => sans même le savoir et sans jamais les relâcher exec L’appel à exec dans un thread termine tous les autres threads. Le pthread appelant exécute le main du programme chargé. exit Un appel à exit dans un thread termine le processus et tous ses threads. Threads et signaux Envoyer un signal à un autre thread via : int pthread_kill( pthread_t id, // thread cible int signal) // signal envoyé Possède son propre masque qu’il hérite lors de sa création Modifie son masque via : int pthread_sigmask( int op, // opération à réaliser sigset_t *newSig, // nouveau masque sigset_t *oldSig) // ancien masque Attend un signal via : int sigwait( const sigset_t *ens, // ensemble des signaux attendus int *sig) // signal reçu Sémaphores Les mutex sont des « sémaphores binaires » Mutex : un unique thread en section critique Sémaphore : de 0 à N threads en section critique API int sem_init(sem_t *sem, int portee, unsigned valeur) int sem_wait(sem_t *sem) int sem_trywait(sem_t *sem) int sem_post(sem_t *sem) int sem_destroy(sem_t * sem) Exécution unique Pour les fonctions qui doivent s’exécuter une unique fois : ➡ Initialisation d’un mutex, d’une condition, etc. ➡ Ouverture d’un fichier ➡ Traitement particulier int pthread_once(pthread_once_t *once, void (*fonc)) once : variable externe statique de type pthread_once_t fonc : la fonction a n’exécuter qu’une seule fois —> exemple_3.c Données spécifiques Réserver un ensemble de données réparti entre les threads. Création de la clef : pthread_key_create Stockage d’une valeur : pthread_setspecific Récupération de la valeur : pthread_getspecific —> exemple_4.c Ordonnancement Un thread possède trois attributs d’ordonnancement : inheritsched : défini si les deux autres sont hérités schedpolicy : ➡ SCHED_OTHER : temps partagé ➡ SCHED_FIFO : temps partagé avec priorité ➡ SCHED_RR : temps partagé avec priorité et quantum schedparam : définie la priorité via le champs sched_priority On peut connaitre les différente priorité grâce à : int sched_get_priority_min(schedpolicy) int sched_get_priority_max(schedpolicy) —> exemple_5.c