web-dev-qa-db-fra.com

Différence entre les verrous Mutex, Semaphore et Spin

Je fais des expériences avec IPC, en particulier avec Mutex, Semaphore et Spin Lock. Ce que j'ai appris, c'est que Mutex est utilisé pour le mécanisme de verrouillage asynchrone (avec sommeil (selon les théories que j'ai lues sur NET)), le sémaphore est un mécanisme de verrouillage synchrone (avec signalisation et sommeil) et les verrous tournants sont un mécanisme synchrone mais sans sommeil.

Quelqu'un peut-il m'aider à clarifier ces choses en profondeur? Et un autre doute concerne Mutex, lorsque j'ai écrit un programme avec thread mutex, alors qu'un thread exécute un autre thread n'est pas en état de veille mais essaie continuellement d'acquérir le verrou. Alors Mutex dort ou ne dort pas ???

21
Novice

Tout d'abord, souvenez-vous de l'objectif de ces 'synchronisation des objets' :

Ces objets ont été conçus pour fournir un efficace et cohérent utilisation de 'données partagées' entre plus d'un thread parmi 1 processus ou de processus différents.

Ces objets peuvent être 'acquis' ou 'libérés' .

C'est tout !!! Fin de l'histoire !!!

Maintenant, si ça peut vous aider, laissez-moi mettre mon grain de sable:

1) Section critique= Objet utilisateur utilisé pour permettre l'exécution de seulement un thread actif à partir de beaucoup d'autres au sein d'un même processus . Les autres threads non sélectionnés (@ acquisition de cet objet) sont mis en sleep .

[Pas de capacité interprocessus, objet très primitif].

2) Mutex Semaphore (aka Mutex)= Objet noyau utilisé pour permettre l'exécution de seulement un thread actif parmi beaucoup d'autres, dans un processus ou parmi différents processus . Les autres threads non sélectionnés (@ acquisition de cet objet) sont mis en sleep . Cet objet prend en charge la propriété des threads, la notification de terminaison des threads, la récursivité (plusieurs appels "d'acquisition" à partir du même thread) et "l'évitement d'inversion de priorité".

[Capacité interprocessus, très sûre à utiliser, une sorte d'objet de synchronisation "de haut niveau"].

) Counting Semaphore (aka Semaphore)= Objet noyau utilisé pour permettre l'exécution de un groupe de threads actifs parmi beaucoup d'autres, dans un même processus ou parmi différents processus . Les autres threads non sélectionnés (@ acquisition de cet objet) sont mis en sleep .

[La capacité interprocessus n'est cependant pas très sûre à utiliser car elle n'a pas les attributs 'mutex' suivants: notification de terminaison de thread, récursivité?, 'Évitement d'inversion de priorité'?, Etc.].

4) Et maintenant, en parlant de "verrous tournants", d'abord quelques définitions:

Région critique = Région de mémoire partagée par 2 processus ou plus.

Lock = Une variable dont la valeur autorise ou refuse l'entrée d'une "région critique". (Il pourrait être implémenté comme un simple "drapeau booléen").

Attente occupée = Test continu d'une variable jusqu'à ce qu'une certaine valeur apparaisse.

Finalement:

Spin-lock (aka Spinlock)= A verrou qui utilise attente occupée . (L'acquisition du verrou se fait par xchg ou similaire opérations atomiques ).

[Aucun thread en veille, principalement utilisé au niveau du noyau uniquement. Ineffcient pour le code de niveau utilisateur].

En dernier commentaire, je ne suis pas sûr mais je peux vous parier que les 3 premiers objets de synchronisation ci-dessus (# 1, # 2 et # 3) utilisent cette bête simple (# 4) dans le cadre de leur mise en œuvre.

Bonne journée!.

Références:

-Concepts en temps réel pour les systèmes embarqués par Qing Li avec Caroline Yao (CMP Books).

-Systèmes d'exploitation modernes (3e) par Andrew Tanenbaum (Pearson Education International).

-Programmation d'applications pour Microsoft Windows (4e) par Jeffrey Richter (Microsoft Programming Series).

50
fante

Voici une excellente explication de la différence entre les sémaphores et les mutex:

http://blog.feabhas.com/2009/09/mutex-vs-semaphores- –- part-1-semaphores /

La réponse courte concerne la propriété au moins des sémaphores binaires, mais je vous suggère de lire l'article en entier.

2
smyrgl