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