我想了解用户级线程堆栈的内存是如何保留在内存中的。我认为所有的堆栈都会从页面边界开始......我是对的?用户级线程库如何确保某个线程的堆栈不会增长并与另一个线程的连续页边界堆栈重叠,因为所有堆栈页面都是连续的...
答案 0 :(得分:0)
这些都是实施细节,因系统而异。你想要完成什么?
答案 1 :(得分:0)
如果你坚持连续的堆栈,那么是的,你可以在为不同的线程分配的堆栈之间发生冲突。这种情况更可能发生在虚拟空间小而非大虚拟空间的机器上,而且当某些堆栈变得任意大时,更有可能。
最常见的操作系统(Windows,Linux)假设线程堆栈不能很大(例如,1-10Mb),并且单个进程不能拥有大量线程(可能是数百个) 。在这种情况下,如果在计算状态之前知道需要多少线程以及每个堆栈可以获得多大的数量,那么实际上并没有问题。在这种情况下,您可以预先计算放置所有线程堆栈的位置,使它们都适合每个堆栈的最坏情况需求。
这很有效......非常好。但是,如果对堆栈的需求可能是任意大的,或者您不知道预先有多少堆栈,那么预分配不起作用。这确实会导致使用这些操作系统的人遇到麻烦。
有关此问题的讨论,请参阅Why are stack overflows still a problem?。你也可以阅读我对如何避免这个问题的回答。 (提示:没有有限大小的堆栈!)。