-1

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

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

简要说明将不胜感激。

4

1 回答 1

1

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

不能完全解析这个,但我明白了我认为的要点。

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

但是它是如何在同一个地址中共享所有这些参数的呢?

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

在 Linux 下运行的大多数线程实现都使用 clone(2) 系统调用来创建新的线程进程。引用克隆手册页

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

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

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

于 2013-06-20T17:30:44.107 回答