Что такое процесс
Чем «программа на диске» отличается от «программы, которая прямо сейчас работает».
Процесс — это программа в состоянии выполнения: её код, данные, выделенная память и текущее состояние регистров. Одна программа на диске может породить много процессов.
Программа и процесс — не одно и то же
Программа — это пассивный набор инструкций в файле (например, chrome.exe). Процесс — это активная сущность: запущенная копия программы со своими данными в памяти. Откройте браузер дважды — будет один файл программы, но два процесса со своими вкладками и состоянием.
Адресное пространство процесса
У каждого процесса есть собственное адресное пространство — изолированный диапазон памяти, который он считает своим. Оно разделено на области:
| Область | Что хранит |
| Код (text) | машинные инструкции программы |
| Данные (data) | глобальные и статические переменные |
| Куча (heap) | динамически выделяемая память (растёт вверх) |
| Стек (stack) | локальные переменные, вызовы функций (растёт вниз) |
Изоляция адресных пространств — основа безопасности: один процесс не может прочитать память другого, даже если очень захочет. Между кучей и стеком есть свободное пространство, чтобы обе области могли расти навстречу друг другу.
Состояния процесса
Процесс не всегда выполняется — большую часть времени он чего-то ждёт. ОС отслеживает состояние каждого процесса:
- Новый (new) — процесс создаётся.
- Готов (ready) — готов выполняться, ждёт процессор.
- Выполняется (running) — прямо сейчас на процессоре.
- Ожидает (waiting/blocked) — ждёт события (например, данные с диска).
- Завершён (terminated) — закончил работу.
создан
|
[new] --> [ready] <----------------+
| ^ |
планировщик| | вытеснен | событие
выбрал v | (квант истёк) | произошло
[running] -----------------+
| \
завершён| \ запросил ввод-вывод
v v
[terminated] [waiting]
Блок управления процессом (PCB)
Чтобы управлять процессом, ОС хранит про него всё нужное в структуре PCB (Process Control Block). Это «личное дело» процесса:
- идентификатор процесса (
PID); - состояние (ready/running/...);
- значения регистров и счётчика команд (чтобы продолжить с того же места);
- информация о памяти (где лежит адресное пространство);
- открытые файлы, приоритет, статистика.
Когда ОС переключается с одного процесса на другой, она сохраняет состояние в PCB первого и загружает PCB второго. Это и есть переключение контекста — отдельный урок этого раздела.
Считаем процессы по состояниям
Смоделируем «снимок» планировщика: у нас список процессов с их состояниями, и мы хотим понять, кто борется за процессор, а кто заблокирован.
from collections import Counter
processes = [
("P1", "running"),
("P2", "ready"),
("P3", "ready"),
("P4", "waiting"),
("P5", "ready"),
("P6", "waiting"),
]
counts = Counter(state for _, state in processes)
for state in ("running", "ready", "waiting"):
print(f"{state:8}: {counts[state]}")
ready = [name for name, st in processes if st == "ready"]
print(f"За процессор борются: {ready}")
print(f"Заблокированы (ждут ввод-вывод): {counts['waiting']}")
Вывод:
running : 1 ready : 3 waiting : 2 За процессор борются: ['P2', 'P3', 'P5'] Заблокированы (ждут ввод-вывод): 2
Итог
- Процесс — это выполняющаяся программа со своим адресным пространством.
- Адресное пространство делится на код, данные, кучу и стек.
- Процесс проходит состояния: new, ready, running, waiting, terminated.
- Вся информация о процессе хранится в PCB — «личном деле» процесса.
- Изоляция адресных пространств обеспечивает безопасность между процессами.