操作系统如何为每个线程实现或维护堆栈?

时间:2014-08-13 17:45:34

标签: multithreading operating-system stack

关于线程是否获得自己的堆栈,有各种各样的问题。但是,我无法理解操作系统如何实现或操作系统通常如何为每个线程实现一个堆栈。在OS书籍中,程序的内存布局如下所示:

Memory Layout

请注意,它可以被视为连续的内存块(虚拟内存)。我想象虚拟内存空间的某些部分在线程的堆栈之间划分。这让我想到了这个问题的第二部分:一个流行的技术面试问题涉及尝试使用单个数组实现3个堆栈。这个问题是否与解决线程堆栈的实现直接相关。

我总结了我的问题:

  1. 现代操作系统如何说,Linux为不同线程的堆栈划分内存空间?
  2. “使用1个数组的3个堆栈”是否与上述问题直接相关或答案?
  3. PS:也许用于解释如何为不同的线程堆栈划分内存的图像最好解释一下。

2 个答案:

答案 0 :(得分:4)

上面显示的图片在Windows和Linux上完全过时。单个分配所在的地址并不重要。虚拟地址空间在32位上很大,在64位上很大。操作系统只需要在某处中分割出 的一些块并将其移出。

每个堆栈都是一个独立的虚拟内存分配,可以放在任意位置。值得注意的是,堆栈通常大小有限。操作系统保留一定的最大大小(例如1MB或8MB)。堆栈不能超过该大小。这在上面的(过时的)图片中有不同的建议。堆栈确实增长了,但是当固定空间耗尽时,会触发堆栈溢出。这在实践中不是问题。事实上,超过合理的堆栈大小被认为是一个错误。

二进制图像(上图:文本,初始化数据和bss)也放在任何地方。它们的大小也是固定的。

由多个细分组成。它可以通过添加更多段来任意增长。堆由用户模式库管理。内核不知道它。所有内核都会在随意选择的位置提供虚拟内存块。

答案 1 :(得分:2)

1)线程的堆栈只是虚拟内存中的一个连续块。它的最大尺寸是固定的。它可能看起来像这样:

2)我不认为它与此问题直接相关,因为线程的堆栈大小限制在创建线程时是已知的,但是对于3个堆栈的大小中的每一个都不知道关于" 3堆栈的问题使用1个数组"。