Что такое поток (thread) в Linux?

«Что такое поток (thread) в Linux?» — вопрос из категории Linux, который задают на 26% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Поток (thread) в Linux — это минимальная единица выполнения внутри процесса. Все потоки одного процесса разделяют его виртуальное адресное пространство (память, код, данные, файловые дескрипторы), но имеют собственные стеки, регистры процессора и идентификаторы (TID). С точки зрения планировщика задач ядра (начиная с версии 2.6) потоки — это такие же задачи (tasks), как и процессы, и реализованы через механизм clone() с общим адресным пространством.

Ключевые особенности с точки зрения системного администрирования и DevOps:

  • Легковесность: Создание и переключение контекста между потоками дешевле, чем между процессами, так как не требуется создание нового адресного пространства.
  • Разделяемая память: Упрощает обмен данными между потоками, но требует синхронизации (мьютексы, семафоры) для избежания состояний гонки (race conditions).
  • Планирование: Ядро Linux планирует потоки независимо. Один процесс с множеством потоков может использовать несколько ядер CPU одновременно.

Практический мониторинг:

  • Команда top или htop показывает потоки (включите отображение через H в top).
  • ps -eLf отображает список всех потоков (LWP — Light Weight Process).
  • /proc/<PID>/task/ содержит поддиректории для каждого потока процесса.

Пример анализа потоков процесса в оболочке:

# Найти PID процесса Nginx
pgrep nginx
# Посмотреть количество потоков у процесса (NLWP)
ps -o pid,nlwp,cmd -p <PID>
# Или посмотреть все потоки процесса
ls /proc/<PID>/task/ | wc -l

Важно для DevOps: Понимание потоков критично при настройке веб-серверов (например, worker threads в Nginx/Gunicorn), диагностике проблем с утечками памяти (поток может удерживать ресурсы) и настройке лимитов (ulimit -s для стека, ulimit -u для общего числа процессов/потоков).