Блок управления процессом¶
Блок управления процессом (англ. 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 →


