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

Ответ

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

Ключевые отличия: Аспект Процесс Поток (в рамках одного процесса)
Изоляция Полная: своя память, ресурсы, 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).

Ответ 18+ 🔞

Давай разжую эту тему, как будто объясняю приятелю после третьей кружки кофе. Представь, что твой компьютер — это огромный офис, а операционная система — его строгий, но справедливый директор.

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

Чем они, сука, отличаются, если коротко:

Штука Процесс (целый отдел) Поток (работник внутри)
Изоляция Полная, как в банковском сейфе. Своя память, свои ресурсы. Почти никакой. Все потоки в процессе — как одна семья в коммуналке: всё общее, кроме зубных щёток (стека).
Создание Тяжёлое и долгое. Надо новую комнату арендовать, мебель закупить — овердохуища возни. Легкое, как нанять стажёра. Посадил за свободный стол в уже существующей комнате — и пусть работает.
Общение Сложное. Отделы общаются через официальные каналы: служебки (IPC), совещания (сокеты). Простое, но опасное. Можно крикнуть через комнату (общая переменная), но так и до драки (race condition) недалеко. Нужны правила — мьютексы.
Надёжность Высокая. Если один отдел (процесс) накрылся медным тазом (упал с segfault), другие могут и не заметить. Низкая. Если один поток-работник накосячил так, что упал, он, сука, потянет за собой весь свой отдел (процесс). Доверия ебать ноль.
Переключение задач Дорогое. Директору (ОС) надо перейти в другой кабинет, найти новые документы. Дешёвое. Директор просто поворачивается к соседнему столу в той же комнате.

Вот тебе живой пример на C++, чтобы вообще всё стало ясно, как божий день:

#include <iostream>
#include <thread>

// Функция, которую будут выполнять наши работники-потоки
void thread_function(int id) {
    // Все потоки лезут в один общий cout — тут бы мьютекс не помешал
    std::cout << "Привет с потока номер " << id << std::endl;
}

int main() {
    // Наняли двух стажёров (потоки) и дали им работу
    std::thread t1(thread_function, 1);
    std::thread t2(thread_function, 2);

    // Ждём, пока они закончат, а то разбегутся (станут демонами)
    t1.join();
    t2.join();

    std::cout << "Главный поток (начальник отдела) закончил.n";
    return 0;
}

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