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