Процесс и поток: в чём разница

Разбираемся, что такое процесс, что такое поток и почему это разные вещи.

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

Когда вы запускаете программу, операционная система создаёт процесс: выделяет ему память, открывает доступ к файлам и даёт хотя бы один поток исполнения. Процесс — это «коробка» с ресурсами. Внутри коробки бегает как минимум один поток — именно поток выполняет инструкции по одной.

Что у процесса своё, а что общее у потоков

Главное отличие — память. У каждого процесса своё адресное пространство: процесс A не может случайно прочитать переменные процесса B. Это даёт изоляцию и безопасность, но обмен данными между процессами стоит дорого (нужны специальные каналы).

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

ЧтоПроцессПоток
Адресное пространствосвоё, изолированноеобщее с другими потоками
Созданиедорогоедешёвое
Обмен даннымичерез IPC (каналы, очереди)через общие переменные
Падение одногоне роняет другие процессыможет уронить весь процесс

Зачем вообще нужны потоки

Представьте текстовый редактор. Один поток принимает нажатия клавиш, другой в фоне проверяет орфографию, третий каждые 30 секунд сохраняет файл. Если бы всё это делал один поток последовательно, проверка орфографии «подвешивала» бы ввод текста. Потоки позволяют разнести задачи и держать интерфейс отзывчивым.

import threading

def save_file():
    print("Автосохранение...")

# поток внутри того же процесса, общая память
t = threading.Thread(target=save_file)
t.start()
t.join()

Этот код использует реальные потоки ОС, поэтому в браузере мы его не запускаем — он помечен как текст. Дальше в курсе вы увидите, почему в Python потоки ведут себя особенно.

Как работает под капотом

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

Создание процесса требует копирования адресного пространства (или хитрого copy-on-write), поэтому оно тяжелее. Создание потока — это просто новый стек и запись в таблице потоков, поэтому потоки «легче».

Частые ошибки

  • Путать процесс и поток. «Программа = процесс, линия исполнения = поток». Программа может иметь много потоков, но это всё ещё один процесс.
  • Думать, что потоки изолированы. Нет: они делят память, и это источник самых коварных багов.
  • Считать, что больше потоков = всегда быстрее. Переключение между потоками тоже стоит времени.

Итог

  • Процесс — изолированная «коробка» с памятью и ресурсами.
  • Поток — линия исполнения внутри процесса; потоки делят память.
  • Потоки дешевле процессов, но общая память порождает гонки.
  • Падение потока может уронить весь процесс; падение процесса другие не задевает.
Проверьте себя
1. Что разделяют между собой потоки одного процесса?
AНичего — каждый поток полностью изолирован
BОбщую память (кучу и глобальные переменные)
CТолько номер процесса, но не данные
DОтдельные адресные пространства
2. Почему создание потока обычно дешевле создания процесса?
AПоток не выполняет код
BПотоку не нужно копировать адресное пространство — память общая
CПроцессы не используют память
DПотоки работают только на одном ядре