Получить доступ

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

JuniorОперационные системы
Ещё спрашивают так:
  • Что такое процесс и поток в операционной системе?
  • Что общего у потоков одного процесса?
  • Почему падение потока может уронить весь процесс?
Коротко

Процесс — запущенная программа со своим адресным пространством и ресурсами. Поток — ход выполнения внутри процесса; потоки делят память процесса.

  • У каждого потока свой стек, регистры и счётчик команд
  • Общие у потоков: куча, глобальные переменные, открытые файлы
  • Процессы изолированы — общаться через каналы, сокеты, общую память

А ещё Поток дешевле создать и переключить, но ошибка в нём бьёт по всему процессу

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

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

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

У каждого потока своё:

  • стек — локальные переменные и цепочка вызовов;
  • регистры и счётчик команд;
  • состояние планирования (работает, готов, ждёт).

Общее у потоков процесса — куча, статические данные, код, открытые файлы и сокеты, рабочий каталог.

Цена. Создать процесс дороже: нужно новое адресное пространство (в 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 слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем