Обнаружение тупиков на мьютексах в многопоточных приложениях - page 7

Обнаружение тупиков на мьютексах в многопоточных приложениях
7
зываемые при чтении или записи пользователем в каталоге /proc.
В данном случае функция, вызываемая при чтении копирует элемен-
ты из списка, находящегося в ядре, в буфер в пространстве пользова-
теля. Для получения этих данных из пространства пользователя нуж-
но вызвать функцию чтения из файла (/proc/futex_hook).
Алгоритм обнаружения тупиков.
Обнаружение тупика выполня-
ется в режиме пользователя специальным приложением, которое счи-
тывает данные из файла /proc/futex_hook, строит по ним граф и ищет в
графе запросов-распределений замкнутые цепи запросов (циклы).
В классическом алгоритме обнаружения тупиков [2] использует-
ся два массива: один из них содержит информацию о запросах про-
цессов ресурсов, второй — о распределении ресурсов процес-
сам/потокам).
Основой для обнаружения тупиков является следующая структура:
struct parse_t{
int current_pid; /*идентификатор потока*/
int futex_owner; /*идентификатор владельца мьютекса*/
size_t futex_addr; /*адрес мьютекса в пространсве поль-
зователя*/
int min_process_tid; /*исп. при выборке из общего списка*/
int max_process_tid; /*исп. при выборке из общего списка*/
};
В предлагаемом подходе граф представляется массивом структур
типа
struct parse_t.
Вместо массивов запросов и распределений ис-
пользуются массивы заблокированных и освобожденных потоков.
Для обнаружения тупиков на первом этапе создается список необра-
ботанных потоков. Исходная информация выбирается из файла
/proc/futex_hook, сформированного функцией-ловушкой и содержа-
щего информацию обо всех потоках, запрашивавших мьютексы. Ал-
горитм создания списка показан на рис. 7.
Рис. 7.
Алгоритм получения списка необработанных потоков
1,2,3,4,5,6 8,9,10,11
Powered by FlippingBook