Ambos gerenciam um recurso limitado. Vou primeiro descrever a diferença entre o semáforo binário (mutex) e o spin lock.
Os bloqueios de giro realizam uma espera ocupada - ou seja, ele continua executando o loop:
while (try_acquire_resource ());
...
release();
Ele executa bloqueio / desbloqueio muito leve, mas se o encadeamento de travamento for prejudicado por outro que tentará acessar o mesmo recurso, o segundo tentará simplesmente absolver o recurso até que ele fique sem CPU quanta.
Por outro lado, mutex se comporta mais como:
if (!try_lock()) {
add_to_waiting_queue ();
wait();
}
...
process *p = get_next_process_from_waiting_queue ();
p->wakeUp ();
Por isso, se o tópico tentar adquirir um recurso bloqueado, ele será suspenso até que ele seja disponibilizado. Bloquear / desbloquear é muito mais pesado, mas a espera é "livre" e "justa".
Semáforo é um bloqueio que pode ser usado várias vezes (conhecido da inicialização) - Por exemplo, três segmentos podem ocupar o recurso, mas não mais. É usado, por exemplo, no problema do produtor / consumidor ou, em geral, nas filas:
P(resources_sem)
resource = resources.pop()
...
resources.push(resources)
V(resources_sem)