【问题标题】:How does "the Stack" play into the execution of a thread?“堆栈”如何影响线程的执行?
【发布时间】:2018-09-23 07:12:38
【问题描述】:

我正在开发 Pintos。

这有点像用于学习构建操作系统的教育工具,并且我正在从事第二个项目,该项目旨在为用户程序构建支持。

所以,首要任务是设置堆栈!太好了。

问题是 - 自从上课开始以来,我一直对 The Stack 这些词感到不寒而栗 - 因为我永远无法完全理解 The Stack 是什么以及它如何影响程序或线程的执行。所以我知道这是在 RAM 中设置的内存区域,仅此而已。

我的问题如下:

  • 栈的作用是什么?
  • 关于程序计数器、寄存器和堆栈指针,“堆栈”如何影响 CPU 中线程的执行?
  • 东西是如何添加到堆栈中的,又是如何从堆栈中删除的?
  • 此外,即使您不了解 Pintos,在为操作系统中的用户程序构建支持时“设置堆栈”是什么意思?

【问题讨论】:

  • 这太宽泛了,与计算机结构更相关。与操作系统无关。
  • 什么意思?这与操作系统有关。堆栈是操作系统管理进程和内存的一个组成部分。

标签: multithreading operating-system stack cpu pintos


【解决方案1】:

堆栈只是内存。使内存成为堆栈的唯一原因是进程访问它后进先出。

栈的作用是什么?

计算机中栈的作用是支持函数调用。函数调用反映了堆栈的操作。调用函数会推送它。退出函数弹出。

关于程序计数器、寄存器和堆栈指针,“堆栈”如何影响 CPU 中线程的执行?

从 CPU 的角度来看,线程就是一个进程。操作系统通过让多个进程共享相同的地址空间来欺骗 CPU。这样进程就变成了一个线程。

程序计数器和堆栈指针是寄存器。在大多数处理器上,都有操作堆栈指针寄存器的指令。例如,函数调用指令将通过递减堆栈指针并将程序计数器存储在堆栈指针所引用的新位置,将程序计数器压入堆栈。

事物是如何添加到堆栈中的,又是如何从堆栈中删除的?

Stack memory is allocated by decrementing the stack pointer. Something like:

   SUB   #32, SP

将在堆栈上分配 32 个字节并

  ADD  #32, SP

将释放该内存。堆栈的优点是分配内存非常快。

另外,如上所述,有些指令可能会操作堆栈。

此外,即使您不了解 Pintos,在操作系统中构建对用户程序的支持时,“设置堆栈”是什么意思?

要设置堆栈,您必须:

  1. 为堆栈分配内存。
  2. 您可能还希望分配在堆栈的任一侧受保护的保护内存以检测上溢和下溢。
  3. 您指定将栈顶地址移动到状态指针寄存器中。

正如我之前所说,堆栈就是内存。程序可以轻松分配自己的内存并将其地址移动到堆栈指针中以创建新堆栈。

【讨论】:

  • 堆栈不支持函数调用。这只是一个约定。 OP 不明白为什么程序运行需要内存,这需要阅读不问 SO 的书。
  • 这是一个很好的答案,但我还有几个问题。 (附带说明,我不确定前面的评论来自哪里,我知道为什么程序需要内存......)那么堆栈是否只需要处理函数调用?我的印象是它与 CPU 中指令的实际加载有关。我想我要问的是,我知道它处理函数调用,但程序中究竟是什么被严格保存在堆栈中?在进程的生命周期中,最肯定会被压入堆栈的东西是什么?
  • 堆栈还用于处理中断。当你调用一个函数时,PC 值被压入堆栈,所以当你返回时,它会被弹回到 PC 中,以便你在函数调用后恢复。堆栈还用于许多编程语言实现中的局部变量。
猜你喜欢
  • 1970-01-01
  • 2020-08-06
  • 1970-01-01
  • 2018-09-29
  • 2021-05-02
  • 1970-01-01
  • 2021-03-29
  • 2020-04-08
  • 1970-01-01
相关资源
最近更新 更多