La Red de Conocimientos Pedagógicos - Conocimientos históricos - ¿Qué es un punto muerto y cómo solucionarlo?

¿Qué es un punto muerto y cómo solucionarlo?

En la programación concurrente, el interbloqueo es un error lógico muy común. Al adoptar métodos de programación correctos, no es difícil evitar los puntos muertos.

Cuatro condiciones necesarias para el punto muerto

En los libros de texto de pregrado en informática, generalmente se introducen las cuatro condiciones necesarias para el punto muerto. Estas cuatro condiciones son indispensables, o mientras se viole cualquiera de ellas, no puede ocurrir un punto muerto. Repasemos, estas cuatro condiciones son:

?Exclusión mutua: existe un recurso que solo se puede asignar a un hilo de ejecución (también llamado hilo) en un momento determinado) uso Hold (Hold y); esperar): cuando el recurso solicitado ha sido ocupado y el hilo de ejecución está bloqueado, el ocupante del recurso no solo no necesita liberar el recurso, sino que también puede continuar solicitando más recursos Sin preferencia (Sin preferencia): recursos mutuamente excluyentes; Los recursos obtenidos por los subprocesos de ejecución no se pueden privar por la fuerza. En otras palabras, solo los propios ocupantes de recursos pueden liberar los recursos; espera circular: varios subprocesos de ejecución obtienen recursos mutuamente excluyentes en diferentes órdenes, formando así una situación de espera circular, imagínese en una cadena circular. compuesto por múltiples subprocesos, cada subproceso está esperando que el siguiente subproceso libere los recursos que contiene.

Condiciones necesarias para liberar el punto muerto

No es difícil ver que entre las cuatro condiciones necesarias para el punto muerto, la segunda, tercera y cuarta condiciones son relativamente fáciles de eliminar. Al introducir un mecanismo de transacción, la segunda y tercera condiciones a menudo se pueden eliminar tratando todas las operaciones de bloqueo como transacciones. Una vez que se inicia el bloqueo, se garantiza que todas las operaciones se puedan revertir y se detecten puntos muertos a través del administrador de bloqueo. privar de recursos (revertir la transacción). Este enfoque a veces genera una mayor sobrecarga y requiere más cambios en el modelo de bloqueo.

Eliminar la cuarta condición es más fácil y menos costoso. Específicamente, este método está de acuerdo: el orden de bloqueo debe ser consistente. Específicamente, asignamos artificialmente un atributo direccional a la cerradura similar a un "nivel de agua". Independientemente de los bloqueos que ya se tengan, todas las operaciones de bloqueo de este subproceso deben realizarse en un orden coherente de menor a mayor (o de mayor a menor) y, en un sistema, solo se permite un orden.

Tenga en cuenta que el orden en que se liberan los bloqueos no provoca un punto muerto. En otras palabras, aunque puede parecer extraño realizar operaciones de bloqueo en el orden de bloqueo A, bloqueo B, liberación A, liberación B, siempre que todos bloqueen en el orden A y luego B, no provocará un punto muerto.

Ejemplo

Supongamos que hay tres objetos A, B y C. Acordamos artificialmente que su orden de bloqueo es: A antes de B antes de C.

Por ejemplo, las siguientes secuencias de bloqueo son legales:

? Bloquear C, poner C. Bloquear B, poner B. Bloquear B, bloquear C, poner B, poner C. Bloquear B, bloquear C, poner C , poner B Bloquear A, poner A Bloquear A, bloquear C, poner A, poner C Bloquear A, bloquear C, poner C, poner A Bloquear A, bloquear B, poner A, poner B Bloquear A, bloquear B, poner B, poner A Bloquear A, bloquear B, bloquear C, poner A, poner B, poner C Bloquear A, bloquear B, bloquear C, poner C, poner B, poner A

En el sistema definido anteriormente, es posible Las secuencias de bloqueo típicas que conducen a un punto muerto incluyen:

? Bloquear B, bloquear A, bloquear C, poner C, poner A, poner B

(porque B primero y luego A). La orden de bloqueo viola el acuerdo de orden de bloqueo. Si otro subproceso de ejecución se bloquea en el orden de A y luego B al mismo tiempo, puede deberse a que el subproceso de ejecución A obtiene B y el subproceso de ejecución B obtiene A, lo que hace que ambas partes esperen. La otra parte libera el bloqueo al mismo tiempo. Hay bloqueos, lo que resulta en una situación de punto muerto; la solución es agregar operaciones de bloqueo apropiadas a la secuencia de operación, es decir, cambiarlo a bloquear B, liberar B, bloquear A, bloquear. B, bloquear C, soltar C, soltar A, soltar B)

En otras palabras, siempre y cuando no haya un orden inverso al tomar el candado (por ejemplo, intentar agarrar B o A mientras se sostiene C , o intentar agarrar A mientras sostiene B), y soltarlo primero cuando ocurra un posible orden inverso. Si el candado "pequeño" atrapa el más grande, definitivamente no causará un punto muerto.