我目前正在学习Linux。我知道线程是Linux上的一种轻量级进程。但我想知道线程堆栈空间从哪里来。
线程的堆栈是私有的。它独立于进程堆栈。根据我的搜索,有人说线程堆栈是由mmap()
.而且,有些人说mmap()
空间不是heap
。它位于栈和堆之间。所以线程栈来自于进程的内存映射段。那是对的吗?
答案1
就Linux内核而言,线程是比平时有更多共享的进程(例如它们的地址空间、信号处理和进程 ID(实际上是它们的线程组 ID)。
当一个进程启动时,它有一个线程,带有一个堆栈等。当该线程启动另一个线程时,由创建线程为新线程提供一个堆栈;这通常使用 完成mmap
,因为mmap
支持各种标志,有助于确保分配的内存适合用作堆栈。看中的示例程序man 2 clone
。然而,没有要求使用mmap
,任何满足堆栈要求的已分配内存块都可以使用。
为线程设置的堆栈不是私有的:它们对于共享相同地址空间的其他线程是可见的。但是,它们必须保留供单个线程用作堆栈(至少可以说,共享单个堆栈的多个线程不会很好地工作)。
看Linux 上的线程是作为进程实现的吗?了解更多背景和历史。