内存模型:激活记录

Memory Model: Activation records

刚看了一本书,说栈顶(内存中)的激活记录永远是执行点所在的地方。所以我的问题是,在并行执行期间什么激活记录在顶部?特别是对于同一个程序但是 运行 多个线程。

这本书呈现的是一种有点理想化和简化的观点。在具有协程的系统中,在任何给定时间 运行 的概念函数可能不是其堆栈帧位于堆栈顶部的函数。 (在实践中,这通常是通过将协程的所有激活记录融合到一个单独的激活记录中来实现的,这样人们就可以证明该陈述仍然是正确的。然而,本着这个问题的精神,洞察力来自于对细节的理解。)大量的系统堆也为闭包分配激活记录,在这种情况下,当前正在执行的函数的激活记录根本不在堆栈上。

正如上面的评论所提到的,典型的线程机制为每个线程实现了一个单独的堆栈,因此有多个最顶层的激活记录。在其他设计中 "stack" 的概念变得相当模糊。线程的主要复杂性是管理许多堆栈的存储引入了复杂性。通常有很多线程意味着堆栈应该很小,但这限制了线程可以进行的调用深度。

当一个执行线程进入操作系统内核或接受中断时,出于安全和正确性的原因,它通常会切换到另一个堆栈。