Quelles sont les différences fondamentales entre les verrous tournants et les sémaphores en action ?
Réponse acceptée :
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 verrou tournant.
Les verrous rotatifs exécutent une attente occupée - c'est-à-dire qu'ils continuent de tourner 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 un autre qui tentera d'accéder à la même ressource, le second essaiera simplement d'acquérir la ressource jusqu'à ce qu'il soit à court de quanta CPU.
D'un autre côté, le mutex se comporte plutôt 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 pour lui. Le verrouillage/déverrouillage est beaucoup plus lourd mais l'attente est "gratuite" et "juste".
Le sémaphore est un verrou qui peut être utilisé plusieurs fois (connu à partir de l'initialisation) - par exemple, 3 threads sont autorisés à contenir simultanément la ressource, mais pas plus. Il est utilisé par exemple en 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)