Схема адресного пространства для многопоточного процесса Linux - PullRequest
6 голосов
/ 06 июля 2011

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

1 Ответ

6 голосов
/ 06 июля 2011

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

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

Источники Glibc

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

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

...