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.

  1. Notions
  2. Questions
  3. Ranger et relier
  4. Mises en situation
  5. 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 s vaut 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);
    `

    • AB
    • BA
    • AB ou BA selon l'ordonnanceur
    • Rien : les deux threads se bloquent
    Voir la réponse

    AB

    Le 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.