Sémaphore vs moniteurs - quelle est la différence?

233

Quelles sont les principales différences entre un moniteur et un sémaphore ?

user919860
la source
8
Vous pouvez considérer le moniteur comme un sémaphore binaire.
Maxim Egorushkin
similaire: stackoverflow.com/q/3547030/158779
Brian Gideon
1
Veuillez consulter cet albahari.com/threading/part2.aspx . J'ai lu cet article, le meilleur que j'aie jamais lu sur Threading
Shantanu Gupta
5
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 examiné brièvement les moniteurs dans ma classe de systèmes d'exploitation au collège, mais je ne me souviens pas en quoi un moniteur différait d'un Mutex, à part qu'il était orienté objet. Je me souviens qu'un problème pouvait être fait en utilisant des moniteurs, mais nous ne pouvions pas utiliser cette même méthode en classe, en raison des restrictions du langage C.
user919860
1
Semaphore et Monitor sont très différents, mais équivalents en puissance, dans le sens où vous pouvez les implémenter l'un par rapport à l'autre. Vous pouvez lire le document original de Hoare qui prouve leur équivalence d' ici
Thanh DK

Réponses:

529

Un moniteur est un objet conçu pour être accessible à partir de plusieurs threads. Les fonctions ou méthodes membres d'un objet moniteur appliqueront l'exclusion mutuelle, de sorte qu'un seul thread peut effectuer une action sur l'objet à un moment donné. Si un thread exécute actuellement une fonction membre de l'objet, tout autre thread qui tente d'appeler une fonction membre de cet objet devra attendre la fin du premier.

Un sémaphore est un objet de niveau inférieur. Vous pourriez bien utiliser un sémaphore pour implémenter un moniteur. Un sémaphore n'est essentiellement qu'un compteur. Lorsque le compteur est positif, si un thread essaie d'acquérir le sémaphore, il est autorisé et le compteur est décrémenté. Lorsqu'un thread est terminé, il libère le sémaphore et incrémente le compteur.

Si le compteur est déjà nul lorsqu'un thread essaie d'acquérir le sémaphore, il doit attendre qu'un autre thread libère le sémaphore. Si plusieurs threads attendent lorsqu'un thread libère un sémaphore, l'un d'eux l'obtient. Le thread qui libère un sémaphore n'a pas besoin d'être le même thread qui l'a acquis.

Un moniteur est comme une toilette publique. Une seule personne peut participer à la fois. Ils verrouillent la porte pour empêcher quiconque d'entrer, font leurs affaires, puis la déverrouillent lorsqu'ils partent.

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 gratuitement, vous pouvez le prendre, sinon vous devez attendre. Quand quelqu'un rend son vélo, quelqu'un d'autre peut le prendre. Si vous avez un vélo, vous pouvez le donner à quelqu'un d'autre pour le retourner --- le lieu de location de vélos ne se soucie pas de qui le rend, tant qu'il récupère son vélo.

Anthony Williams
la source
162
+1 Grande analogie avec les toilettes publiques et le lieu de location de vélos. Je n'oublierai jamais la différence entre les deux maintenant.
Drupad Panchal
4
Votre réponse semble contredire stackoverflow.com/a/7336799/632951 .. alors qui a raison?
Pacerier
6
@Pacerier: Je suis :-) La seule contradiction est la chose de haut niveau / bas niveau. Vous pouvez construire un moniteur à partir de sémaphores, ce n'est tout simplement pas très bien rangé, précisément parce qu'un moniteur est une structure de niveau supérieur à un sémaphore. Un sémaphore n'est qu'un compteur d'attente. Je suggère de lire "Le petit livre des sémaphores" greenteapress.com/semaphores
Anthony Williams
3
@AnthonyWilliams: Je doute peut-être de l'idée que vous ne pouvez créer des moniteurs qu'à partir de sémaphores. L'autre façon est également possible et pour cette raison, nous ne pouvons pas dire à profusion que le moniteur est une entité de niveau supérieur aux sémaphores.
Kavish Dwivedi
5
Oui, vous pouvez créer un sémaphore à partir d'un moniteur. Vous pouvez toujours créer des objets de bas niveau à partir d'objets de haut niveau. Le truc de haut / bas niveau concerne les capacités et la portée des opérations, pas celles qui peuvent être utilisées pour construire l'autre.
Anthony Williams
11

L'explication suivante explique en fait en quoi wait () et signal () du moniteur diffèrent de P et V du sémaphore.

Les opérations wait () et signal () sur les variables de condition dans un moniteur sont similaires aux opérations P et V sur le comptage des sémaphores .

Une instruction d'attente peut bloquer l'exécution d'un processus, tandis qu'une instruction de signal peut entraîner le déblocage d'un autre processus. Cependant, il existe quelques différencesentre 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 d'attente est exécutée, elle bloque toujours le processus. Lorsqu'une tâche exécute une opération V sur un sémaphore, elle débloque une tâche en attente sur ce sémaphore ou incrémente le compteur de sémaphore s'il n'y a pas de tâche à déverrouiller. 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 redémarrés que lorsque le moniteur est déverrouillé. En outre,

Lien: ici pour plus de lecture. J'espère que ça aide.

Abu Shumon
la source
6

