dig*_*y91 6 stack multithreading operating-system
关于线程是否获得自己的堆栈,有各种各样的问题.但是,我无法理解操作系统如何实现或操作系统通常如何为每个线程实现一个堆栈.在OS书籍中,程序的内存布局如下所示:
请注意,它可以被视为连续的内存块(虚拟内存).我想象虚拟内存空间的某些部分在线程的堆栈之间划分.这让我想到了这个问题的第二部分:一个流行的技术面试问题涉及尝试使用单个数组实现3个堆栈.这个问题是否与解决线程堆栈的实现直接相关.
我总结了我的问题:
PS:也许用于解释内存如何划分为不同线程堆栈的图像最好解释一下.
上面显示的图片在 Windows 和 Linux 上都完全过时了。各个分配位于哪个地址并不重要。虚拟地址空间在 32 位上很大,在 64 位上很大。操作系统只需要在某处挖出一部分并将其分发出去。
每个堆栈都是一个独立的虚拟内存分配,可以放置在任意位置。需要注意的是,堆栈的大小通常是有限的。操作系统保留了一定的最大大小(例如 1MB 或 8MB)。堆栈不能超过该大小。这在上面的(过时的)图片中有不同的建议。堆栈确实向下增长,但是当固定空间耗尽时,会触发堆栈溢出。这在实践中不是问题。事实上,超过合理的堆栈大小被认为是一个错误。
二进制图像(上图:文本、初始化数据和 bss)也可以放在任何地方。它们的大小也是固定的。
所述堆由多个片段组成。它可以通过添加更多段来任意增长。堆由用户模式库管理。内核不知道它。内核所做的就是在随意选择的位置提供虚拟内存块。