Системный API, позволяющий видеть, когда потоки активны

#linux #multithreading #linux-kernel #darwin #mach

#linux #многопоточность #linux-ядро #дарвин #mach

Вопрос:

Существует ли низкоуровневый системный API для Linux и для Darwin, чтобы получить «снимок» планировщика, чтобы увидеть, какие потоки в данный момент времени были запущены (активны), выгружены, ожидают ресурс или что-то подобное?

Например, в «Системном мониторе» Ubuntu есть столбец «Ожидающий канал» для процессов, есть ли способ получить аналогичный вывод для всех потоков внутри процесса?

У меня есть многопоточная система очередей, в которой задания отправляются потокам, с визуальной временной шкалой, показывающей, когда задания запущены / завершены. Чтобы оптимизировать его, я хочу добавить некоторую визуальную индикацию того, когда задания фактически выполняются (например, на одном ядре процессора), а не когда они выгружаются.

Ответ №1:

top -H показывает потоки и их состояния. Одним из способов выяснить это будет использование переключателя -H в его источнике. При беглом взгляде функция int cmd_threads(globalstate *gstate) в commands.c , похоже, переключает настройку.

ОБНОВЛЕНИЕ: Procfs предоставляет эту информацию в пользовательском пространстве. /proc/<pid>/task/<thread-id>/status дает именно то, что вам нужно. Это то, что top тоже используется. Вот пример вывода из моей системы:

 $ cat /proc/418/task/448/status | grep State
State:  S (sleeping)
  

В этом каталоге есть еще много полезных деталей.