Linux上线程栈是否来自进程的内存映射段?

Linux上线程栈是否来自进程的内存映射段?

我目前正在学习Linux。我知道线程是Linux上的一种轻量级进程。但我想知道线程堆栈空间从哪里来。

线程的堆栈是私有的。它独立于进程堆栈。根据我的搜索,有人说线程堆栈是由mmap().而且,有些人说mmap()空间不是heap。它位于栈和堆之间。所以线程栈来自于进程的内存映射段。那是对的吗?

答案1

就Linux内核而言,线程比平时有更多共享的进程(例如它们的地址空间、信号处理和进程 ID(实际上是它们的线程组 ID)。

当一个进程启动时,它有一个线程,带有一个堆栈等。当该线程启动另一个线程时,由创建线程为新线程提供一个堆栈;这通常使用 完成mmap,因为mmap支持各种标志,有助于确保分配的内存适合用作堆栈。看中的示例程序man 2 clone。然而,没有要求使用mmap,任何满足堆栈要求的已分配内存块都可以使用。

为线程设置的堆栈不是私有的:它们对于共享相同地址空间的其他线程是可见的。但是,它们必须保留供单个线程用作堆栈(至少可以说,共享单个堆栈的多个线程不会很好地工作)。

Linux 上的线程是作为进程实现的吗?了解更多背景和历史。

相关内容