¿Cuál es la diferencia entre cerraduras giratorias y semáforos?

15

¿Cuáles son las diferencias básicas entre los bloqueos de giro y los semáforos en acción?

Renjith G
fuente
posible duplicado de ¿Qué es un spinlock en Linux?
Gilles 'SO- deja de ser malvado'
@Gilles También miré ese, pero la única mención de semáforos en la página es Warren comentando que "si uno quiere saber la diferencia entre un bloqueo de giro y, digamos, un semáforo, esa es una pregunta diferente".
Michael Mrozek
@Michael: ok, creo que las respuestas allí abordaron el punto principal, pero tienes razón en que ninguna declaró explícitamente que los semáforos eran uno de los otros tipos de bloqueos.
Gilles 'SO- deja de ser malvado'
Explicación de Linus Torvalds: yarchive.net/comp/linux/semaphores.html
myaut
Duplicado de stackoverflow.com/questions/195853/spinlock-versus-semaphore Muchas buenas explicaciones están presentes en el hilo que pregunté.
iankits

Respuestas:

13

Ambos manejan un recurso limitado. Primero describiré la diferencia entre el semáforo binario (mutex) y el bloqueo de giro.

Los bloqueos de giro realizan una espera ocupada, es decir, sigue ejecutando el bucle:

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

Realiza un bloqueo / desbloqueo muy liviano, pero si el hilo de bloqueo será reemplazado por otro que intentará acceder al mismo recurso, el segundo simplemente intentará obtener el recurso hasta que se agote la cantidad de CPU.

Por otro lado, mutex se comporta más como:

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

Por lo tanto, si el hilo intenta adquirir recursos bloqueados, se suspenderá hasta que esté disponible. El bloqueo / desbloqueo es mucho más pesado, pero la espera es "gratuita" y "justa".

Semaphore es un bloqueo que se puede usar varias veces (conocido desde la inicialización) varias veces; por ejemplo, se permiten 3 subprocesos para retener simultáneamente el recurso pero no más. Se utiliza, por ejemplo, en problemas de productor / consumidor o, en general, en colas:

P(resources_sem)
resource = resources.pop()
...
resources.push(resources)
V(resources_sem)
Maciej Piechotka
fuente
Buena explicación, solo quiero enfatizar un punto. Semaphore vs mutex es una cuestión de interfaz: un mutex se mantiene o no, mientras que un semáforo se mantiene con hasta N hilos; un mutex es un caso especial de semáforos con N = 1. Spinlock vs otro tipo de bloqueo es una cuestión de implementación: un spinlock sigue intentando adquirir el bloqueo, mientras que otros tipos esperan una notificación. En un contexto de kernel de Linux, el único bloqueo con una implementación de giro tiene una interfaz mutex.
Gilles 'SO- deja de ser malvado'
En un contexto de kernel de Linux, el único bloqueo con una implementación de giro tiene una interfaz mutex. No entiendo esta línea. ¿Podría por favor ampliarlo?
Sen
@Sen: Se refería a que el bloqueo de giro en Linux se comporta binario (está bloqueado o no). Es posible que una cerradura giratoria se comporte como un semáforo.
Maciej Piechotka
"Pero si el subproceso de bloqueo será reemplazado por otro que intente acceder al mismo recurso, el segundo simplemente intentará obtener el recurso hasta que se quede sin los cuantos de la CPU": pero todavía hay un problema con Mutex. ¿Qué sucede si una tarea con más prioridad necesita acceder al recurso ... solo está en cola? Puede ser mejor dejar de compartir recursos entre tareas con diferentes prioridades.
Hibou57
@ Hibou57: Sí, está bloqueado ya que el estado no es consistente y el uso del recurso tendría efectos 'graciosos' (digamos que el hilo de baja prioridad estaba en el medio de agregar o eliminar algo a / de la lista vinculada). El punto de esta declaración fue que si el hilo está bloqueado, no está programado, por lo que no consume recursos mientras que el hilo que espera en spinlock lo hace. El bloqueo para sistemas en tiempo real (especialmente difícil) es un tema diferente y no tengo el conocimiento suficiente para responderlo; sin embargo, esos sistemas a veces implementan donaciones prioritarias u otras técnicas.
Maciej Piechotka
2

Los Spinlocks se usan en un contexto de interrupción, donde no se permite dormir. Sondean en un circuito cerrado, sin hacer nada más hasta que se adquiere el recurso. Principalmente utilizado en ISR, y más seguro y eficiente.

Los semáforos se pueden usar en un contexto de proceso, donde dormir está bien.

Kapil
fuente
1

Aquí está mi disparo rápido a una respuesta: un bloqueo de giro y un semáforo binario (que maneja un recurso que solo puede ser usado por una cosa) son casi idénticos. Su distinción es que los bloqueos de giro administran el código que se ejecutará, mientras que los semáforos binarios administran algún tipo de recurso singular (por ejemplo, tiempo de CPU, salida de pantalla)

Sin embargo, un semáforo regular es capaz de gestionar varios subprocesos que acceden a un recurso que se puede dividir entre varios, pero que es limitado (por ejemplo, memoria, ancho de banda de red)

En resumen, es probable que un spin-lock siga preguntando a un semáforo si puede usar un recurso. (Imagine que un niño tiene que usar el baño y espera que alguien más termine).

Fuentes: Introducción a la programación de sistemas, sistemas operativos y wikipedia

valbaca
fuente