Systèmes d’Exploitation Chapitre 6 Sémaphores F. Moal 2012/2013 Sémaphores Par DIJKSTRA – 1971 Idée : encapsuler les solutions diverses au pb de la section critique pour fournir une interface unique et assurer la portabilité. 2 Sémaphores Définition : un sémaphore est une variable S de type entier à laquelle on ne peut accéder que par 2 opérations : P [puis-je ?] V [vas-y] 3 Sémaphores P : je m’approprie le jeton si je peux Entrée en section critique V : je restitue le jeton Sortie de la section critique S : nombre de jetons dans la boite 4 Sémaphores Solution : Procédure P(S) tant que S ≤ 0 faire rien ftq S = S-1 Procédure V(S) S = S+1 P et V : opérations rendues atomiques par l’OS 5 Sémaphores Eviter l’attente active : Introduction d’un nouvel état [attente] pour les processus réveil Attente Actif mise en attente 6 Sémaphores Gestion de l’état d’attente : Scheduling = gestion par l’OS de l’accès au processeur par les processus Scheduler = procédure de l’OS qui effectue le scheduling Gestion de 2 listes : process actifs, process en attente. 7 Sémaphores Les algorithmes réalisant une exclusion mutuelle sont difficiles à généraliser sémaphore = type de données abstrait composée d'un compteur entier [initialisé à une valeur constante] opération P opération V Procédure P(sema : sémaphore); {Puis-je continuer?} tantque sema.compteur = 0 faire suspendre(sema); ftq sema.compteur := sema.compteur – 1; Procédure V(sema : sémaphore); {Vas-y} sema.compteur := sema.compteur + 1; Réveiller(sema); 8 Sémaphores Réalisation des Sémaphores Sémaphore = structure compteur : entier; file : liste [d'identificateurs] de processus fin de structure; L'identificateur de processus permet de trouver le descriptif de ce processus qui contient ses caractéristiques principales : . état nom ressources détenues localisation dans la mémoire contenu des registres lors de la suspension (s'il n'est pas actif) 9 Sémaphores Réalisation Logicielle [traduction directe de la spécification fonctionnelle] procédure P(sema : sémaphore); si << sema.compteur > 0 alors sema.compteur := sema.compteur - 1; sinon suspendre le processus demandeur; mettre son identificateur dans sema.file; (re)lancer un processus prêt; fsi >> procédure V(sema : sémaphore); si << vide(sema.file) alors sema.compteur := sema.compteur + 1; sinon enlever un identificateur de la file; réveiller le processus correspondant; fsi >> 10 Sémaphores Remarques : On suppose que suspendre et réveiller n'ont pas d'identificateur d'attente. Par rapport à la spécification fonctionnelle, c'est le processus exécutant un V qui réévalue la condition permettant de réveiller un processus suspendu. Celui-ci pourra ensuite continuer son exécution, dès qu'il aura reçu un processeur, comme s'il n'avait pas été suspendu. La politique de gestion de la file peut être quelconque (priorité, LIFO, FIFO, ...). Si elle n'est pas FIFO, il y a risque de famine. Si un V débloque un processus, ou bien le processeur est alloué au processus débloqué, ou bien il est laissé au processus qui a fait le V (cas le plus fréquent). 11 Sémaphores Réalisation Matérielle De nombreuses machines proposent maintenant des opérations P et V microprogrammées ou câblées, ce qui règle aussi le problème de l'exclusion mutuelle pour l'accès au compteur et à la file. Réalisation dans un système réparti sans mémoire commune : la gestion des sémaphores est généralement confiée à un processeur spécifique. 12 Sémaphores Réalisation d'exclusion mutuelle au moyen de sémaphores variable commune mutex : sémaphore initialisé à 1; Processus P1 P(mutex); section critique; V(mutex); Processus P2 P(mutex); section critique; V(mutex); pas deux processus en section critique à la fois [ le premier processus qui entre en exclusion mutuelle fait passer le compteur du sémaphore mutex à 0 ce qui bloque toute entrée d'un autre processus ] Lorsque le premier sort de l'exclusion mutuelle il rétablit le compteur à 1 ce qui permet à un éventuel processus bloqué de continuer. 13 Sémaphores Graphes de précédence Comment mettre en œuvre les contraintes de précédence en utilisant les sémaphores ? P1 P2 T1 T’1 Exemple : T’2 T2 T’3 14 Sémaphores Graphes de précédence P1 et P2 : programmes séquentiels Pas besoin d’implanter les contraintes de séquences ! P1 P2 T1 T’1 T’2 P1 : T1 ; T2 P2 : T1 ; T2 ; T3 T2 Reste : T1 T’3 T’2 15 Sémaphores Graphes de précédence Méthode systématique ??? T1 T2 T3 T4 16 Sémaphores Réalisation d’un Producteur/consommateur avec tampon infini Un sémaphore NPLEIN permet de contrôler l'accès du consommateur au tampon. La valeur de son compteur représente le nombre de cases pleines dans le tampon. 17 Sémaphores Producteur/consommateur déclarations communes : type messages : suite de caractères; variables communes : tampon : tableau [1 .. °] de messages; NPLEIN : sémaphore initialisé à 0; Processus Producteur Processus Consommateur variables privées : mess1 : messages; tête : entier initialisé à 1; répéter produire (mess1); tampon[tête]:= mess1; tête := tête + 1; V(NPLEIN); jusqu'à faux; variables privées : mess2 : messages; queue : entier initialisé à 1; répéter P(NPLEIN); mess2 := tampon[queue] queue := queue + 1; consommer(mess2); jusqu'à faux; 18 Sémaphores Producteur/consommateur déclarations communes : type messages : suite de caractères; variables communes : tampon : taille finie ? 19 Sémaphores Rendez-vous ? 20 Sémaphores Les philosophes mangeurs de spaghettis 21 Sémaphores Les philosophes mangeurs de spaghettis Règles de politesse : Un philosophe ne partage ses baguettes qu'avec ses voisins immédiats. Un philosophe qui réfléchit n'utilise pas de baguette. Un philosophe peut donc manger si ses deux voisins réfléchissent. Un philosophe est susceptible et on ne peut lui enlever une baguette . Un philosophe ne mange que pendant un temps fini. Un philosophe ne se permet pas de manger avec les doigts. 22