В чем разница между процессом и потоком?

«В чем разница между процессом и потоком?» — вопрос из категории Linux и ОС, который задают на 38% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Процесс — это экземпляр выполняемой программы со своим изолированным виртуальным адресным пространством, ресурсами (открытые файлы, сокеты, память) и как минимум одним потоком выполнения. Поток (нить) — это единица исполнения внутри процесса, которая разделяет с другими потоками этого процесса его память и ресурсы.

Ключевые отличия: Аспект Процесс Поток (в рамках одного процесса)
Изоляция Полная: своя память, ресурсы, PID. Разделяют память (кучу, глобальные переменные) и ресурсы процесса. У каждого свой стек и регистры.
Создание Относительно «тяжелое» (через fork() + exec()), требует дублирования адресного пространства. «Легкое», создается в существующем адресном пространстве (pthread_create).
Коммуникация Сложнее: IPC (очереди сообщений, разделяемая память, сокеты, каналы). Проще: общие переменные, но требуется синхронизация (мьютексы, семафоры).
Устойчивость Сбой одного процесса не влияет на другие. Сбой (например, segmentation fault) в одном потоке обычно завершает весь процесс.
Переключение контекста Дороже, так как меняется и таблица страниц. Дешевле, так как адресное пространство общее.

Пример создания потока на C++ с использованием <thread> (C++11):

#include <iostream>
#include <thread>

void thread_function(int id) {
    std::cout << "Hello from thread " << id << std::endl;
}

int main() {
    std::thread t1(thread_function, 1); // Создание потока
    std::thread t2(thread_function, 2);

    t1.join(); // Ожидание завершения потока t1
    t2.join(); // Ожидание завершения потока t2

    std::cout << "Main thread finished.n";
    return 0;
}

В этом примере main() — главный поток процесса. Потоки t1 и t2 выполняются параллельно, разделяя стандартный вывод (std::cout).