Quelle est la différence entre les verrous tournants et les sémaphores?


15

Quelles sont les différences fondamentales entre les verrous tournants et les sémaphores en action?



@Gilles J'ai aussi regardé celui-là, mais la seule mention de sémaphores sur la page est Warren commentant que "si l'on veut connaître la différence entre un verrou tournant et, disons, un sémaphore, c'est une question différente."
Michael Mrozek

@ Michael: ok, je pense que les réponses ont abordé le point principal, mais vous avez raison: aucune n'a explicitement déclaré que les sémaphores étaient l'un des autres types de verrous.
Gilles 'SO- arrête d'être méchant'

Explication par Linus Torvalds: yarchive.net/comp/linux/semaphores.html
myaut

Duplicate of stackoverflow.com/questions/195853/spinlock-versus-semaphore De nombreuses bonnes explications sont présentes dans le fil que j'ai demandé.
iankits

Réponses:


13

Les deux gèrent une ressource limitée. Je vais d'abord décrire la différence entre le sémaphore binaire (mutex) et le verrouillage de spin.

Les verrous tournants effectuent une attente occupée - c'est-à-dire qu'il continue de fonctionner en boucle:

while (try_acquire_resource ());
...
release();

Il effectue un verrouillage / déverrouillage très léger, mais si le thread de verrouillage est préempté par d'autres qui tenteront d'accéder au même resouce, le second essaiera simplement d'acquérir la ressource jusqu'à ce qu'elle soit épuisée. Quanta CPU.

D'un autre côté, les mutex se comportent plus comme:

if (!try_lock()) {
    add_to_waiting_queue ();
    wait();
}
...
process *p = get_next_process_from_waiting_queue ();
p->wakeUp ();   

Par conséquent, si le thread essaie d'acquérir une ressource bloquée, il sera suspendu jusqu'à ce qu'il soit disponible. Le verrouillage / déverrouillage est beaucoup plus lourd mais l'attente est «libre» et «équitable».

Le sémaphore est un verrou qui peut être utilisé plusieurs fois (connu par l'initialisation) plusieurs fois - par exemple, 3 threads sont autorisés à contenir simultanément la ressource, mais pas plus. Il est utilisé par exemple en cas de problème producteur / consommateur ou en général dans les files d'attente:

P(resources_sem)
resource = resources.pop()
...
resources.push(resources)
V(resources_sem)

Bonne explication, je veux juste souligner un point. Sémaphore vs mutex est une question d'interface: un mutex est maintenu ou non, tandis qu'un sémaphore est détenu par jusqu'à N threads; un mutex est un cas particulier de sémaphores avec N = 1. Spinlock vs autre type de verrou est une question d'implémentation: un spinlock continue d'essayer d'acquérir le verrou, tandis que d'autres types attendent une notification. Dans un contexte de noyau Linux, le seul verrou avec une implémentation de spin a une interface mutex.
Gilles 'SO- arrête d'être méchant'

Dans un contexte de noyau Linux, le seul verrou avec une implémentation de spin a une interface mutex. Je ne comprends pas cette ligne. Pourriez-vous, s'il vous plaît, développer cela?
Sen

@Sen: Il voulait dire que le verrou rotatif sous Linux se comportait en binaire (il est verrouillé ou non). Il est possible d'avoir un verrou tournant se comportant comme une sémaphore.
Maciej Piechotka

"Mais si le thread de verrouillage sera préempté par d'autres qui tenteront d'accéder aux mêmes ressources, le second essaiera simplement d'acquitter les ressources jusqu'à ce qu'elles soient épuisées quanta CPU.": Mais un problème persiste également avec Mutex. Que se passe-t-il si une tâche plus prioritaire doit accéder à la ressource… est-elle simplement mise en file d'attente? Il est peut-être préférable d'annuler le partage des ressources entre les tâches ayant des priorités différentes.
Hibou57

@ Hibou57: Oui, il est bloqué car l'état n'est pas cohérent et l'utilisation de la ressource aurait des effets «drôles» (disons que le thread de faible priorité était en train d'ajouter ou de supprimer quelque chose dans / de la liste liée). Le point de cette déclaration était que si le thread est bloqué, il n'est pas planifié, de sorte qu'il ne consomme pas de ressources, contrairement au thread en attente sur le verrou tournant. Le verrouillage pour les systèmes en temps réel (particulièrement difficile) est un sujet différent et je n'ai pas suffisamment de connaissances pour y répondre - cependant ces systèmes mettent parfois en œuvre des dons prioritaires ou d'autres techniques.
Maciej Piechotka

2

Les verrous tournants sont utilisés dans un contexte d'interruption, où le sommeil n'est pas autorisé. Ils sondent en boucle serrée, ne faisant rien d'autre jusqu'à ce que la ressource soit acquise. Surtout utilisé dans les ISR, et plus sûr et efficace.

Les sémaphores peuvent être utilisés dans un contexte de processus, où dormir est correct.


1

Voici ma réponse rapide: un verrou tournant et un sémaphore binaire (qui gère une ressource qui ne peut être utilisée que par une seule chose) sont presque identiques. Leur distinction est que les verrous tournants gèrent le code à exécuter tandis que les sémaphores binaires gèrent une sorte de ressource singulière (par exemple le temps processeur, la sortie d'affichage)

Un sémaphore régulier, cependant, est capable de gérer plusieurs threads accédant à une ressource qui peut être divisée en plusieurs, mais est limité (par exemple la mémoire, la bande passante du réseau)

En bref, un spin-lock est susceptible de continuer à demander à un sémaphore s'il peut utiliser une ressource. (Imaginez un enfant devant utiliser les toilettes et attendre que quelqu'un d'autre termine.)

Sources: Introduction à la programmation des systèmes, systèmes d'exploitation et wikipedia

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.