我想知道 64 位和 32 位多线程 Linux 进程的地址空间布局的完整细节。链接到描述它的任何文章将不胜感激。请注意,我需要了解全部细节,而不仅仅是概览,因为我将直接处理它。所以我需要知道,例如,线程堆栈位于何处、堆、线程私有(private)数据等...
最佳答案
线程堆栈在线程启动时使用 mmap
分配(甚至更早 - 您可以在 pthread_attr
中设置堆栈空间)。 TLS 数据存储在线程堆栈的开头。线程堆栈的大小是固定的,通常为 2 到 8 MB。当线程处于事件状态时,不能更改每个线程的堆栈大小。 (第一个线程 - 运行 main - 仍然使用地址空间末尾的主堆栈,这个堆栈可能会增长和缩小。)堆和代码在所有线程之间共享。互斥量可以位于 data
部分的任何位置 - 它只是一个结构。
线程栈的mmap不固定在任何地址:
mem = mmap (NULL, size, prot,
MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK, -1, 0);
PS 现代 GCC 允许线程堆栈不受限制 SplitStacks特征
关于c - 多线程 Linux 进程的地址空间布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6594865/