线程堆栈分配
答
C没有指定内存来自何处。它依赖于OS和C运行时库。作为创建线程的系统调用的一部分,操作系统分配线程堆栈内存,或者创建线程的进程必须从应用程序堆提供内存以用作线程堆栈。
看看Linux clone系统调用的文档,看起来Linux似乎是后者;线程堆栈内存来自应用程序堆。
你为什么问?
答
一些系统已经构建支持线程。其他人没有。非支持系统的线程库将从堆中分配堆栈空间,并使用定时器实现线程切换。
内置支持线程的系统通常会通过在地址空间中创建新页面来创建堆栈。理想情况下,它会在堆栈的每一端放置一个警戒页面,检测超限或运行情况。
我问这个问题的原因是我对堆栈和堆有点困惑。通常人们会说,堆向上增长,堆栈向下增长,可能他们可以相互踩到。但是在多线程的情况下,如果堆栈来自堆栈,堆栈或堆栈仍然可以成长为另一个堆栈?提前致谢。 – user3645364
这也是系统相关的,但通常会有某种“警戒页”设置,如果线程堆栈溢出会引发异常。在64位系统上,理论上可以预先为每个线程堆栈分配大量(连续)虚拟地址空间,并根据需要由物理内存支持,但我不知道这是否通常完成。 –
感谢您的回答。我需要进一步提出这个问题来让我明白。对于多进程系统,系统有多少堆?每个进程都有自己的堆,或者所有进程共享一个全局堆? brk()或sbrk()如何用于多进程系统?非常感谢你提前。 – user3645364