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

Блок управления процессом

Блок управления процессом (англ. Process Control Block, PCB) — это структура данных в операционной системе, содержащая всю информацию, необходимую для управления выполнением отдельного процесса. Каждый процесс в системе представлен своим собственным блоком управления, который служит его «паспортом» и позволяет операционной системе идентифицировать, планировать и переключать процессы. PCB создаётся при запуске процесса и существует до его завершения, хранясь в оперативной памяти в области ядра операционной системы.

История

Концепция блока управления процессом возникла вместе с развитием многозадачных операционных систем в 1960-х годах. Ранние системы, такие как IBM OS/360 (1964 год), использовали аналогичные структуры для управления задачами. В 1970-х годах, с появлением Unix, PCB стал стандартным элементом ядра. В современных операционных системах (Windows, Linux, macOS) PCB реализован в виде записи в таблице процессов, которая может содержать десятки полей. В операционной системе Linux аналогом PCB является структура task_struct, определённая в файле include/linux/sched.h.

Структура и содержимое

Блок управления процессом содержит несколько категорий данных, которые можно разделить на три основные группы: идентификационные, управляющие и аппаратные.

Идентификационные данные

  • Идентификатор процесса (PID) — уникальный числовой номер, присваиваемый процессу при создании.
  • Идентификатор родительского процесса (PPID) — PID процесса, создавшего данный процесс.
  • Идентификатор пользователя (UID) — идентификатор владельца процесса, используемый для контроля доступа.

Управляющие данные

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

Аппаратные данные (контекст)

  • Регистры процессора — копия содержимого всех регистров общего назначения, регистра флагов и других аппаратных регистров, сохранённая при переключении контекста.
  • Указатель стека — адрес вершины стека процесса в памяти.

Классификация

Блоки управления процессом можно классифицировать по способу хранения и доступа:

  • Фиксированные PCB — хранятся в статическом массиве фиксированного размера. Используются в простых или встраиваемых системах с ограниченным числом процессов. Недостаток — ограничение на максимальное количество процессов.
  • Динамические PCB — выделяются из кучи или пула памяти по мере создания процессов. Позволяют системе поддерживать произвольное количество процессов (до исчерпания памяти). Используются в современных ОС общего назначения, таких как Linux и Windows.

По принадлежности к пространству памяти:

  • PCB ядра — хранятся в адресном пространстве ядра операционной системы, недоступны для пользовательских процессов напрямую.
  • PCB пользователя — в некоторых микроядерных архитектурах часть данных PCB может храниться в пользовательском пространстве, но это редкость.

Управление процессами с помощью PCB

Создание процесса

При создании нового процесса (например, через системный вызов fork() в Unix) операционная система выделяет память под новый PCB, заполняет его начальными значениями (PID, PPID, состояние «готов»), копирует часть данных из родительского процесса и связывает PCB с таблицей процессов. В Linux при вызове fork() создаётся копия структуры task_struct родителя, после чего в неё вносятся изменения.

Планирование и переключение контекста

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

Завершение процесса

При завершении процесса (нормальном или аварийном) его PCB удаляется из таблицы процессов, а занимаемая им память освобождается. В некоторых системах (например, в Unix) PCB сохраняется до тех пор, пока родительский процесс не вызовет wait(), чтобы получить код завершения.

Примеры реализации

Linux (структура task_struct)

В ядре Linux PCB представлен структурой task_struct, которая содержит более 100 полей. Ключевые из них:

  • pid — идентификатор процесса.
  • state — состояние процесса (TASK_RUNNING, TASK_INTERRUPTIBLE и др.).
  • prio — динамический приоритет.
  • thread_info — информация о потоке, включая указатель на стек.
  • files — указатель на структуру с открытыми файлами.
  • mm — указатель на структуру, описывающую адресное пространство памяти.

Windows (структура EPROCESS)

В Windows PCB реализован в виде структуры EPROCESS (Executive Process Block), которая находится в адресном пространстве ядра. Она включает:

  • ProcessId — PID.
  • ThreadListHead — список потоков процесса.
  • Vm — управление виртуальной памятью.
  • Tokenмаркер безопасности (учётные данные пользователя).

Значение и критика

Блок управления процессом является фундаментальным элементом любой многозадачной операционной системы. Без него невозможно переключение между процессами, управление ресурсами или защита памяти. Однако PCB также вносит накладные расходы: каждая операция создания, переключения и завершения процесса требует записи и чтения из PCB, что увеличивает время выполнения системных вызовов. В высоконагруженных системах (например, серверах баз данных) количество процессов может достигать десятков тысяч, и размер PCB (обычно от 1 до 10 КБ) становится значительным фактором использования памяти.

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

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

  • В ранних версиях Unix PCB хранился в фиксированной области памяти ядра, что ограничивало количество процессов (обычно 50–100).
  • В операционной системе MINIX, разработанной Эндрю Таненбаумом для обучения, PCB содержит всего 10 полей, что делает его простым для понимания.
  • В некоторых встраиваемых системах (например, FreeRTOS) PCB называется Task Control Block (TCB) и имеет минимальный размер — около 20–30 байт.

Источники

  • Таненбаум Э., Бос Х. «Современные операционные системы». 4-е издание, 2015.
  • Love R. «Linux Kernel Development». 3rd edition, 2010.
  • Silberschatz A., Galvin P., Gagne G. «Operating System Concepts». 10th edition, 2018.
  • Документация ядра Linux: include/linux/sched.h.
  • Microsoft Docs: «Windows Kernel-Mode Process and Thread Manager».

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

На главную BFOmetr →