web-dev-qa-db-fra.com

Quelle est la différence entre un verrou exclusif et un verrou partagé?

Selon Wikipédia,

Les verrous partagés sont parfois appelés "verrous de lecture" et les verrous exclusifs, parfois "verrous d'écriture".

Pouvez-vous expliquer le raisonnement derrière les termes "partagé" et "exclusif"?

92
Rose Perrone

J'ai écrit cette réponse parce que je pensais que ce serait une analogie amusante (et appropriée):

Pensez à un objet verrouillable en tant que tableau noir (verrouillable) dans une salle de classe contenant un enseignant (écrivain) et plusieurs étudiants (lecteurs).

Pendant qu’un enseignant écrit quelque chose (verrou exclusif) au tableau:

  1. Personne ne peut le lire, car il est toujours en cours d’écriture et elle bloque votre vue => Si un objet est exclusivement verrouillé, il n’est pas possible d’obtenir un verrou partagé.

  2. Les autres enseignants ne commenceront pas à écrire et le tableau deviendra illisible et déroutera les étudiants => si un objet est exclusivement verrouillé, aucun autre verrou exclusif ne peut être obten.

Lorsque les élèves lisent (verrous partagés) ce qui est au tableau:

  1. Ils peuvent tous lire ce qui est dessus, ensemble => plusieurs verrous partagés peuvent coexister.

  2. L'enseignant attend la fin de la lecture avant d'effacer le tableau pour en écrire plus => si un ou plusieurs verrous partagés existent déjà, vous ne pouvez pas obtenir de verrous exclusifs.

354
ArjunShankar

C'est assez simple. Les verrous de lecture sont également appelés verrous partagés, car plusieurs processus peuvent lire en même temps. L'intérêt d'un verrou en lecture est d'empêcher l'acquisition d'un verrou en écriture par un autre processus. En revanche, un verrou en écriture inhibe toutes les autres opérations pendant qu’une opération en écriture s’achève, raison pour laquelle il est décrit comme exclusif.

Donc, un verrou de lecture indique "vous pouvez lire maintenant, mais si vous voulez écrire, vous devez attendre", tandis qu'un verrou en écriture indique "vous devrez attendre".


Je me rends compte que vous effectuez des recherches à l'appui de vos études, mais je ne peux résister à l'envie de donner des conférences.

L'utilisation inadéquate du verrouillage est l'une des principales causes de problèmes de performances. L'utilisation d'un système de verrouillage qui différencie les verrous en lecture et en écriture est un bon début, mais une conception minutieuse peut parfois éliminer une grande partie du besoin de verrouiller. Par exemple, l'état de session devrait jamais être contenu dans une collection globale par élément d'état.

J'ai effectivement vu cela fait. C'est une conception atroce, entraînant la boxe et un changement de collection à chaque dernier changement d'état de session, entraînant un verrouillage en écriture prolongé. Les frais généraux étaient rédhibitoires, réduisant efficacement le serveur à un comportement à un seul thread.

Le simple fait de regrouper tous les états de session dans une structure constituait une énorme amélioration. Les modifications apportées à l'état de session ont simplement changé les valeurs des membres de la structure d'état d'une session. Comme aucune autre session n'a eu l'occasion ni même l'occasion de faire directement référence à l'état d'une session, la seule collection mise à jour était la liste des sessions. En conséquence, le verrouillage était totalement inutile pendant une session, uniquement au début et à la fin, et le débit a été multiplié par 3000.

L'autre scénario de verrouillage commun concerne les ressources partagées entre les threads d'une application utilisateur. La plupart des frameworks modernes traitent cela en utilisant des messages plutôt que des verrous; lorsque vous "passez au fil de l'interface utilisateur", vous mettez en file d'attente un message contenant un pointeur de fonction et certains paramètres (ou un délégué et un cadre de pile, en fonction de l'implémentation).

28
Peter Wone
  • Un verrou exclusif ou un verrou en écriture donne à un processus un accès exclusif à l'écriture sur la partie spécifiée du fichier. Lorsqu'un verrouillage en écriture est en place, aucun autre processus ne peut verrouiller cette partie du fichier.

  • Un verrou partagé ou en lecture empêche tout autre processus de demander un verrou en écriture sur la partie spécifiée du fichier. Cependant, d'autres processus peuvent demander des verrous de lecture.

Plus à ce sujet: http://www.gnu.org/software/libc/manual/html_node/File-Locks.html

5
TOC

Principe identique du côté de la base de données. Selon la documentation Oracle

Le mode de verrouillage exclusif empêche le partage de la ressource associée. Ce mode de verrouillage est obtenu pour modifier les données. La première transaction à verrouiller exclusivement une ressource est la seule transaction pouvant modifier la ressource jusqu'à ce que le verrou exclusif soit libéré.

Le mode de verrouillage du partage permet de partager la ressource associée, en fonction des opérations impliquées. Plusieurs utilisateurs lisant des données peuvent partager les données, en maintenant des verrous de partage pour empêcher un accès simultané par un rédacteur (qui a besoin d'un verrou exclusif). Plusieurs transactions peuvent
acquiert des verrous de partage sur la même ressource.

2
user2155031