Как найти тупиковые причины для процесса в UNIX?

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

Я знаю 4 условия для тупика:

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

  2. Удержание и ожидание: обработка, содержащая ресурс, разрешена для запроса другого.

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

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

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

благодаря

3
Этот вопрос слишком общий. Если вы спрашиваете о конкретной программе, которая зашла в тупик, вы можете сообщить подробности.
добавлено автор Dietrich Epp, источник
Считаете ли вы, что замена «процесса» на «поток» лучше будет представлять ваш вопрос?
добавлено автор qqqqq, источник

2 ответы

There is also Valgrind's Helgrind tool: Helgrind: a thread error detector

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

     

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

     

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

     <�Ол>   

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

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

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

5
добавлено
1
добавлено
Linux Help
Linux Help
2 686 участник(ов)

Правила: https://telegra.ph/Pravila-Linux-Help-10-15

Linux Security
Linux Security
652 участник(ов)

Данная группа принципиально про безопасность и в частности про безопасность Linux. Прочие темы просим обсуждать в профильных чатах.

Linux Gaming RUS
Linux Gaming RUS
28 участник(ов)

Русскоязычный чатик, посвящённый играм на различных дистрибутивах Linux, а также wine, proton Arch Linux RU @ArchLinuxChatRU Gnome RU @gnome_ru