我刚读了一本书,说堆栈顶部(内存中)的激活记录始终是执行点的位置。所以我的问题是,在并行执行期间,什么激活记录位于顶部?特别是对于相同的程序,但运行多个线程。
答案 0 :(得分:1)
这本书提出了一种有点理想化和简化的观点。在具有协程的系统中,在任何给定时间运行的概念函数可能不是其堆栈帧位于堆栈顶部的概念函数。 (实际上,这通常是通过将协同程序的所有激活记录融合到一个激活记录中来实现的,因此人们可以认为该陈述仍然是正确的。但是在这个问题的精神中,洞察力来自对细节的欣赏。)大量的系统堆也为闭包分配激活记录,在这种情况下,当前正在执行的函数的激活记录根本不在堆栈中。
正如上面的评论所提到的,典型的线程机制为每个线程实现一个单独的堆栈,因此有多个最顶层的激活记录。有其他设计,其中" stack"变得非常模糊。线程的主要复杂性是管理许多堆栈的存储引入了复杂性。通常有很多线程意味着堆栈应该很小,但这限制了线程可以进行的调用深度。
当执行线程进入操作内核或接受中断时,出于安全性和正确性原因,它经常切换到另一个堆栈。