Как найти причины тупиковых ситуаций для процесса в UNIX практически? - PullRequest
3 голосов
/ 28 октября 2011

В unix процесс застрял, вы сомневаетесь, что это может быть взаимоблокировка, найдите причины взаимоблокировки и как ее удалить и избежать?

Мне известны 4 условия тупика:

  1. Взаимное исключение: ресурс может быть назначен максимум одному процессу за раз (без совместного использования).

  2. Удерживать и ждать: процесс, содержащий ресурс, может запросить другой.

  3. Нет выгрузки: процесс должен освободить свои ресурсы;их нельзя убрать.

  4. Циклическое ожидание: должна быть цепочка процессов, такая, что каждый член цепочки ожидает ресурс, удерживаемый следующим участником цепочки.

Но они теоретические, как практически определить тупик на unix?Только видя, что процесс не прогрессирует?Как найти, какая часть кода вызывает тупик и причины?Если вам разрешено использовать инструменты, что можно использовать?

спасибо

Ответы [ 2 ]

5 голосов
/ 28 октября 2011

Существует также инструмент Helgrind от Valgrind: Helgrind: детектор ошибок потока

Helgrind - это инструмент Valgrind для обнаружения ошибок синхронизации в программах на C, C ++ и Fortran, использующих потоковые примитивы POSIX pthreads.

Основными абстракциями в pthreads POSIX являются: набор потоков, совместно использующих общее адресное пространство, создание потока, присоединение к потоку, выход из потока, мьютексы (блокировки), условные переменные (уведомления о событиях между потоками), блокировки чтения-записи, спин-блокировки, семафоры и барьеры.

Helgrind может обнаруживать три класса ошибок, которые подробно обсуждаются в следующих трех разделах:

  1. Злоупотребление API-интерфейсом POSIX pthreads .

  2. Потенциальные взаимоблокировки, возникающие из-за проблем с порядком блокировки .

  3. Гонки данных - доступ к памяти без адекватной блокировки или синхронизации .

Подобные проблемы часто приводят к невоспроизводимым, зависящим от времени сбоям, взаимоблокировкам и другим нарушениям, и их может быть трудно найти другими способами.

Хелгринд знает обо всех абстракциях и тщательно отслеживает их эффекты. На платформах x86 и amd64 он понимает и частично обрабатывает неявную блокировку, возникающую из-за использования префикса инструкции LOCK.

Helgrind работает лучше всего, когда ваше приложение использует только POSIX pthreads API. Однако, если вы хотите использовать пользовательские потоковые примитивы, вы можете описать их поведение в Helgrind с помощью макросов ANNOTATE_ *, определенных в helgrind.h. Эта функциональность была добавлена ​​в выпуске 3.5.0 Valgrind и считается экспериментальной.

1 голос
/ 28 октября 2011
...