我们知道thread
有自己的堆栈,它在该进程中实现。但我的问题是,当thread
在他自己的堆栈中实现时,它是由进程或任何其他函数使用的相同堆栈?线程在内存中执行?
还有一个疑问:thread
共享它的全局变量,文件描述符,信号处理程序等等。但是它如何在所有线程执行的地址内共享所有这些参数?
简要解释将被赞赏。
我们知道thread
有自己的堆栈,它在该进程中实现。但我的问题是,当thread
在他自己的堆栈中实现时,它是由进程或任何其他函数使用的相同堆栈?线程在内存中执行?
还有一个疑问:thread
共享它的全局变量,文件描述符,信号处理程序等等。但是它如何在所有线程执行的地址内共享所有这些参数?
简要解释将被赞赏。
当线程在他自己的堆栈中实现时,它是由进程或任何其他使用相同的堆栈?
不能完全解析这个,但我得到了我认为的要点。
在大多数情况下,在多线程应用程序的Linux下,所有线程共享相同的地址空间。每个线程(如果它在单独的处理器上运行)可能具有本地高速缓存内存,但总体地址空间由所有线程共享。即使每个线程的堆栈空间也被所有线程共享 - 只是每个线程都有不同的连续内存区域。
但是它如何在同一地址内共享所有这些参数?
全局变量,文件描述符等也是如此。它们都是共享的。
在Linux下运行的大多数线程实现都使用clone(2)系统调用来创建新的线程进程。从clone man page引用:
clone()以类似于fork(2)的方式创建一个新进程。它实际上是一个在底层clone()系统调用之上分层的库函数,以下简称为sys_clone。 sys_clone的描述在本页末尾给出。
与fork(2)不同,这些调用允许子进程与调用进程共享部分执行上下文,如内存空间,文件描述符表和信号处理程序表。
您可以在Linux下使用ps -eLf
来查看克隆进程。
你可以回答这个问题。现在很难解析。 – Gray