#linux #multithreading #unix #process #deadlock
#linux #многопоточность #unix #процесс #взаимоблокировка
Вопрос:
В unix процесс застрял, вы сомневаетесь, что он может быть взаимоблокировкой, найдите причины взаимоблокировки и как ее устранить и избежать?
Я знаю 4 условия взаимоблокировки:
-
Взаимное исключение: ресурс может быть назначен не более чем одному процессу одновременно (без совместного использования).
-
Удержание и ожидание: обработке, содержащей ресурс, разрешено запрашивать другой.
-
Без вытеснения: процесс должен освободить свои ресурсы; их нельзя забрать.
-
Циклическое ожидание: должна существовать цепочка процессов, так что каждый член цепочки ожидает ресурс, удерживаемый следующим членом цепочки.
Но они теоретические, как определить тупиковую ситуацию в unix практически? Только видя, что процесс не продвигается? Как определить, какая часть кода вызывает взаимоблокировку и причины? Если вам разрешено использовать инструменты, что можно использовать?
Спасибо
Комментарии:
1. Этот вопрос слишком общий. Если вы спрашиваете о конкретной программе, которая зашла в тупик, вы можете сообщить подробности.
2. Как вы думаете, замена «процесса» на «поток» будет лучше отражать ваш вопрос?
Ответ №1:
Существует также инструмент Helgrind от Valgrind: Helgrind: детектор ошибок потоков
Helgrind — это инструмент Valgrind для обнаружения ошибок синхронизации в программах на C, C и Fortran, которые используют примитивы потоковой обработки POSIX pthreads.
Основными абстракциями в POSIX pthreads являются: набор потоков, совместно использующих общее адресное пространство, создание потоков, объединение потоков, выход из потока, мьютексы (блокировки), переменные условия (уведомления о событиях между потоками), блокировки чтения-записи, спин-блокировки, семафоры и барьеры.
Helgrind может обнаруживать три класса ошибок, которые подробно обсуждаются в следующих трех разделах:
Подобные проблемы часто приводят к невоспроизводимым зависящим от времени сбоям, взаимоблокировкам и другим неправильным действиям, и их может быть трудно обнаружить другими способами.
Helgrind знает обо всех абстракциях pthread и отслеживает их эффекты настолько точно, насколько это возможно. На платформах x86 и amd64 он понимает и частично обрабатывает неявную блокировку, возникающую из-за использования префикса инструкции БЛОКИРОВКИ.
Helgrind работает лучше всего, когда ваше приложение использует только POSIX pthreads API. Однако, если вы хотите использовать пользовательские примитивы потоковой обработки, вы можете описать их поведение в Helgrind с помощью макросов ANNOTATE_ *, определенных в helgrind.h. Эта функциональность была добавлена в выпуске 3.5.0 Valgrind и считается экспериментальной.