Як дізнатися, чи немає причин для процесу 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 is a Valgrind tool for detecting synchronisation errors in C, C++ and Fortran programs that use the POSIX pthreads threading primitives.

The main abstractions in POSIX pthreads are: a set of threads sharing a common address space, thread creation, thread joining, thread exit, mutexes (locks), condition variables (inter-thread event notifications), reader-writer locks, spinlocks, semaphores and barriers.

Helgrind can detect three classes of errors, which are discussed in detail in the next three sections:

  1. Misuses of the POSIX pthreads API.

  2. Potential deadlocks arising from lock ordering problems.

  3. Data races -- accessing memory without adequate locking or synchronisation.

Такі проблеми часто призводять до невідтворюваних, пов'язаних з тимчасових аварій, несправностей та інших неполадків, і їх важко знайти іншими способами.

Helgrind знає про всі абстракції pthread і відстежує їх наслідки як точно, як це можливо. На платформах x86 та amd64 він розуміє та частково обробляє неявне блокування, яке виникає внаслідок використання префікса інструкції LOCK.

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

5
додано
1
додано