diff --git a/tp/tp5/README.md b/tp/tp5/README.md new file mode 100644 index 0000000..89b7dd1 --- /dev/null +++ b/tp/tp5/README.md @@ -0,0 +1,6 @@ +# Signaux + +- partie 1 : [Parallèlisme avec processus](parallelisme.md) +- partie 2 : [Signaux](ordonnancement.md) + + diff --git a/tp/tp5/parallelisme.md b/tp/tp5/parallelisme.md new file mode 100644 index 0000000..1dd1fbf --- /dev/null +++ b/tp/tp5/parallelisme.md @@ -0,0 +1,46 @@ +# Signaux + +- partie 1 : [Parallèlisme avec processus](parallelisme.md) +- partie 2 : [Signaux](ordonnancement.md) + + +#### Ex1 +On veut écrire un programme calculant la somme des entiers +de `1` à `N` à l’aide de `K` processus enfants. Chaque fils calculera la somme +d’un sous-ensemble de ces entiers et la somme globale sera obtenue en +calculant la somme des résultats intermédiaires de chaque fils. Pour que le pére puisse collecter +les résultats de ses fils, il créera avec mmap un espace partagé avec ses fils : +```c +uint64_t *resultats = (uint64_t)mmap(NULL, K * sizeof(long), PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_ANONYMOUS, -1, 0); + + +Les entiers sont répartis uniformément entre les fils comme suit (exemple avec K=3) : + +Fils 1 : 1, 4, 7, ... +Fils 2 : 2, 5, 8, ... +Fils 3 : 3, 6, 9, ... + +Bien que les résultats soient connus d'avance (cf votre cours de mathématique sur les suites aritmétiques), le but +est de faire effectivement les calculs pour comparer les gains (?) de la parallèlisation. + +1. Écrique une fonction + ```C + void slice(uint64_t *res, uint64_t start, uint64_t end,uint64_t step); + ``` + qui calcule la somme d'une tranche d'entiers, et place le résultat dans `*res`. + +2. Complétez le main pour : + 1. Créer les `K` fils + 2. Chaque fils exécute la fonction précedente, avec les bons paramètres. + 3. Le pére attend la fin des fils, collecte leurs résultats intermédiaires, et en + fait la somme. + +3. Pour limite `N` assez grande, faites varier le nombre de processus, et construire un graphe + qui affiche le temps de calcul en fonction du nombre de processus. Qu'observez-vous ? + +4. De manière volontaire, faites en sorte que la fonction slice n'utilise pas une variable locale pour + faire sa somme, mais la référence `res`. Recommencez la question 3. Qu'observez-vous ? Pourquoi ? + + +