Una definición común de sin bloqueo es que al menos un proceso avanza. 1
Si tengo una estructura de datos simple, como una cola, protegida por un bloqueo, entonces un proceso siempre puede avanzar, ya que un proceso puede adquirir el bloqueo, hacer lo que quiera y liberarlo.
Entonces, ¿cumple con la definición de sin bloqueo?
1 Véase, por ejemplo, M. Herlihy, V. Luchangco y M. Moir. Sincronización sin obstrucciones: colas de doble final como ejemplo. En Computación distribuida, 2003. "Está libre de bloqueos si solo garantiza que algún subproceso siempre progresa".
multithreading
Joe Pension
fuente
fuente
Respuestas:
Esa no es una definición de sin bloqueo.
Si puede garantizar el progreso, entonces tiene un punto muerto libre , y si tiene la finalización eventual de cada solicitud, entonces tiene un hambre libre , pero no un bloqueo.
Me pregunto si su simple ejemplo realmente proporciona esto de todos modos. Necesita jerarquías de bloqueo, etc. para garantizar realmente el progreso cuando hay varios bloqueos involucrados.
fuente
He estudiado El arte de la programación multiprocesador 1 y su texto carece de claridad, al igual que el libro al que se refiere. Aquí hay algunas citas de TAMPP:
Cita 1 (Definición de sin bloqueo)
Cita 2 (Definición de no bloqueo)
Cita 3 (afirme que sin bloqueo no se bloquea)
El problema es que el reclamo en la Cita 3 obviamente no se deriva de la definición en la Cita 1. Como ya se mencionó, una cola sincronizada parece satisfacer la Cita 1: infinitamente a menudo algún método adquirirá el bloqueo y se completará con éxito.
Observe específicamente la frase bastante vaga en la Cita 3: "independientemente de cómo el sistema programa los hilos". Esto no está precedido por ningún tipo de descripción formal del "sistema de programación de subprocesos", por lo que nos queda reconstruir sus propiedades en función de nuestras ideas preconcebidas sobre lo que deberían significar las definiciones :
En un sistema de este tipo, un método de bloqueo no puede estar libre de bloqueos: si el subproceso que mantiene el bloqueo nunca más se programa para la ejecución, no habrá otro subproceso que pueda completar la invocación de su método en un número finito de pasos, pero habrá algunos hilos que están ejecutando pasos del método. Para un sistema más realista, uno que garantice dar tiempo de CPU a cada hilo eventualmente, la definición debe incluir explícitamente la propiedad de no bloqueo:
Definición corregida de sin bloqueo
1 Maurice Herlihy, Nir Shavit, El arte de la programación multiprocesador, Elsevier 2008, pp. 58-60
fuente
La terminología no siempre es coherente, pero creo que lo importante es hacer las siguientes preguntas sobre un algoritmo o sistema propuesto:
Gran parte de la importancia de los algoritmos sin bloqueo no es que sean más rápidos que los algoritmos sin bloqueo, sino más bien el hecho de que no son propensos a morir si un hilo se desvía [tenga en cuenta que tal garantía simplemente requiere que los algoritmos sean sin bloqueo, pero todos los algoritmos sin bloqueo lo son]. Es posible que un algoritmo sin bloqueo use bloqueos, pero solo si los intentos de adquisición de bloqueo incluyen tiempos de espera junto con algoritmos para garantizar que siempre sea posible que alguien progrese (por ejemplo, un algoritmo podría usar un
CompareExchange
ciclo como su principal método de arbitraje, pero use bloqueos para arbitrar el acceso cuando la contención parezca alta; si un bloqueo parece mantenerse durante demasiado tiempo, otros hilos podrían decidir abandonar los esfuerzos para usar ese bloqueo y, en su lugar, crear uno nuevo.CompareExchange
, hacer que los clientes abandonen el bloqueo no pondría en peligro la consistencia del sistema, aunque puede significar que el código que había estado manteniendo el bloqueo anterior no se realizará ningún trabajo hasta que también abandone el bloqueo antiguo y se alinee con el nuevo.fuente
Debe mirar la "definición" que cita en contexto :
Estás utilizando bloqueos para la exclusión mutua, por lo que no están hablando de una técnica sin bloqueo.
fuente
Podría ser, pero depende del algoritmo.
Nota per se .
Si el paso "hacer lo que quiere" no implica la adquisición de otros bloqueos, y se garantiza que se completará en un tiempo finito, entonces esta parte particular de su algoritmo estará libre de puntos muertos.
Sin embargo, si esas condiciones previas no se cumplen, existe al menos la posibilidad de puntos muertos ...
fuente
El ejemplo que da no está libre de bloqueo por la siguiente razón.
La compatibilidad con un subproceso adquiere el bloqueo, y el programador del sistema operativo suspendió el subproceso durante un período solitario infinito, entonces todo el subproceso no puede avanzar porque ninguno puede adquirir el bloqueo adquirido por el subproceso suspendido.
En términos generales, los algoritmos que usan bloqueos no están libres de bloqueo.
Tenga en cuenta que sin bloqueo y sin bloqueo son dos conceptos diferentes. sin punto muerto significa que no hay posibilidad de punto muerto, pero podría haber un bloqueo en vivo que puede evitar que todo el sistema avance. La libertad de bloqueo es más fuerte que eso porque significa que algunos subprocesos en el sistema siempre avanzan con un número finito de pasos.
fuente