web-dev-qa-db-fra.com

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

Quelles sont les principales différences entre un Monitor et un Semaphore?

224
user919860

Un Monitor est un objet conçu pour être accessible à partir de plusieurs threads. Les fonctions membres ou les méthodes d'un objet de contrôle appliqueront une exclusion mutuelle. Par conséquent, un seul thread peut exécuter 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 essayant d'appeler une fonction membre de cet objet devra attendre que le premier soit terminé.

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 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 est 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 jusqu'à ce qu'un autre thread libère le sémaphore. Si plusieurs threads attendent lorsqu'un thread libère un sémaphore, l'un d'entre eux l'obtient. Le fil qui libère un sémaphore ne doit pas nécessairement être le même que celui qui l'a acquis.

Un moniteur est comme une toilette publique. Une seule personne peut entrer à la fois. Ils verrouillent la porte pour empêcher quiconque d'entrer, fassent leurs affaires, puis la déverrouillent quand 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 qu'il le rende - le service de location de vélo se soucie peu de savoir qui le rend, à condition qu'il récupère son vélo.

504
Anthony Williams

L'explication suivante explique en fait comment 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 semblables à P et V opérations de comptage de sémaphores .

Une instruction wait peut bloquer l'exécution d'un processus, tandis qu'une instruction signal peut provoquer le déblocage d'un autre processus. Cependant, il existe des différences entre elles. 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, 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. D'autre part, si un processus exécute une instruction de signal alors qu'il n'y a pas d'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é. De plus, une solution de moniteur est plus structurée que celle avec des sémaphores car les données et les procédures sont encapsulées dans un seul module et que l'exclusion mutuelle est fournie automatiquement par la mise en œuvre.

Lien: ici pour en savoir plus. J'espère que ça aide.

9
Abu Shumon

Réponse en une ligne:

Monitor: contrôle qu'un seul thread à la fois peut être exécuté dans le moniteur. (besoin d'acquérir un verrou pour exécuter le seul thread)

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

6
Billz

Semaphore 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

5
tafoo85

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 permettant à seulement 50 passagers d’acquérir les 50 places (ressource partagée) de n’importe quel théâtre/bus/train/tour/salle de classe. Et autoriser un nouveau passager uniquement si une personne quitte son siège.
  2. Un drapeau binaire indiquant le statut libre/occupé de toute salle de bains.
  3. Les feux de circulation sont un bon exemple de drapeau. Ils contrôlent le 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 ni aucune autre information sur les objets en attente ou en cours d'exécution sur la ressource.

Moniteur:

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

Exemple:

  1. Un père peut surveiller sa fille, lui permettant de sortir avec un seul garçon à la fois.
  2. Un enseignant utilise un bâton pour permettre à un seul enfant de parler dans la classe.
  3. Enfin, technique, les transactions (via les threads) sur un objet Account synchronisées pour maintenir l’intégrité.
2
Barun

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éger. Cela fait partie de la raison pour laquelle les sémaphores peuvent être dispersés autour du code et pourquoi il est facile d’oublier d’appeler wait ou notify , auquel cas le résultat sera respectivement de violer l'exclusion mutuelle ou de verrouiller la ressource de façon permanente.

En revanche, la résolution de ces problèmes peut se produire avec un moniteur. Un moniteur est fatigué directement par les données (il encapsule les données) et, comme les opérations du moniteur sont des actions atomiques, il est impossible d'écrire du code permettant d'accéder aux données sans appeler le protocole de saisie. Le protocole de sortie est appelé automatiquement à la fin de l'opération du moniteur.

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

Tiré du matériel de cours "Openacting process" du module 3 de l’Université M362.

2
e.doroskevic