¿Qué es un punto muerto?

Al escribir aplicaciones de subprocesos múltiples, uno de los problemas más comunes experimentados son los interlockings.

Mis preguntas a la comunidad son:

  1. ¿Qué es un punto muerto?

  2. ¿Cómo los detecta?

  3. ¿Los manejas?

  4. Y finalmente, ¿cómo evitas que ocurran?

Se produce un locking cuando varios procesos intentan acceder al mismo recurso al mismo tiempo.

Un proceso se pierde y debe esperar a que el otro termine.

Se produce un interlocking cuando el proceso de espera aún se mantiene en otro recurso que el primero necesita antes de que pueda finalizar.

Entonces, un ejemplo:

El recurso A y el recurso B son utilizados por el proceso X y el proceso Y

  • X comienza a usar A.
  • X e Y intentan comenzar a usar B
  • Y ‘gana’ y obtiene B primero
  • ahora Y necesita usar A
  • A está bloqueado por X, que está esperando Y

La mejor manera de evitar interlockings es evitar que los procesos se crucen de esta manera. Reduce la necesidad de bloquear todo lo que puedas.

En las bases de datos, evite hacer muchos cambios en diferentes tablas en una sola transacción, evite los desencadenantes y cambie a lecturas optimistas / sucias / nolock tanto como sea posible.

Permítanme explicar un ejemplo del mundo real (no real) para una situación de estancamiento de las películas del crimen. Imagine que un criminal tiene como rehén y, en contra de eso, un policía también tiene como rehén a un amigo del criminal. En este caso, el criminal no va a dejar ir al rehén si el policía no permite que su amigo lo suelte. Además, el policía no permitirá que el amigo del criminal lo suelte, a menos que el criminal libere al rehén. Esta es una situación interminable e indigna de confianza, porque ambas partes insisten en el primer paso el uno para el otro.

Escena criminal y policial

enter image description here

Entonces, simplemente, cuando dos hilos necesitan dos recursos diferentes y cada uno de ellos tiene el locking del recurso que el otro necesita, es un punto muerto.

Otra explicación de alto nivel de punto muerto: corazones rotos

Estás saliendo con una chica y un día después de una discusión, ambos lados se rompen el uno con el otro y esperan una llamada de “lo siento” y “te extrañé” . En esta situación, ambas partes quieren comunicarse entre sí si y solo si una de ellas recibe una llamada de “lo siento” del otro. Debido a que ninguno de los dos va a iniciar la comunicación y esperar en estado pasivo, ambos esperarán a que el otro inicie la comunicación que termina en una situación de locking.

Los lockings solo se producirán cuando tenga dos o más lockings que puedan adquirirse al mismo tiempo y que se agarren en un orden diferente.

Formas de evitar tener lockings son:

  • evitar tener lockings (si es posible),
  • evitar tener más de un locking
  • toma siempre las cerraduras en el mismo orden.

Para definir el punto muerto, primero definiría el proceso.

Proceso : como sabemos, el proceso no es más que un program en ejecución.

Recurso : para ejecutar un progtwig, el proceso necesita algunos recursos. Las categorías de recursos pueden incluir memoria, impresoras, CPU, archivos abiertos, unidades de cinta, CD-ROM, etc.

Deadlock : Deadlock es una situación o condición en la que dos o más procesos están reteniendo algunos recursos e intentando adquirir más recursos, y no pueden liberar los recursos hasta que finalicen la ejecución.

Situación o situación de punto muerto

enter image description here

En el diagtwig de arriba hay dos procesos P1 y p2 y hay dos recursos R1 y R2 .

El recurso R1 se asigna al proceso P1 y el recurso R2 se asigna al proceso p2 . Para completar la ejecución del proceso P1 necesita el recurso R2 , entonces P1 solicita R2 , pero R2 ya está asignado a P2 .

De la misma manera, el Proceso P2 para completar su ejecución necesita R1 , pero R1 ya está asignado a P1 .

ambos procesos no pueden liberar su recurso hasta y a menos que completen su ejecución. Entonces, ambos esperan otros recursos y esperarán por siempre. Entonces esta es una condición DEADLOCK .

Para que ocurra un punto muerto, cuatro condiciones deben ser verdaderas.

  1. Exclusión mutua : cada recurso está asignado actualmente a exactamente un proceso o está disponible. (Dos procesos no pueden controlar simultáneamente el mismo recurso o estar en su sección crítica).
  2. Espera y espera : los procesos que actualmente tienen recursos pueden solicitar nuevos recursos.
  3. Sin preferencia : una vez que un proceso contiene un recurso, no puede ser retirado por otro proceso o el kernel.
  4. Espera circular : cada proceso está esperando obtener un recurso retenido por otro proceso.

y todas estas condiciones se cumplen en el diagtwig anterior.

Un punto muerto ocurre cuando un hilo está esperando algo que nunca ocurre.

