Quelles sont les différences fondamentales entre les verrous tournants et les sémaphores en action?
Quelles sont les différences fondamentales entre les verrous tournants et les sémaphores en action?
Réponses:
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)
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.
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