Gymterview
junior

Чем отличается процесс от потока?

Процесс — это экземпляр выполняющейся программы с собственным изолированным адресным пространством, кодом, данными и ресурсами. Поток — это единица выполнения внутри процесса; все потоки одного процесса разделяют общее адресное пространство, но имеют собственный стек вызовов и набор регистров.

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

Ключевые отличия

Характеристика Процесс Поток
Адресное пространство Собственное, изолированное Общее с другими потоками процесса
Память Своя куча (heap), стек, данные Свой стек, но общая куча
Создание Дорогое (~мс, копирование структур ОС) Дешёвое (~мкс)
Переключение контекста Дорогое (смена таблицы страниц, сброс TLB) Дешевле (не нужно менять адресное пространство)
Обмен данными Через IPC (pipes, shared memory, сокеты) Напрямую через общую память
Изоляция Полная (ошибка в одном процессе не затронет другой) Низкая (ошибка в одном потоке может разрушить весь процесс)
Пример Браузер Chrome — каждая вкладка в отдельном процессе Веб-сервер — каждый запрос обрабатывается отдельным потоком

Переключение контекста (Context Switch)

Когда ОС переключает выполнение с одного процесса/потока на другой, она:

  1. Сохраняет состояние текущего (регистры процессора, Program Counter, указатель стека).
  2. Загружает сохранённое состояние следующего.
  3. Для переключения процессов дополнительно: переключает таблицу страниц, что вызывает сброс TLB и последующие TLB miss при обращениях к памяти.

Стоимость переключения:

  • Между потоками одного процесса: ~1-10 мкс.
  • Между процессами: ~10-100 мкс (из-за сброса TLB).

Когда выбирать процессы, а когда потоки

Критерий Процессы Потоки
Нужна изоляция сбоев Да (падение одного не затронет другие) Нет (один упавший поток роняет всё)
Нужен быстрый обмен данными Нет (IPC — накладные расходы) Да (общая память)
Экономия ресурсов Нет (каждый процесс — отдельное адресное пространство) Да (общая куча)
Безопасность Выше (изоляция на уровне ОС) Ниже (общая память — race conditions)

В Java

  • java.lang.Thread — создаёт поток ОС (в HotSpot JVM).
  • Виртуальные потоки (Virtual Threads, Java 21+) — лёгкие потоки, управляемые JVM, не привязанные 1:1 к потокам ОС. Тысячи виртуальных потоков могут работать на небольшом числе потоков ОС (carrier threads). Оптимальны для I/O-bound задач.
  • ProcessBuilder / Runtime.exec() — создание дочерних процессов из Java.
Пример
// Создание потока
Thread thread = new Thread(() -> System.out.println("Hello from thread"));
thread.start();

// Создание процесса
ProcessBuilder pb = new ProcessBuilder("ls", "-la");
Process process = pb.start();

Вывод

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

На собеседовании: один из самых частых junior-вопросов. Ключевое: процессы изолированы (своё адресное пространство), потоки делят память (общий heap). Обязательно упомяните стоимость переключения контекста и тот факт, что Java-потоки — это потоки ОС. Упоминание виртуальных потоков Java 21 покажет, что вы следите за развитием платформы.