Структура адресного пространства для многопоточного процесса Linux

Я хочу знать все подробности о структуре адресного пространства многопоточного процесса Linux как для 64-разрядной, так и для 32-разрядной версии. Ссылка на любую статью, которая описывает это, будет оценена по достоинству. И заметьте, мне нужно знать полную информацию, а не только обзор, потому что я буду иметь дело непосредственно с этим. Поэтому мне нужно знать, например, где расположены стеки потоков, куча, частные данные потока и т. д.


person MetallicPriest    schedule 06.07.2011    source источник
comment
Особенно я хочу знать подробности о части, которая доступна для записи. Например, мне не нужно иметь дело с той частью адресного пространства, которая содержит код, так как она недоступна для записи.   -  person MetallicPriest    schedule 06.07.2011
comment
Вы знаете все подробности процесса Linux без потоков, не так ли? Разница между однопоточным и многопоточным состоит в количестве и месте стеков.   -  person osgx    schedule 06.07.2011


Ответы (1)


Стеки потоков выделяются с помощью mmap в начале потока (или даже раньше — вы можете установить пространство стека в pthread_attrs). Данные TLS хранятся в начале стека потока. Размер стеков потоков фиксированный, обычно он составляет от 2 до 8 МБ. Размер стека каждого потока не может быть изменен, пока поток активен. (Первый поток — работающий основной — по-прежнему использует основной стек в конце адресного пространства, и этот стек может увеличиваться и уменьшаться.) Куча и код совместно используются всеми потоками. Мьютексы могут быть где угодно в секции data — это просто структура.

Ммап стека потока не фиксируется ни по одному адресу:

исходники Glibc

 mem = mmap (NULL, size, prot,
                  MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK, -1, 0);

PS современный GCC позволяет стек потоков быть неограниченным с функцией SplitStacks

person osgx    schedule 06.07.2011