Как обнаружить и узнать, что программа находится в тупике? - PullRequest
6 голосов
/ 22 февраля 2012

Это вопрос интервью.

Как определить, находится ли программа в тупике?Есть ли инструменты, которые можно использовать для этого в системах Linux / Unix?

Моя идея:

Если программа не выполняет никаких действий и ее состояние выполняется, она находится в тупике.Но другие причины могут также вызвать эту проблему.Инструменты с открытым исходным кодом Valgrind (Halgrind) может сделать это.Правильно?

Ответы [ 2 ]

5 голосов
/ 30 декабря 2013

Если вы подозреваете тупик, введите ps aux | grep <exe name>, если на выходе PROCESS STATE CODE равен D (непрерывный сон), это означает, что это тупик.Потому что, как объяснил @daijo, скажем, у вас есть два потока T1 & T2 и два критических раздела, каждый из которых защищен semaphores S1 & S2, тогда если T1 получает S1, а T2 получает S2 и после этого они пытаютсязахватить другой замок перед тем, как освободить тот, который у них уже есть, это приведет к тупику, и при выполнении ps aux | grep <exe name> process state code будет D (т.е. непрерывный сон).

Инструменты:

Valgrind, Lockdep (утилита ядра Linux)

Проверьте эту ссылку на типы взаимоблокировок и как их избежать: http://cmdlinelinux.blogspot.com/2014/01/linux-kernel-deadlocks-and-how-to-avoid.html

Редактировать: ps aux вывод D «мог» означать, что процесс находится в тупике, из этого redhat doc :

Состояние бесперебойного сна
Бесперебойное состояние сна это то, которое не будет обрабатывать сигнал сразу.Он активируется только в результате появления ожидаемого ресурса или после истечения времени ожидания во время этого ожидания (если время ожидания указано, когда процесс переведен в спящий режим).

4 голосов
/ 22 февраля 2012

Я бы посоветовал вам взглянуть на Helgrind: детектор ошибок потока .

Простейшим примером такой проблемы является следующий.

Представьте себе некоторый общий ресурс R, который по любой причине защищается двумя блокировками, L1 и L2, которые должны удерживаться при обращении к R.

Предположим, что поток получает L1, затем L2 и переходит к доступу R. Это означает, что все потоки в программе должны получить две блокировки в порядке сначала L1, а затем L2. В противном случае возникает опасность тупика.

Возможна тупиковая ситуация, если два потока - назовите их T1 и T2 - оба захотят получить доступ к R. Предположим, что T1 сначала получает L1, а сначала T2. Затем T1 пытается получить L2, а T2 пытается получить L1, но обе блокировки уже удерживаются. Таким образом, T1 и T2 блокируются. "

...