GNU/Linux >> Linux Esercitazione >  >> Linux

Come rilevare e scoprire che un programma è in stallo?

Se sospetti un deadlock, esegui un ps aux | grep <exe name> , se in output, il PROCESS STATE CODE è D (Uninterruptible sleep) significa che è un deadlock. Perché, come ha spiegato @daijo, diciamo che hai due thread T1 &T2 e due sezioni critiche ciascuna protetta da semaphores S1 & S2 quindi se T1 acquisisce S1 e T2 acquisisce S2 dopodiché tentano di acquisire l'altro blocco prima di abbandonare quello già detenuto da loro, questo porterà a una situazione di stallo e facendo un ps aux | grep <exe name> , il process state code sarà D (ovvero sonno ininterrotto).

Strumenti:

Valgrind, Lockdep (utilità del kernel Linux)

Controlla questo link sui tipi di deadlock e su come evitarli:http://cmdlinelinux.blogspot.com/2014/01/linux-kernel-deadlocks-and-how-to-avoid.html

Modifica:ps aux output D "potrebbe" significa che il processo è in una situazione di stallo, da questo documento redhat:

Stato di sospensione non interrompibile
Uno stato di sospensione non interrompibile è uno stato che non gestisce immediatamente un segnale. Si riattiverà solo come risultato della disponibilità di una risorsa attesa o dopo che si verifica un timeout durante tale attesa (se il timeout è specificato quando il processo viene messo in sospensione).


Ti suggerirei di dare un'occhiata a Helgrind:un rilevatore di errori di thread.

L'esempio più semplice di tale problema è il seguente.

Immagina una risorsa condivisa R, che, per qualsiasi motivo, è protetta da due blocchi, L1 e L2, che devono essere mantenuti entrambi quando si accede a R.

Supponiamo che un thread acquisisca L1, quindi L2 e proceda ad accedere a R. L'implicazione di ciò è che tutti i thread nel programma devono acquisire i due blocchi nell'ordine prima L1 e poi L2. In caso contrario, si rischia una situazione di stallo.

Il deadlock potrebbe verificarsi se due thread - chiamali T1 e T2 - vogliono entrambi accedere a R. Supponiamo che T1 acquisisca prima L1 e T2 acquisisca prima L2. Quindi T1 tenta di acquisire L2 e T2 tenta di acquisire L1, ma entrambi i blocchi sono già mantenuti. Quindi T1 e T2 si bloccano."


Linux
  1. Come scoprire le directory e i file principali (spazio su disco) in Linux

  2. Maestral Dropbox Client, scopri come installarlo e usarlo

  3. Come trovare e uccidere il processo Zombie in Linux

  4. Come scoprire lo spazio dei nomi di un particolare processo?

  5. Come scoprire la fonte di un segnale POSIX

Come trovare l'ID di processo di un programma e ucciderlo [Suggerimento rapido]

Come trovare la data e l'ora di installazione del sistema operativo Linux

Come scoprire quale programma utilizza Internet e quanto?

Come trovare e sostituire il testo in Vim

Come rilevare e gestire i dispositivi su Linux

Come scrivere ed eseguire un programma C in Linux