Réponse d'une ligne:

Moniteur: contrôle qu'un seul thread à la fois peut s'exécuter dans le moniteur. (besoin d'acquérir un verrou pour exécuter le thread unique)

Sémaphore: un verrou qui protège une ressource partagée. (besoin d'acquérir le verrou pour accéder à la ressource)

Billz
la source
5

Le sémaphore permet à plusieurs threads (jusqu'à un nombre défini) d'accéder à un objet partagé. Les moniteurs permettent un accès mutuellement exclusif à un objet partagé.

Moniteur

Sémaphore

tafoo85
la source
10
Mais alors, comment un moniteur différerait-il d'un MutEx? Un verrou d'exclusion mutuelle fait exactement la même chose qu'un sémaphore, mais n'autorise qu'un seul thread à accéder à la région critique à la fois.
user919860
2
Oui, quelle est la différence entre un mnitor et un mutex?
Pacerier
2
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 contiendra plusieurs objets).
xbonez
@xbonez: Si nous regardons java.util.ArrayList: est-ce un objet ou un conteneur de plusieurs objets? Eh bien, c'est les deux en même temps. Le sémaphore est-il donc approprié pour contrôler l'accès à celui-ci? Je dirais: non.
dma_k
Dans la réponse acceptée elle-même, il est mentionné que Monitor met en œuvre l'exclusion mutuelle. Veuillez voir "Les fonctions membres ou les méthodes d'un objet moniteur appliqueront l'exclusion mutuelle, donc un seul thread peut effectuer une action sur l'objet à un moment donné"
achoora
2

Lorsqu'un sémaphore est utilisé pour protéger une région critique, il n'y a pas de relation directe entre le sémaphore et les données protégées. Cela fait partie des raisons pour lesquelles les sémaphores peuvent être dispersés autour du code, et pourquoi il est facile d'oublier d'appeler wait ou de notifier , auquel cas le résultat sera, respectivement, de violer l'exclusion mutuelle ou de verrouiller la ressource de manière permanente.

En revanche, rien de tout cela ne peut arriver avec un moniteur. Un moniteur est fatigué directement des données (il encapsule les données) et, parce que les opérations du moniteur sont des actions atomiques, il est impossible d'écrire du code qui peut accéder aux données sans appeler le protocole d'entrée. Le protocole de sortie est appelé automatiquement lorsque l'opération du moniteur est terminée.

Un moniteur a un mécanisme intégré pour la synchronisation des conditions sous la forme d'une variable de condition avant de continuer. Si la condition n'est pas remplie, le processus doit attendre jusqu'à ce qu'il soit informé d'un changement dans la condition. Lorsqu'un processus attend la synchronisation des conditions, l'implémentation du moniteur prend en charge le problème d'exclusion mutuelle et permet à un autre processus d'accéder au moniteur.

Extrait du matériel de cours "Processus d'interaction" de l'Open University M362.

e.doroskevic
la source
Sauf que, bien que les sémaphores soient assez couramment mis à disposition dans une langue et présentés dans les manuels comme une sorte de variable avec des opérateurs atomiques limités, un sémaphore est un cas particulier d'un moniteur - car c'est une sorte de variable avec des opérateurs atomiques limités, parce que c'est ce qu'est un moniteur. Les arguments ci-dessus selon lesquels les sémaphores sont de "niveau inférieur" sont spécieux.
philipxy
2

Sémaphore:

L'utilisation d'un compteur ou d'un indicateur pour contrôler l'accès à certaines ressources partagées dans un système simultané implique l'utilisation de Semaphore .

Exemple:

  1. Un comptoir pour permettre à seulement 50 passagers d'acquérir les 50 sièges (ressource partagée) de n'importe quel théâtre / bus / train / balade amusante / salle de classe. Et pour autoriser un nouveau passager uniquement si quelqu'un quitte un siège.
  2. Un drapeau binaire indiquant l'état libre / occupé de toute salle de bain.
  3. Les feux de circulation sont un bon exemple de drapeaux. Ils contrôlent les flux en régulant le passage des véhicules sur les routes (ressource partagée)

Les indicateurs ne révèlent que l'état actuel de la ressource, aucun décompte ou toute autre information sur les objets en attente ou en cours d'exécution sur la ressource.

Moniteur:

Un moniteur synchronise l'accès à un objet en communiquant avec les threads intéressés par l'objet, en leur demandant d'acquérir l'accès ou d'attendre qu'une condition devienne vraie.

Exemple:

  1. Un père peut servir de moniteur pour sa fille, lui permettant de sortir avec un seul gars à la fois.
  2. Un instituteur utilise un bâton pour permettre à un seul enfant de parler en classe.
  3. Enfin technique, les transactions (via des threads) sur un objet Compte synchronisées pour maintenir l'intégrité.
Barun
la source
Je pense que le feu de circulation sur la route transversale est également un drapeau binaire: soit les voitures sur une route soit sur la route orthogonale peuvent conduire (mutuellement exclusives), donc l'exemple (3) est le même que (2). Je pense aussi que ces exemples sont des cas de coin pour les sémaphores (cas trivial), qui peuvent être implémentés à l'aide de moniteur. Il y a des exemples plus typiques dans wikipedia .
dma_k