# R3.05 # Programmation système 2025 Pomme Pompeani CC-BY-SA-NC --- ## Programmation concurrente --- ## Possibilités permises par le parallèlisme - Utiliser plus de capacité de calcul - Ne pas attendre la fin d'opérations longues (I/O, user input, swap...)
--- ## Exemples Problèmes très facilement paralléllisables : - Recherche en brute force - [Algorithmes génétiques](https://abelchiao.github.io/genetic-algorithm-visualization/) - ... [Wikipedia : Embarrassingly parallel](https://en.wikipedia.org/wiki/Embarrassingly_parallel) --- ## Problèmes introduits par le parallèlisme Deux grandes classes de problèmes - Accès concurrent à une ressource - Synchronisation entre plusieurs tâches --- ## Accès concurrent Exemples de ressources : - Variable - Fichier - Base de données - Connexion ---- Exemple `cars.c` Note: Aller voir le asciinema dans le TP5 ---- Exemple `gplusplus.c` ---- `G = G + 1` / `G = G + 1` **Thread A** / **Thread B** 1A : Lire var G / 1B : Lire var G 2A : Ajouter 1 à copie var G / 2B : Ajouter 1 à copie var G 3A : Écrire rés dans var G / 3B : Écrire rés dans var G ---- ### Exclusion mutuelle Identifier et protéger les sections critiques Note: Aller voir dans le code quelle est la section critique ---- ### Mutex **Mut**_ual_ **Ex**_clusion_ 2 opérations : - Lock : prendre le verrou - Unlock : relacher le verrou Engagement : - Un seul thread peut avoir le verrou. - Les 2 opérations sont **atomiques** - **Seul le thread qui a pris le mutex peut le libérer** ---- Correction exemple `gplusplus.c` Note: mutex pthread_mutex_init(&mutex, NULL); pthread_mutex_lock(&mutex); pthread_mutex_unlock(&mutex); --- ## Synchronisation / communication Producteurs / consommateurs ---- ### Sémaphores Mutex = booléen Sémaphore = integer - ➖ souvent utilisé pour ressource partagée - ➕ souvent utilisé pour des signaux ---- ### Producteur / consommateur - 1 (ou n) thread qui produit des données - 1 (ou n) thread qui utilise ces données → Channel ---- Channel. basé sur un ring buffer : 