La mémoire partagée
Un segment commun à plusieurs processus avec shm_open, ftruncate, mmap en MAP_SHARED, munmap et shm_unlink, l'absence de synchronisation et le sémaphore, puis le choix entre tube, signal et mémoire partagée.
- 24 cartes
- 4 thèmes
- Gratuit
Le programme, thème par thème
Le poids de chaque thème suit celui que lui donne l'examen.
- Notions
- Questions
- Ranger et relier
- Mises en situation
Quelques cartes du deck
Mémoire partagée : de quoi s'agit-il ?
Voir la réponse
Zone que plusieurs processus projettent dans leur espace d'adressage : ce que l'un y écrit, les autres le voient, sans copie faite par le noyau.
C'est le moyen de communication le plus rapide entre processus d'une même machine. Mais le système n'y met aucune règle : c'est aux programmes de se coordonner.
Que valent a et *p affichés par le père, tous deux partis de 0 ?
```c
int a = 0;
int *p = mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE,
MAP_SHARED | MAP_ANONYMOUS, -1, 0);
*p = 0;
if (fork() == 0) { a = 7; *p = 7; _exit(0); }
wait(NULL);
printf("%d %d\n", a, *p);`0 77 70 07 0
Voir la réponse
0 7Après
fork,aexiste en deux exemplaires indépendants : le fils modifie le sien.*p, lui, désigne la même page physique dans les deux processus. Programme exécuté :0 7.Un segment neuf créé par shm_open a une taille … : il faut appeler … avant de le projeter avec mmap.
Voir la réponse
Un segment neuf créé par shm_open a une taille nulle : il faut appeler ftruncate avant de le projeter avec mmap.
Toucher une page au-delà de la fin du segment provoque
SIGBUS.ftruncate(fd, taille)réserve la place.shm_open : de quoi s'agit-il ?
Voir la réponse
Appel qui crée ou ouvre un segment désigné par un nom de la forme /nom, et rend un descripteur de fichier.
Deux processus qui ouvrent le même nom obtiennent le même segment. Un segment neuf a une taille nulle : il faut
ftruncateavant de le projeter pour l'utiliser.Deux processus partagent un tampon en mémoire partagée : l'un écrit une structure de plusieurs champs, l'autre la lit. Le lecteur obtient parfois des structures à moitié mises à jour. Que faire ?
- Protéger les accès par un sémaphore partagé
- Projeter en MAP_PRIVATE pour que chacun ait sa copie à jour
- Rappeler ftruncate pour que le segment soit assez grand
- Appeler shm_unlink avant chaque lecture pour vider le segment
Voir la réponse
Protéger les accès par un sémaphore partagé
Le lecteur passe pendant que l'écrivain n'a pas fini : rien dans la mémoire partagée n'impose d'attendre. Le sémaphore fait de l'écriture et de la lecture des sections qui ne se chevauchent pas.
MAP_PRIVATEcouperait la communication.