【问题标题】:more than one stack per process?每个进程不止一个堆栈?
【发布时间】:2013-01-20 10:36:47
【问题描述】:

我找到了这个链接:

one quick question about stack of thread and process

我理解为什么线程有单独的堆栈,但我读到进程可能有两个堆栈。为什么是这样?会不会是因为我们统计了进程栈+线程栈?

【问题讨论】:

  • 您从哪里了解到一个进程有两个堆栈?进程的堆栈数与线程数相同。
  • @joachim。它在我的一个课程中得到的一些教程材料中提到,但我不完全理解原因,是什么意思,所以我在看到另一个问题后在这里问。
  • @dexter Joachim 是对的:进程只是线程的容器,线程有一个堆栈。还是您指的是特定的特定案例、操作系统或架构?
  • 某些 CPU 可能以两种模式之一运行:用户模式和超级用户模式。 supervisor模式基本上只针对中断(软件或硬件),每种模式都有单独的堆栈。然而,它仍然是每个执行线程。更复杂的是,许多旧操作系统(以及许多现代嵌入式操作系统)没有“线程”只有进程。但在这些情况下,您可以将每个进程视为单个线程,这意味着每个线程仍有一个(或两个取决于 CPU)堆栈。
  • 对于这样一个奇怪的陈述,唯一可能的解释是它实际上意味着 heap 而不是堆栈。堆由进程而不是线程拥有。而且 Windows 程序确实通常至少有两个堆。

标签: multithreading process stack


【解决方案1】:

那里有解释:

  • 一个进程至少可以有一个线程,但也可以有更多
  • 一个线程只有一个堆栈

因此,如果您说“一个进程可以有两个堆栈”,则部分正确。 进程本身没有任何堆栈,但它的线程有 - 与线程数一样多。

【讨论】:

    【解决方案2】:

    现代操作系统为每个用户级进程分配一个称为内核中断堆栈的东西。用户级进程是指任何未在内核模式中运行的进程。这使得在处理处理器中断后更容易切换到另一个进程。假设您的处理器正在运行process x,需要对内核进行系统调用,然后发生处理器中断,这使得处理器运行该中断的处理程序。在这个处理程序完成后,操作系统可以选择运行进程 y 而不是继续进程 x。要支持这种类型的开关,您需要这个内核中断堆栈。我们在其中保存整个执行环境以备后用。进程y完成后,x可以继续进行系统调用而不会出现任何问题。请注意,如果您的用户级进程没有对内核级的任何系统调用,那么您将有一个空内核中断堆栈。这可能是您正在谈论的第二个堆栈。 Two Stacks Illustration

    这被多次使用,不仅用于处理处理器中断。有时进程已准备好并等待轮到它继续执行,然后我们将其状态保存在其内核中断堆栈中,当我们开始执行时,我们获取状态并将其放入寄存器中。此外,如果进程请求完成 I/O 操作,则该进程会暂停,直到 I/O 事件完成,之后,它会继续执行上述相同的过程。

    由于内存限制,UNIX 开始时所有进程的内核中断堆栈都很少,而不是每个进程的内核中断堆栈。然而,在内存变得更便宜之后,现在更容易为每个进程拥有内核堆栈。

    有关它的更多信息,您可以查看“操作系统:原理与实践第 2 版”中的第 2 章内核抽象和第 4 章并发和线程

    【讨论】:

      猜你喜欢
      • 2017-02-28
      • 2013-12-26
      • 1970-01-01
      • 2011-09-18
      • 2015-01-14
      • 1970-01-01
      • 2013-10-22
      • 1970-01-01
      • 2018-01-23
      相关资源
      最近更新 更多