【问题标题】:Whats the difference between a process stack and a CPU stack?进程堆栈和 CPU 堆栈有什么区别?
【发布时间】:2016-01-19 06:18:48
【问题描述】:

我了解到每个进程在内存中都有自己的区域/块,由堆栈、堆、数据和文本(代码)组成(请参阅this)。

现在我正在阅读有关上下文切换的内容。我读到在上下文切换期间,CPU 寄存器被压入堆栈,然后完整的堆栈将被保存到进程控制块中。基本上是这样的吗?

如果每个进程都有自己的堆栈,为什么我需要保存堆栈?

【问题讨论】:

  • 添加架构。是 x86 吗?
  • 每个 CPL 都有自己的堆栈。阅读有关 TSS(任务状态段)的信息。
  • 是 x86,单核。也许你可以解释一下上下文切换。我读的文件清楚地说:寄存器被压入堆栈->堆栈保存在PCB中。我错过了什么?
  • 能否链接到该文档以便更好地向您解释?
  • 对不起。我不被允许。这是我正在学习的大学的财产

标签: linux-kernel x86 operating-system kernel context-switch


【解决方案1】:

完整的堆栈没有保存在上下文切换中。进程上下文块仅包含我所知道的每个系统上的寄存器值。

堆栈只是一块内存。它没有什么特别之处。唯一使它成为堆栈的是堆栈指针寄存器引用它。一个进程可以有多个堆栈。事实上,他们通常会这样做。进程通常对每个处理器模式都有一个堆栈。在多线程中,每个线程都有一个堆栈。

【讨论】:

    【解决方案2】:

    当发生上下文切换时,内核会引入一个新进程并“踢出”旧进程。但是,当一个旧进程轮到占用 CPU 时,必须恢复其先前的状态(它被“踢出”时的状态)以从它停止的点开始执行。
    所有架构都有有限数量的寄存器。寄存器还包含在要存储以供逐出的进程状态中。将寄存器保存在堆栈中是为了提高效率,因此您只需将值重新弹出即可。
    此外,每个进程都有自己的进程控制块 (PCB) 来将这些值存储在上下文切换中,这样调度算法就不会受到阻碍,并且可以在一些简单的进程 ID 上工作。当一个进程获得 CPU 时,附有该 ID 的 PCB 将被恢复。

    编辑 据我所知,x86 中没有 CPU 堆栈。 CPU 有堆栈指针指向堆栈的第一个元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-10
      • 2016-08-18
      • 2015-01-15
      • 2011-11-20
      • 2020-10-24
      • 2014-07-13
      • 1970-01-01
      • 2016-10-12
      相关资源
      最近更新 更多