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

#linux #multithreading #unix #process #deadlock

#linux #многопоточность #unix #процесс #взаимоблокировка

Вопрос:

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

Я знаю 4 условия взаимоблокировки:

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

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

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

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

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

Спасибо

Комментарии:

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

2. Как вы думаете, замена «процесса» на «поток» будет лучше отражать ваш вопрос?

Ответ №1:

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

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

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

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

  1. Злоупотребление API POSIX pthreads.

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

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

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

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

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

Ответ №2: