线程在内存中实现的地方?

时间:2013-06-20 17:23:19

标签: linux multithreading

我们知道thread有自己的堆栈,它在流程中实现。但我的问题是,当thread在他自己的堆栈中实现时,它与进程或任何其他函数使用的堆栈相同?

再次怀疑thread是否共享它的全局变量,文件描述符,信号处理程序等。但它如何在所有线程执行的同一地址内共享所有这些参数?

简要说明将不胜感激。

1 个答案:

答案 0 :(得分:1)

  

当线程在他自己的堆栈中实现时,它与进程或其他任何一个堆栈使用的堆栈相同?

不能完全解析这个问题,但我认为这是我的要点。

在大多数情况下,在多线程应用程序的Linux下,所有线程共享相同的地址空间。如果每个线程在单独的处理器上运行,则它可能具有本地缓存​​的内存,但整个地址空间由所有线程共享。甚至每个线程的堆栈空间也被所有线程共享 - 只是每个线程获得一个不同的连续内存区域。

  

但它如何在同一地址内共享所有这些参数?

全局变量,文件描述符等也是如此。它们都是共享的。

在Linux下运行的大多数线程实现使用clone(2)系统调用来创建新的线程进程。引用clone man page

  

clone()以类似于fork(2)的方式创建一个新进程。它实际上是一个在底层clone()系统调用之上分层的库函数,以下称为sys_clone。 sys_clone的描述在本页末尾给出。

     

与fork(2)不同,这些调用允许子进程与调用进程共享其执行上下文的一部分,例如内存空间,文件描述符表和信号处理程序表。

您可以在Linux下使用ps -eLf来查看克隆的进程。