Чем отличается процесс от потока?
Процесс — это экземпляр выполняющейся программы с собственным изолированным адресным пространством, кодом, данными и ресурсами. Поток — это единица выполнения внутри процесса; все потоки одного процесса разделяют общее адресное пространство, но имеют собственный стек вызовов и набор регистров.
Аналогия: процесс — это отдельная квартира в доме (свои стены, своя мебель, свой замок). Потоки — это жильцы одной квартиры: они делят общую кухню и гостиную (память), но у каждого своя комната (стек).
Ключевые отличия
| Характеристика | Процесс | Поток |
|---|---|---|
| Адресное пространство | Собственное, изолированное | Общее с другими потоками процесса |
| Память | Своя куча (heap), стек, данные | Свой стек, но общая куча |
| Создание | Дорогое (~мс, копирование структур ОС) | Дешёвое (~мкс) |
| Переключение контекста | Дорогое (смена таблицы страниц, сброс TLB) | Дешевле (не нужно менять адресное пространство) |
| Обмен данными | Через IPC (pipes, shared memory, сокеты) | Напрямую через общую память |
| Изоляция | Полная (ошибка в одном процессе не затронет другой) | Низкая (ошибка в одном потоке может разрушить весь процесс) |
| Пример | Браузер Chrome — каждая вкладка в отдельном процессе | Веб-сервер — каждый запрос обрабатывается отдельным потоком |
Переключение контекста (Context Switch)
Когда ОС переключает выполнение с одного процесса/потока на другой, она:
- Сохраняет состояние текущего (регистры процессора, Program Counter, указатель стека).
- Загружает сохранённое состояние следующего.
- Для переключения процессов дополнительно: переключает таблицу страниц, что вызывает сброс 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 покажет, что вы следите за развитием платформы.