Открыть сервис

Состояния процесса

Состояние процесса — это дискретная стадия, на которой находится выполняющаяся программа (процесс) в операционной системе в конкретный момент времени. Состояние определяет, какие действия может выполнять процесс, какие ресурсы ему доступны и как он взаимодействует с другими процессами и ядром ОС. Переходы между состояниями управляются планировщиком задач и являются основой многозадачности.

Классификация состояний

В современных операционных системах выделяют пять основных состояний процесса, хотя в разных реализациях (Linux, Windows, FreeBSD) могут присутствовать дополнительные подсостояния.

Создание (New / Created)

Процесс находится на этапе инициализации. Операционная система выделяет ему идентификатор (PID), создаёт структуры данных в памяти ядра (дескриптор процесса, таблицу страниц), загружает код и данные из исполняемого файла. На этом этапе процесс ещё не готов к выполнению. В системах семейства UNIX создание обычно происходит через системный вызов fork(), после которого новый процесс (дочерний) переходит в состояние готовности. В Windows аналогичную роль выполняет CreateProcess.

Готовность (Ready)

Процесс полностью загружен в оперативную память, все необходимые ресурсы выделены, и он ожидает только выделения процессорного времени (кванта) планировщиком. В этом состоянии процесс находится в очереди готовых к выполнению процессов. Планировщик, используя алгоритмы (например, Round Robin, приоритетное планирование), выбирает следующий процесс для перевода в состояние выполнения. В многопроцессорных системах может существовать несколько очередей готовности — по одной на каждое ядро.

Выполнение (Running)

Процесс активно выполняется на центральном процессоре. В этот момент процессор исполняет инструкции, загруженные из адресного пространства процесса. В однопроцессорной системе в любой момент времени только один процесс может находиться в этом состоянии (на одном ядре). В многопроцессорных системах количество одновременно выполняющихся процессов равно числу ядер. Процесс покидает это состояние по одной из трёх причин:

  • Истечение выделенного кванта времени (прерывание таймера) — переход в состояние готовности.
  • Запрос на выполнение операции ввода-вывода или ожидание события (например, нажатия клавиши) — переход в состояние ожидания.
  • Завершение работы — переход в состояние завершения.

Ожидание (Blocked / Waiting)

Процесс не может продолжать выполнение, пока не произойдёт некоторое внешнее событие. Типичные причины: ожидание завершения операции ввода-вывода (чтение с диска, отправка данных по сети), ожидание освобождения ресурса (семафора, мьютекса), ожидание сигнала от другого процесса, ожидание ввода данных с клавиатуры. В этом состоянии процесс не использует процессорное время и находится в очереди ожидания, связанной с конкретным событием. Когда событие происходит (например, завершилась операция чтения с диска), процесс переводится обратно в состояние готовности.

Завершение (Terminated / Zombie)

Процесс завершил своё выполнение (вызов exit() в UNIX или ExitProcess в Windows). Операционная система освобождает большую часть ресурсов процесса (память, открытые файлы), но сохраняет минимальную запись в таблице процессов (обычно код возврата и статистику использования ресурсов). Эта запись необходима для того, чтобы родительский процесс мог получить статус завершения дочернего процесса через системный вызов wait() (в UNIX) или WaitForSingleObject (в Windows). Пока родительский процесс не вызовет соответствующую функцию, дочерний процесс остаётся в состоянии «зомби» (zombie process). В Windows это состояние называется «завершённый» (terminated), и система автоматически удаляет запись после получения статуса.

Дополнительные состояния в современных ОС

В некоторых операционных системах (особенно в Linux) выделяют дополнительные подсостояния для более точного управления ресурсами.

Приостановленное состояние (Suspended / Swapped)

Процесс временно выгружен из оперативной памяти на диск (в область подкачки или swap-раздел). Это происходит, когда система испытывает нехватку физической памяти. Процесс может быть приостановлен как в состоянии готовности (ready-suspended), так и в состоянии ожидания (blocked-suspended). При освобождении памяти процесс загружается обратно и переходит в соответствующее базовое состояние (готовность или ожидание). В современных системах с большим объёмом ОЗУ это состояние встречается реже, но активно используется в мобильных ОС (Android, iOS) для фоновых процессов.

Состояние «спящий» (Sleeping / Interruptible Sleep)

В Linux существует два варианта состояния ожидания: прерываемый сон (interruptible sleep, состояние S) и непрерываемый сон (uninterruptible sleep, состояние D). В прерываемом сне процесс может быть разбужен сигналом (например, SIGTERM). В непрерываемом сне процесс ожидает завершения критической операции ввода-вывода (например, записи на диск) и не может быть прерван даже сигналом. Это состояние используется для защиты целостности данных при работе с устройствами хранения.

