多线程Linux进程的地址空间布局

时间:2011-07-06 10:22:53

标签: c linux layout space memory-address

我想知道64位和32位多线程Linux进程的地址空间布局的完整细节。链接到任何描述它的文章将不胜感激。请注意,我需要了解完整的详细信息,而不仅仅是概述,因为我将直接处理它。所以我需要知道,例如,线程堆栈位于何处,堆,线程私有数据等......

1 个答案:

答案 0 :(得分:6)

线程堆栈在线程启动时分配mmap(甚至在之前 - 您可以在pthread_attr s中设置堆栈空间)。 TLS数据存储在线程堆栈的开头。线程堆栈的大小是固定的,通常是2到8 MB。线程处于活动状态时,无法更改每个线程的堆栈大小。 (第一个线程 - 运行main - 仍然在地址空间的末尾使用主堆栈,这个堆栈可能会增长和缩小。)堆和代码在所有线程之间共享。互斥体可以在data部分的任何位置 - 它只是一个结构。

线程堆栈的mmap没有固定在任何地址:

Glibc sources

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

PS现代GCC允许使用SplitStacks功能

来限制线程堆栈