【发布时间】:2023-03-15 19:30:01
【问题描述】:
我的理解总结:
顶部内存地址用于?(我最初以为只有一个调用堆栈)堆栈,?堆栈向下增长(What and where are the stack and heap?)
但是,每个线程都分配了自己的堆栈,因此内存中应该有多个调用堆栈 (https://stackoverflow.com/a/80113/2415178)
应用程序可以共享线程(例如,关键应用程序正在使用主线程),但可以同时运行多个线程。
有一个名为 sp 的 CPU 寄存器跟踪堆栈指针,即调用堆栈的当前堆栈帧。
这就是我的困惑:
当应用程序启动时,是否分配了应用程序所需的所有调用堆栈(如果甚至可能知道)?或者调用堆栈是否会随着应用程序剥离新线程而动态分配/取消分配?如果是这种情况,(我知道堆栈具有固定大小),新堆栈是否只是在先前堆栈的正下方分配 - 所以你最终会在内存的顶部地址中获得堆栈堆栈?还是我只是从根本上误解了调用堆栈是如何创建/使用的?
我是一名 OS X 应用程序开发人员,因此我对如何创建调用堆栈的视觉参考来自 Xcode 的堆栈调试器:
现在我意识到,这里的情况很可能是 OS X 独有的,但我希望操作系统之间的约定是相似的。
似乎每个应用程序都可以在多个线程上执行代码,甚至可以衍生出属于该应用程序的新工作线程——每个线程都需要一个调用堆栈来跟踪堆栈帧。
这让我想到了最后一个问题:
如果有多个调用堆栈,sp 寄存器如何工作?它仅用于主调用堆栈吗? (大概是内存中最顶层的调用栈,与操作系统的主线程相关联)[https://stackoverflow.com/a/1213360/2415178]
【问题讨论】:
标签: multithreading macos memory memory-management stack