Quelles sont les principales différences entre un Moniteur et un Sémaphore ?
+1 Excellente analogie avec les toilettes publiques et la location de vélos. Je n'oublierai jamais la différence entre les deux maintenant.
Quelles sont les principales différences entre un Moniteur et un Sémaphore ?
A Moniteur est un objet conçu pour être accessible depuis plusieurs threads. Les fonctions ou méthodes membres d'un objet moniteur appliquent l'exclusion mutuelle, de sorte qu'un seul thread peut effectuer une action sur l'objet à un moment donné. Si un thread est en train d'exécuter une fonction membre de l'objet, tout autre thread qui tente d'appeler une fonction membre de cet objet devra attendre que le premier ait terminé.
A Sémaphore est un objet de niveau inférieur. Vous pouvez très bien utiliser un sémaphore pour implémenter un moniteur. Un sémaphore est essentiellement un compteur. Lorsque le compteur est positif, si un thread tente d'acquérir le sémaphore, il est autorisé et le compteur est décrémenté. Lorsqu'un thread a terminé, il libère le sémaphore et incrémente le compteur.
Si le compteur est déjà à zéro lorsqu'un thread tente d'acquérir le sémaphore, il doit attendre qu'un autre thread libère le sémaphore. Si plusieurs threads sont en attente lorsqu'un thread libère un sémaphore, alors l'un d'entre eux l'obtient. Le thread qui libère un sémaphore ne doit pas nécessairement être le même thread qui l'a acquis.
Un moniteur est comme des toilettes publiques. Une seule personne peut y entrer à la fois. Elle verrouille la porte pour empêcher toute autre personne d'entrer, fait ses besoins, puis la déverrouille en partant.
Un sémaphore est comme un lieu de location de vélos. Ils ont un certain nombre de vélos. Si vous essayez de louer un vélo et qu'ils en ont un de libre, vous pouvez le prendre, sinon vous devez attendre. Lorsque quelqu'un rend son vélo, un autre peut le prendre. Si vous avez un vélo, vous pouvez le donner à quelqu'un d'autre pour qu'il le rende --- le loueur de vélos ne se soucie pas de qui le rend, tant qu'il récupère son vélo.
+1 Excellente analogie avec les toilettes publiques et la location de vélos. Je n'oublierai jamais la différence entre les deux maintenant.
@Pacerier : Je le suis :-) La seule contradiction est le truc de haut niveau/bas niveau. Vous peut construire un moniteur à partir de sémaphores, ce n'est tout simplement pas très ordonné, précisément parce que un moniteur est une structure de plus haut niveau qu'un sémaphore. Un sémaphore est juste un compteur avec une attente. Je vous suggère de lire "The Little Book of Semaphores" (en anglais). greenteapress.com/semaphores
L'explication suivante explique en fait comment wait() et signal() du moniteur diffèrent de P et V du sémaphore.
El attendre() y signal() les opérations sur les variables de condition dans un moniteur sont similaires à P y V opérations de comptage sémaphores .
Une déclaration d'attente peut bloquer l'exécution d'un processus, tandis qu'une option relevé de signaux peut provoquer le déblocage d'un autre processus. Cependant, il existe des différences entre eux. Lorsqu'un processus exécute une opération P, il ne bloque pas nécessairement ce processus car le sémaphore de comptage peut être supérieur à zéro. En revanche, lorsqu'une instruction wait est exécutée, elle bloque toujours le processus. Lorsqu'une tâche exécute une opération V sur un sémaphore, soit elle débloque une tâche en attente sur ce sémaphore, soit elle incrémente le compteur du sémaphore s'il n'y a pas de tâche à débloquer. En revanche, si un processus exécute une instruction de signal alors qu'il n'y a aucun autre processus à débloquer, il n'y a aucun effet sur la variable de condition. Une autre différence entre les sémaphores et les moniteurs est que les utilisateurs réveillés par une opération V peuvent reprendre l'exécution sans délai. Au contraire, les utilisateurs réveillés par une opération de signal ne sont relancés que lorsque le moniteur est déverrouillé. En outre, une solution de moniteur est plus structurée que celle des sémaphores car les données et les procédures sont encapsulées dans un seul module et que l'exclusion mutuelle est assurée automatiquement par l'implémentation.
Lien : aquí pour une lecture plus approfondie. J'espère que cela vous aidera.
Mais alors, en quoi un Monitor diffère-t-il d'un MutEx ? Un verrou d'exclusion mutuelle fait exactement la même chose qu'un sémaphore, mais ne permet qu'à un seul thread d'accéder à la région critique à la fois.
Il convient de noter que les sémaphores ne contrôlent pas l'accès à un objet partagé, mais plutôt à une ressource partagée (qui contient plusieurs objets).
Un moniteur est un ensemble de routines multiples qui sont protégées par un verrou d'exclusion mutuelle. alors que , Un sémaphore est une construction plus simple qu'un moniteur car c'est juste un verrou qui protège une ressource partagée - et non un ensemble de routines comme un moniteur. L'application doit acquérir le verrou avant d'utiliser la ressource partagée protégée par un sémaphore.
Les moniteurs et les sémaphores sont utilisés dans le même but : la synchronisation des fils. Mais les moniteurs sont plus simples à utiliser que les sémaphores car ils gèrent tous les détails de l'acquisition et de la libération des verrous.
Une autre différence dans l'utilisation des sémaphores est que chaque routine accédant à une ressource partagée doit explicitement acquérir un verrou avant d'utiliser la ressource. Ceci peut être facilement oublié lors du codage des routines traitant du multithreading. Les moniteurs, contrairement aux sémaphores, acquièrent automatiquement les verrous nécessaires.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
9 votes
Vous pouvez considérer le moniteur comme un sémaphore binaire.
0 votes
Similaire : stackoverflow.com/q/3547030/158779
2 votes
S'il vous plaît passer par ce albahari.com/threading/part2.aspx . J'ai lu cet article, le meilleur que j'ai jamais lu sur le Threading.
5 votes
Je ne pense pas que tu aies raison, Maxim. Un sémaphore est une structure de "niveau inférieur", si je ne me trompe pas, alors qu'un moniteur est un objet à part entière. Je me souviens que nous avons brièvement parlé des moniteurs dans mon cours sur les systèmes d'exploitation à l'université, mais je ne me souviens pas en quoi un moniteur différait d'un Mutex, à part le fait qu'il soit orienté objet. Je me souviens qu'un problème pouvait être résolu à l'aide de moniteurs, mais que nous ne pouvions pas utiliser cette même méthode en classe, en raison des restrictions du langage C.
1 votes
Sémaphore et Monitor sont très différents, mais de puissance équivalente, dans le sens où vous pouvez implémenter l'un à partir de l'autre. Vous pouvez lire l'article original de Hoare qui prouve leur équivalence à l'adresse suivante aquí
0 votes
Un sémaphore est un cas particulier de moniteur - un dont les opérateurs sont V & P (signal & wait, etc.). Les éléments particuliers d'une langue ou d'une bibliothèque particulière qui portent ces noms dépendent de la langue ou de la bibliothèque en question.
0 votes
@MaximEgorushkin Vous voulez dire qu'un mutex est un sémaphore binaire.