Состояние «трассируемый» (Traced / Stopped)

Процесс временно остановлен отладчиком (например, gdb или strace). В этом состоянии процесс не выполняется, но его память и состояние регистров доступны для анализа. Переход в это состояние происходит при получении сигнала SIGSTOP или при установке точки останова (breakpoint). Отладчик может возобновить выполнение процесса, отправив сигнал SIGCONT.

Диаграмма переходов состояний

Классическая диаграмма состояний процесса включает пять базовых состояний и семь основных переходов:

  1. Создание → Готовность: процесс инициализирован и помещён в очередь готовых процессов.
  2. Готовность → Выполнение: планировщик выбирает процесс для выполнения.
  3. Выполнение → Готовность: истечение кванта времени или вытеснение более приоритетным процессом.
  4. Выполнение → Ожидание: процесс запрашивает операцию ввода-вывода или ожидает события.
  5. Ожидание → Готовность: событие произошло, процесс готов к выполнению.
  6. Выполнение → Завершение: процесс завершил работу.
  7. Готовность → Завершение (редко): родительский процесс может принудительно завершить дочерний процесс, находящийся в очереди готовности (например, через kill в UNIX).

В системах с поддержкой приостановки добавляются переходы:

  • Готовность → Приостановлен (готовый) — выгрузка в swap.
  • Приостановлен (готовый) → Готовность — загрузка обратно в память.
  • Ожидание → Приостановлен (ожидающий) — выгрузка в swap.
  • Приостановлен (ожидающий) → Готовность — событие произошло, процесс загружен в память.

Реализация в популярных ОС

Linux

В ядре Linux состояния процесса определяются в поле state структуры task_struct. Основные значения: TASK_RUNNING (готовность или выполнение), TASK_INTERRUPTIBLE (прерываемый сон), TASK_UNINTERRUPTIBLE (непрерываемый сон), TASK_STOPPED (остановлен), TASK_TRACED (трассируется), EXIT_ZOMBIE (зомби), EXIT_DEAD (полностью завершён). Просмотреть состояния процессов можно командой ps aux — в колонке STAT отображаются буквенные коды (R, S, D, Z, T).

Windows

В Windows состояния процесса реализованы через структуру EPROCESS. Основные состояния: Ready (готовность), Running (выполнение), Waiting (ожидание), Terminated (завершён). Также существует состояние Transition (переходный) — процесс загружается в память из файла подкачки. В диспетчере задач Windows состояния отображаются как «Выполняется», «Ожидание», «Приостановлен».

macOS / FreeBSD

В этих системах используется схема, близкая к Linux. Дополнительно выделяется состояние IDLE (простой) для процессов, которые не имеют работы (например, процесс idle на каждом ядре). В FreeBSD также существует состояние SLEEP с подсостояниями SSLEEP (сон) и SWAIT (ожидание).

Значение для операционной системы

Управление состояниями процессов — фундаментальный механизм, обеспечивающий:

  • Многозадачность: чередование выполнения процессов позволяет создавать иллюзию одновременной работы нескольких программ.
  • Эффективное использование ресурсов: процессы, ожидающие ввода-вывода, не занимают процессор, что повышает общую производительность системы.
  • Изоляцию и защиту: каждое состояние связано с определённым набором прав доступа к памяти и устройствам.
  • Планирование: знание состояний позволяет планировщику принимать оптимальные решения о распределении процессорного времени.

Интересные факты

  • В ранних версиях UNIX (до 7-го издания) существовало только три состояния: выполнение, готовность и ожидание. Состояние «зомби» было введено для упрощения механизма получения статуса завершения.
  • В операционной системе Plan 9 от Bell Labs состояния процессов были упрощены до двух: «выполняется» и «ожидает». Все остальные состояния считались частными случаями.
  • В реальном времени (RTOS) часто используется только два состояния: «выполнение» и «готовность», так как процессы не должны блокироваться на длительное время.
  • В ядре Linux для процессов в состоянии TASK_UNINTERRUPTIBLE существует механизм «заморозки» (freeze), используемый при создании дампа памяти (coredump) или при переходе в режим гибернации.

Источники

  • Таненбаум Э., Бос Х. «Современные операционные системы» (4-е издание, 2015)
  • Ловелл Р. «Ядро Linux. Описание процесса разработки» (3-е издание, 2010)
  • Сильбершац А., Гэлвин П., Гэгн Г. «Операционные системы: внутренняя структура и принципы проектирования» (9-е издание, 2015)
  • Документация ядра Linux: Documentation/scheduler/
  • Спецификация POSIX.1-2017, раздел «Process Scheduling»

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →