Чем процесс отличается от потока?
- Что такое процесс и поток в операционной системе?
- Что общего у потоков одного процесса?
- Почему падение потока может уронить весь процесс?
Процесс — запущенная программа со своим адресным пространством и ресурсами. Поток — ход выполнения внутри процесса; потоки делят память процесса.
- У каждого потока свой стек, регистры и счётчик команд
- Общие у потоков: куча, глобальные переменные, открытые файлы
- Процессы изолированы — общаться через каналы, сокеты, общую память
А ещё Поток дешевле создать и переключить, но ошибка в нём бьёт по всему процессу
Подробно
Процесс — единица изоляции. Операционная система выдаёт ему виртуальное адресное пространство (код, данные, куча, стеки), таблицу открытых файлов, идентификатор, права пользователя. Один процесс не может прочитать память другого — это защищает систему от чужих ошибок.
Поток — единица планирования: последовательность инструкций, которую планировщик ставит на ядро процессора. В процессе есть хотя бы один поток. Потоки одного процесса видят одну и ту же память, поэтому обмениваться данными им просто — достаточно общей переменной. Но ровно отсюда гонки данных и необходимость синхронизации.
У каждого потока своё:
- стек — локальные переменные и цепочка вызовов;
- регистры и счётчик команд;
- состояние планирования (работает, готов, ждёт).
Общее у потоков процесса — куча, статические данные, код, открытые файлы и сокеты, рабочий каталог.
Цена. Создать процесс дороже: нужно новое адресное пространство (в Linux fork копирует таблицы страниц, а сами страницы — лениво, copy-on- write). Переключение между процессами дороже переключения потоков: меняется адресное пространство, сбрасывается часть кэша трансляции адресов (TLB).
Изоляция против удобства. Ошибка доступа к памяти в одном потоке убивает весь процесс. Поэтому браузеры запускают вкладки отдельными процессами, а веб-серверы вроде nginx и PostgreSQL используют рабочие процессы. Обмен между процессами — через каналы (pipe), сокеты, общую память, файлы.
Связь с языками. В Java поток Thread — поток ОС (виртуальные потоки Java 21 — лёгкие, их много на одном потоке ОС). В Python потоки — тоже потоки ОС, но GIL не даёт им одновременно исполнять байт-код, поэтому для вычислений берут процессы (multiprocessing).
Пример
from threading import Thread
from multiprocessing import Process
counter = 0
def inc():
global counter
counter += 1
t = Thread(target=inc); t.start(); t.join()
print(counter) # 1 — поток изменил общую переменную
p = Process(target=inc); p.start(); p.join()
print(counter) # всё ещё 1 — у процесса своя копия памятиЧто хотят услышать
- Процесс — изоляция и ресурсы, поток — выполнение внутри процесса.
- Что общее у потоков и что своё (стек, регистры).
- Сравнение цены создания и переключения.
- Как процессы общаются и почему падение потока роняет процесс.
Частые ошибки
- «Поток — это маленький процесс» без объяснения общей памяти.
- Считать, что у потоков разные кучи.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Процесс — своё адресное пространство; потоки процесса делят память
- ✗Потоки одного процесса не видят общую кучу
- ✗Процессы по умолчанию делят общую память
- ✗Поток дороже создать, чем процесс
Что спросят дальше
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.