Ответ
Поток (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 для общего числа процессов/потоков).