所以我正在读这个问题:
https://stackoverflow.com/questions/1762418/what-resources-are-shared- Between-threads
并根据答案,“线程共享除堆栈之外的所有段,但一个线程仍然可以访问另一个线程的堆栈”?
但我还有三个问题:
进程的所有线程都工作在同一个虚拟内存空间中吗?
当我们说线程仍然可以访问其他线程的堆栈时,这是否意味着例如如果我们的堆栈从 0x00 到 0xff 开始,那么一个线程可能从 0x00 到 0x0f 工作,而另一个线程可能从 0x10 到 0xff 工作?或者 ..?
堆栈是虚拟内存中唯一对Linux中每个线程唯一的部分吗?
答案1
- 进程的所有线程都工作在同一个虚拟地址空间中吗?
是的。每个线程都有自己的堆栈,但与进程关联的所有内存都位于同一虚拟地址空间中。如果一个线程中的函数有一个指向另一个线程中堆栈分配变量的指针,则该函数可以读取/写入该变量。
- 当我们说线程仍然可以访问其他线程的堆栈时,这是否意味着例如如果我们的堆栈从 0x00 到 0xff 开始,那么一个线程可能从 0x00 到 0x0f 工作,而另一个线程可能从 0x10 到 0xff 工作?
就像我在回答你的第一个问题时所说的那样,每个线程都有自己的堆栈。抽象而言,这意味着一个线程的堆栈从 A 运行到 B,而另一个线程的堆栈从 C 运行到 D,其中 A < B < C < D(即 AB 范围与 CD 范围不重叠) 。
- 在 Linux 中,堆栈是虚拟内存中每个线程唯一的部分吗?
堆栈的唯一性与虚拟内存无关。堆栈(真正的“激活记录堆栈”)用于存储有关正在运行的函数(当前正在运行的函数和所有调用函数)的信息。如果有多个线程,则有多个函数(以及调用函数)。如果线程要共享激活记录交错的堆栈,则几乎不可能知道函数完成时要返回哪个调用函数。