Какие участки памяти создаются при создании потока в Linux/Unix-подобной системе?

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

Ответ

При создании нового потока (например, с помощью pthread_create() или std::thread) в рамках существующего процесса операционная система выделяет для него новый регион памяти под стек. Размер стека по умолчанию обычно составляет от 1 до 8 МБ (зависит от ОС и может настраиваться через атрибуты потока).

Ключевое разделение памяти в многопоточном процессе:

  • Разделяемые всеми потоками:
    • Сегмент кода (.text) — исполняемые инструкции программы.
    • Сегмент данных (глобальные и статические переменные).
    • Куча (heap) — память, выделяемая через malloc()/new.
  • Уникальные для каждого потока:
    • Стек (stack) — содержит локальные переменные, аргументы функций и информацию о вызовах (call stack).
    • Thread-Local Storage (TLS) — область для переменных, объявленных с thread_local в C++11.

Пример, демонстрирующий разные стеки:

#include <iostream>
#include <thread>

void thread_func() {
    int local_to_thread = 42; // Живёт в стеке нового потока
    std::cout << "Thread stack address: " << &local_to_thread << 'n';
}

int main() {
    int local_to_main = 10; // Живёт в стеке главного потока
    std::cout << "Main stack address:  " << &local_to_main << 'n';

    std::thread t(thread_func);
    t.join();
}
// Адреса &local_to_main и &local_to_thread будут значительно различаться.