2026-09-28 14:05:05 +02:00
|
|
|
|
# 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 :
|
2026-09-28 14:08:31 +02:00
|
|
|
|
|
2026-09-28 14:05:05 +02:00
|
|
|
|
```c
|
2026-10-01 18:51:24 +02:00
|
|
|
|
uint64_t *resultats = (uint64_t*)mmap(NULL, K * sizeof(uint64_t), PROT_READ | PROT_WRITE,
|
2026-09-28 14:05:05 +02:00
|
|
|
|
MAP_SHARED | MAP_ANONYMOUS, -1, 0);
|
2026-09-28 14:06:26 +02:00
|
|
|
|
```
|
2026-09-28 14:08:31 +02:00
|
|
|
|
> pourquoi est-ce nécessaire ?
|
2026-09-28 14:05:05 +02:00
|
|
|
|
|
|
|
|
|
|
Les entiers sont répartis uniformément entre les fils comme suit (exemple avec K=3) :
|
|
|
|
|
|
|
2026-09-28 14:06:46 +02:00
|
|
|
|
- Fils 1 : 1, 4, 7, ...
|
|
|
|
|
|
- Fils 2 : 2, 5, 8, ...
|
|
|
|
|
|
- Fils 3 : 3, 6, 9, ...
|
2026-09-28 14:05:05 +02:00
|
|
|
|
|
2026-09-28 14:07:45 +02:00
|
|
|
|
Bien que les résultats soient connus d'avance (cf votre cours de mathématiques sur les suites arithmétiques), le but
|
2026-09-28 14:05:05 +02:00
|
|
|
|
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.
|
|
|
|
|
|
|
2026-09-28 14:09:21 +02:00
|
|
|
|
3. Pour une limite `N` assez grande, faites varier le nombre de processus, et construire un graphe
|
2026-09-28 14:11:33 +02:00
|
|
|
|
qui affiche le temps de calcul en fonction du nombre de processus.
|
2026-09-28 14:11:04 +02:00
|
|
|
|
Qu'observez-vous ?
|
|
|
|
|
|
4. Lancez le processus sur un seul coeur avec `taskset`. Commentaire ?
|
2026-09-28 14:05:05 +02:00
|
|
|
|
|
|
|
|
|
|
4. De manière volontaire, faites en sorte que la fonction slice n'utilise pas une variable locale pour
|
2026-09-28 14:11:04 +02:00
|
|
|
|
faire la somme, mais la référence `res`. Recommencez la question 3. Qu'observez-vous ? Pourquoi ?
|
2026-09-28 14:05:05 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|