¿Cuáles son las diferencias básicas entre los bloqueos de giro y los semáforos en acción?
¿Cuáles son las diferencias básicas entre los bloqueos de giro y los semáforos en acción?
Respuestas:
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)
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.
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