Sémaphores et moniteurs
Le sémaphore (compteur et file d'attente), ses opérations P et V, ses quatre usages, puis le moniteur : un verrou et des variables de condition, wait, signal, broadcast et la boucle autour de wait.
- 26 cartes
- 5 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
- Comprendre
Quelques cartes du deck
Sémaphore : de quoi s'agit-il ?
Voir la réponse
Compteur entier qui ne descend jamais sous 0, associé à une file de threads endormis ; on ne le manipule que par deux opérations atomiques.
Sa valeur initiale décide de son rôle : 1 pour une exclusion, N pour une limite, 0 pour attendre un signal.
Le sémaphore
svaut 0 au départ. Qu'affiche ce programme, quel que soit l'ordre dans lequel les threads sont lancés ?
```c
/* thread 1 */ /* thread 2 */
sem_wait(&s); printf("A");
printf("B"); sem_post(&s);`ABBAABouBAselon l'ordonnanceur- Rien : les deux threads se bloquent
Voir la réponse
ABLe thread 1 ne passe sem_wait qu'après le sem_post du thread 2, qui vient après l'affichage de A. Si le thread 2 passe d'abord, le jeton est conservé : le sémaphore vaut 1 et sem_wait passera sans attendre.
Initialisé à …, un sémaphore sert d'exclusion mutuelle ; initialisé à …, il fait attendre un thread jusqu'à ce qu'un autre signale.
Voir la réponse
Initialisé à 1, un sémaphore sert d'exclusion mutuelle ; initialisé à 0, il fait attendre un thread jusqu'à ce qu'un autre signale.
À 1, le premier P passe et les suivants attendent le V. À 0, tout P attend, jusqu'au premier V d'un autre thread.
Opération P (sem_wait) : de quoi s'agit-il ?
Voir la réponse
Prend un jeton : décrémente le compteur s'il est positif, sinon endort le thread appelant jusqu'à ce qu'un jeton soit rendu.
P sur un sémaphore à 0 bloque : c'est le seul cas où P attend. En POSIX, c'est sem_wait.
Un serveur ne doit jamais ouvrir plus de dix connexions simultanées vers la base de données, quel que soit le nombre de threads. Quel outil, et avec quelle valeur initiale ?
- Un mutex, avec dix threads qui se partagent le verrou à tour de rôle
- Un sémaphore initialisé à 0, avec V avant chaque connexion et P après
- Un sémaphore initialisé à 1 pour chaque thread, pris avant la connexion
- Un sémaphore initialisé à 10, avec P avant la connexion et V après
Voir la réponse
Un sémaphore initialisé à 10, avec P avant la connexion et V après
Un mutex n'admet qu'un thread à la fois ; un sémaphore à N en admet N. Initialisé à 0, personne ne passerait jamais le premier P.