Normalmente, sucede cuando un subproceso está esperando en un mutex o semáforo que nunca fue liberado por el propietario anterior.

También ocurre con frecuencia cuando tienes una situación que involucra dos hilos y dos lockings como este:

 Thread 1 Thread 2 Lock1->Lock(); Lock2->Lock(); WaitForLock2(); WaitForLock1(); <-- Oops! 

Generalmente los detecta porque las cosas que espera que suceda nunca lo hacen, o la aplicación se cuelga por completo.

Puedes echar un vistazo a estos maravillosos artículos , en la sección Interlocking . Está en C # pero la idea sigue siendo la misma para otra plataforma. Cito aquí para una fácil lectura

Se produce un interlocking cuando dos subprocesos cada uno esperan un recurso mantenido por el otro, por lo que ninguno puede continuar. La forma más fácil de ilustrar esto es con dos lockings:

 object locker1 = new object(); object locker2 = new object(); new Thread (() => { lock (locker1) { Thread.Sleep (1000); lock (locker2); // Deadlock } }).Start(); lock (locker2) { Thread.Sleep (1000); lock (locker1); // Deadlock } 

El punto muerto es un problema común en problemas de multiprocesamiento / multiprogtwigción en SO. Supongamos que hay dos procesos P1, P2 y dos recursos compartibles a nivel mundial, R1, R2, y en la sección crítica, se debe acceder a ambos recursos.

Inicialmente, el sistema operativo asigna R1 para procesar P1 y R2 para procesar P2. Como ambos procesos se ejecutan simultáneamente, pueden comenzar a ejecutar su código, pero el PROBLEMA surge cuando un proceso llega a la sección crítica. Entonces, el proceso R1 esperará a que el proceso P2 libere R2 y viceversa … Entonces esperarán por siempre (CONDICIÓN DE DESADLOQUE).

Una pequeña ANALOGÍA …

Tu madre (OS),
Usted (P1),
Tu hermano (P2),
Apple (R1),
Cuchillo (R2),
sección crítica (corte de manzana con cuchillo).

Tu madre te da la manzana y el cuchillo a tu hermano al principio.
Ambos están felices y jugando (Ejecutando sus códigos).
Cualquiera de ustedes quiere cortar la manzana (sección crítica) en algún momento.
No quieres darle la manzana a tu hermano.
Tu hermano no quiere darte el cuchillo.
Entonces, los dos van a esperar mucho, mucho, mucho tiempo 🙂

Un punto muerto se produce cuando hay una cadena circular de hilos o procesos que contienen un recurso bloqueado y están tratando de bloquear un recurso en el siguiente elemento de la cadena. Por ejemplo, dos hilos que mantienen, respectivamente, el locking A y el locking B, y ambos intentan adquirir el otro locking.

El locking se produce cuando dos hilos adquieren lockings que impiden que cualquiera de ellos progrese. La mejor forma de evitarlos es con un desarrollo cuidadoso. Muchos sistemas incorporados protegen contra ellos mediante el uso de un temporizador de vigilancia (un temporizador que reinicia el sistema siempre que se cuelgue durante un cierto período de tiempo).

El punto muerto se puede definir formalmente como: Un conjunto de procesos está estancado si cada proceso en el conjunto está esperando un evento que solo puede causar otro proceso en el conjunto. Debido a que todos los procesos están esperando, ninguno de ellos causará ninguno de los eventos que podrían despertar a ninguno de los otros miembros del conjunto, y todos los procesos continúan esperando por siempre. A continuación, se muestran las cuatro condiciones que deben estar presentes para que se produzca un punto muerto. Si uno de ellos está ausente, no es posible un punto muerto.

 Condición de exclusión mutua: cada recurso está actualmente asignado a exactamente un proceso o está disponible.

 Condición de espera y espera: los procesos que actualmente tienen recursos otorgados anteriormente pueden solicitar nuevos recursos.

 Sin condición de preferencia: los recursos otorgados previamente no pueden ser retirados a la fuerza de un proceso. Deben ser liberados explícitamente por el proceso que los contiene.

 Condición de espera circular: debe haber una cadena circular de dos o más procesos, cada uno de los cuales está esperando un recurso retenido por el siguiente miembro de la cadena. En general, se usan cuatro estrategias para lidiar con los puntos muertos. Ellos son:  Simplemente ignore el problema por completo. Tal vez si lo ignoras, te ignorará.  Detección y recuperación: permita que ocurran interlockings, detectarlos y tomar medidas.  Evitación dinámica mediante una cuidadosa asignación de recursos.  Prevención: al negar estructuralmente una de las cuatro condiciones necesarias para causar un punto muerto.

Un interlocking es un estado de un sistema en el que ningún proceso / subproceso es capaz de ejecutar una acción. Como lo mencionaron otros, un punto muerto suele ser el resultado de una situación en la que cada proceso / subproceso desea adquirir un locking para un recurso que ya está bloqueado por otro (o incluso el mismo) proceso / subproceso.

Existen varios métodos para encontrarlos y evitarlos. Uno está pensando mucho y / o tratando muchas cosas. Sin embargo, lidiar con el paralelismo es notoriamente difícil y la mayoría de las personas (si no todas) no podrán evitar por completo los problemas.

Algunos métodos más formales pueden ser útiles si se toma en serio el tratamiento de este tipo de problemas. El método más práctico del que soy consciente es utilizar el enfoque teórico de procesos. Aquí puede modelar su sistema en algún lenguaje de proceso (por ejemplo, CCS, CSP, ACP, mCRL2, LOTOS) y usar las herramientas disponibles para (modelo) verificar si hay interlockings (y tal vez algunas otras propiedades también). Ejemplos de herramientas para usar son FDR, mCRL2, CADP y Uppaal. Algunas almas valientes incluso podrían probar que sus sistemas están libres de interferencias mediante el uso de métodos puramente simbólicos (prueba de teorema, busquen a Owicki-Gries).

Sin embargo, estos métodos formales normalmente requieren algún esfuerzo (por ejemplo, aprender los principios básicos de la teoría de procesos). Pero supongo que eso es simplemente una consecuencia del hecho de que estos problemas son difíciles.

El punto muerto es una situación que ocurre cuando hay menos recursos disponibles a medida que el proceso lo solicita. Significa que cuando la cantidad de recursos disponibles es inferior a la solicitada por el usuario, en ese momento el proceso entra en estado de espera. Algunas veces la espera aumenta más y no hay ninguna posibilidad de verificar el problema de la falta de recursos. esta situación se conoce como punto muerto. En realidad, el punto muerto es un problema importante para nosotros y ocurre solo en el sistema operativo multitarea. No se puede producir un locking en el sistema operativo de una sola tarea porque todos los recursos están presentes solo para la tarea que se está ejecutando actualmente.

Por encima de algunas explicaciones son agradables. Espero que esto también sea útil: https://ora-data.blogspot.in/2017/04/deadlock-in-oracle.html

En una base de datos, cuando una sesión (p. Ej., Ora) quiere un recurso retenido por otra sesión (p. Ej. Datos), pero esa sesión (datos) también quiere un recurso que es retenido por la primera sesión (ora). Puede haber más de 2 sesiones involucradas también, pero la idea será la misma. En realidad, los Bloqueos evitan que algunas transacciones continúen funcionando. Por ejemplo: supongamos que ORA-DATA mantiene el locking A y solicita el locking B Y SKU mantiene el locking B y solicita el locking A.

Gracias,

El punto muerto se produce cuando un hilo está esperando a que otro hilo termine y viceversa.

¿Como evitar?
– Evite las cerraduras anidadas
– Evite lockings innecesarios
– Usar unión de hilo ()

¿Cómo lo detecta?
ejecuta este comando en cmd:

 jcmd $PID Thread.print 

referencia : geeksforgeeks

Un progtwig clásico y muy simple para entender la situación de Interlocking : –

 public class Lazy { private static boolean initialized = false; static { Thread t = new Thread(new Runnable() { public void run() { initialized = true; } }); t.start(); try { t.join(); } catch (InterruptedException e) { e.printStackTrace(); } } public static void main(String[] args) { System.out.println(initialized); } } 

Cuando el hilo principal invoca Lazy.main, comprueba si la clase Lazy se ha inicializado y comienza a inicializar la clase. El hilo principal ahora se establece como inicializado en falso, crea e inicia un hilo de fondo cuyo método de ejecución se inicializa en verdadero y espera a que se complete el hilo de fondo.

Esta vez, la clase está siendo inicializada por otro hilo. En estas circunstancias, el hilo actual, que es el hilo de fondo, espera en el objeto de Clase hasta que se complete la inicialización. Desafortunadamente, el hilo que está haciendo la inicialización, el hilo principal, está esperando que se complete el hilo de fondo. Debido a que los dos hilos están esperando el uno al otro, el progtwig está DESACOPLADO.

Mutex en esencia es un locking que proporciona acceso protegido a los recursos compartidos. En Linux, el tipo de datos de exclusión mutua de subprocesos es pthread_mutex_t. Antes del uso, inicialízalo.

Para acceder a los recursos compartidos, debe bloquear el mutex. Si el mutex ya está en el locking, la llamada bloqueará el hilo hasta que se desbloquee el mutex. Una vez completada la visita a los recursos compartidos, debe desbloquearlos.

En general, hay algunos principios básicos no escritos:

  • Obtenga el candado antes de usar los recursos compartidos.

  • Sosteniendo la cerradura el menor tiempo posible.

  • Libere el locking si el hilo devuelve un error.

    Intereting Posts