В операционной системе Linux процесс — это базовая единица выполнения программ. Это экземпляр запущенной программы, который включает в себя не только сам код программы, но и все необходимые ресурсы для её работы. Процесс можно представить как "живую" версию исполняемого файла: когда вы запускаете программу (например, через терминал или графический интерфейс), система создаёт процесс, который выполняет инструкции этой программы.
Код (текстовая секция): Инструкции программы, загруженные в память.
Данные: Глобальные переменные, константы и динамически выделяемая память (куча — heap).
Стек (stack): Для локальных переменных, параметров функций и управления вызовами.
Счётчики и регистры: Состояние процессора (PC — program counter, регистры CPU).
Дескрипторы файлов: Открытые файлы, сокеты и другие ресурсы ввода/вывода.
Среда (environment): Переменные окружения (например, PATH, HOME).
Контекст: Информация о приоритете, владельце (пользователь и группа), сигналах и т.д.
Каждый процесс уникален и изолирован от других (хотя они могут взаимодействовать через IPC — Inter-Process Communication, такие как пайпы, сокеты или разделяемая память). Процессы в Linux основаны на модели Unix: они иерархичны, с родительскими и дочерними процессами.
Фоновые (background): Запускаются с помощью & в конце команды или через bg. Не привязаны к терминалу.
Демоны (daemons): Фоновые процессы, которые работают в фоне системы (например, sshd, cron). Они обычно запускаются при загрузке и не имеют терминала.
Зомби-процессы: Процессы, которые завершились, но их родитель не собрал статус выхода (с помощью wait()). Они занимают место в таблице процессов, но не ресурсы.
Осиротевшие (orphan): Процессы, чей родитель завершился; они "усыновляются" процессом init (PID 1) или systemd.
Процессы управляются ядром Linux (kernel), которое отвечает за планирование, выделение ресурсов и безопасность. Ядро использует планировщик (scheduler) для распределения CPU-времени между процессами, обеспечивая многозадачность.
Создание (fork): Новый процесс создаётся путём копирования существующего (родительского) с помощью системного вызова fork(). Дочерний процесс получает копию адресного пространства родителя, но они становятся независимыми.
Загрузка программы (exec): После fork часто вызывается execve() (или аналоги), который заменяет содержимое процесса на новую программу из файла (например, /bin/bash).
Выполнение: Процесс выполняется в пользовательском режиме (user space), но может обращаться к ядру через системные вызовы (syscalls) для операций вроде чтения файлов или сетевого ввода/вывода.
Завершение (exit): Процесс завершается вызовом exit() или по сигналу (например, SIGTERM). Ядро освобождает ресурсы, уведомляет родителя о статусе выхода (exit code) и удаляет процесс из таблицы.
Очистка: Если родитель не ждёт (waitpid()), процесс становится зомби до тех пор, пока родитель не соберёт статус.
Таблица процессов: Ядро хранит информацию о процессах в структурах данных (task_struct в коде ядра). Каждый процесс имеет уникальный PID (Process ID), начиная с 1 (init/systemd).
Планирование: Используется Completely Fair Scheduler (CFS) по умолчанию. Процессы имеют приоритет (nice value от -20 до 19; ниже — выше приоритет).
Многопоточность: В Linux процессы могут иметь несколько потоков (threads), которые делят адресное пространство. Потоки — это "лёгкие процессы" (lightweight processes).
Безопасность: Процессы изолированы (пространства имён — namespaces, cgroups для контроля ресурсов). Root-процессы (UID 0) имеют полный доступ.
Сигналы: Способ общения с процессами. Ядро или другие процессы посылают сигналы (SIGKILL, SIGTERM) для прерывания, остановки или убийства.
Процессы потребляют ресурсы: CPU, память (RSS — Resident Set Size, VSS — Virtual Set Size), I/O. Перегрузка может привести к OOM (Out of Memory) killer, который убивает процессы для освобождения памяти.
Ниже приведён список полезных команд для мониторинга, управления и взаимодействия с процессами. Команды отсортированы по категориям для удобства. Для каждой команды указано описание, синтаксис и примеры.
Список открытых файлов процессов (включая сокеты, порты).
lsof [опции]
lsof -p PID — файлы PID. lsof -i :80 — процессы на порту 80.
strace
Трассирует системные вызовы процесса (для отладки).
strace [опции] команда
strace ls — трассировка ls. strace -p PID — прикрепиться к PID.
pmap
Отображает карту памяти процесса.
pmap [опции] PID
pmap 1234 — память PID 1234.
uptime
Показывает загрузку системы (включая среднюю нагрузку от процессов).
uptime
Просто uptime — время работы, пользователи, load average.
Для более глубокого анализа используйте /proc/PID/ (например, cat /proc/1234/status для статуса процесса). Команды вроде systemctl или service относятся к сервисам (демонам), но не напрямую к процессам. Если нужно, установите дополнительные инструменты вроде htop через пакетный менеджер (apt/yum/dnf).
Директория /proc (сокр. от "process information") — это виртуальная файловая система (procfs) в Linux, которая предоставляет интерфейс для доступа к информации о ядре, процессах и аппаратных ресурсах системы. Она не хранится на диске (как обычные файлы), а генерируется динамически ядром в памяти. Это псевдофайловая система, монтируемая при загрузке (обычно в /etc/fstab или автоматически systemd).
/proc появилась в Unix-подобных системах и стандартизирована в Linux. Она позволяет пользователям и скриптам получать "живую" информацию о системе без специальных инструментов. Доступ к ней осуществляется через стандартные команды работы с файлами, такие как cat, ls, grep, но файлы в ней — это не настоящие файлы, а "окна" в данные ядра.
Важные особенности:
Только чтение: Большинство файлов в /proc доступны только для чтения. Некоторые (например, в /proc/sys/) позволяют запись для изменения параметров ядра (требует прав root).
Динамичность: Содержимое обновляется в реальном времени. Если процесс завершается, его поддиректория исчезает.
Безопасность: Чувствительная информация (например, /proc/PID/environ) может быть защищена правами доступа. Root имеет полный доступ.
Монтирование: Проверить: mount | grep proc. Обычно монтируется с опциями вроде hidepid=2 для скрытия PID чужих процессов (в новых дистрибутивах для безопасности).