ps

Sep, 14, 2024

ps

Отображает информацию о процессах, выполняющихся в системе.

📖 man ps (man7.org)

ps -eo pid,ppid,comm,stat
PID    PPID COMMAND         STAT
  1       0 systemd         Ss
  2       0 kthreadd        S
  3       2 rcu_gp          I<

⚙️ Основные состояния процесса

  • R : Running (выполняющийся): процесс выполняется на CPU или находится в очереди готовности планировщика. В этом состоянии процесс имеет активный контекст и может быть прерван только по расписанию или системным событиям.
  • S : Interruptible Sleep (прерываемый сон): процесс временно приостановлен и ожидает события, например завершения операции ввода-вывода. Может быть пробуждён сигналом. Это наиболее частое состояние процессов в пользовательском пространстве.
  • D : Uninterruptible Sleep (непрерываемое ожидание): процесс ожидает завершения критической операции ядра, обычно связанной с диском, сетью или устройством. В этом состоянии процесс не может быть прерван сигналами, что предотвращает неконсистентность данных.
  • T : Stopped (остановленный): процесс приостановлен пользователем (SIGSTOP, SIGTSTP) или системой, например при отладке. Его выполнение может быть возобновлено без потери контекста.
  • Z : Zombie (зомби-процесс): процесс завершил выполнение, но запись о нём остаётся в таблице процессов до тех пор, пока родитель не считает его статус с помощью системного вызова wait(). Зомби не используют ресурсы CPU или памяти.
  • I : Idle (неактивный): внутреннее состояние потоков ядра, которые не участвуют в пользовательском планировании. Используется только для системных задач и не наблюдается у обычных процессов.
  • X : Dead (мёртвый): завершённое и полностью очищенное состояние процесса. Обычно невидимо пользователю, так как процесс удалён из таблицы задач ядра.

🧩 Дополнительные флаги состояния

Дополнительные буквы, отображающиеся рядом с основным состоянием в ps , уточняют характеристики процесса:

  • s : Session Leader: процесс является лидером сессии и управляет группой процессов.
  • l : Multithreaded: процесс многопоточный, использует POSIX Threads (вызов clone()).
  • < : High Priority: процесс выполняется с повышенным приоритетом (nice < 0).
  • N : Low Priority: процесс выполняется с пониженным приоритетом (nice > 0).
  • L : Locked Pages: процесс удерживает страницы в оперативной памяти, запрещая их выгрузку на диск.
  • + : Foreground: процесс взаимодействует с управляющим терминалом (foreground).

🧩 Схема переходов состояний

  A[Создание процесса] --> R[Running]
  R --> S[Sleeping]
  R --> D[Uninterruptible Sleep]
  S --> R
  D --> R
  R --> T[Stopped]
  T --> R
  R --> Z[Zombie]
  Z --> X[Dead]

Если родительский процесс не вызывает wait() и продолжает выполняться, завершённый потомок остаётся в таблице процессов ядра в состоянии defunct.
Ядро не может удалить запись самостоятельно, поскольку по стандарту POSIX это обязанность родителя.

Зомби не выполняется и не использует оперативную память, но удерживает структуру task_struct и PID, что при накоплении может привести к исчерпанию таблицы процессов и ошибкам fork().
Очистка происходит только после завершения родителя, когда ядро переназначает зомби демону systemd, вызывающему wait() и удаляющему их из системы.

ps | Aleksandr Suprun