2

我找到了这个链接:

关于线程和进程堆栈的一个快速问题

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

4

2 回答 2

4

那里有解释:

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

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

于 2013-02-05T13:34:44.440 回答
0

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

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

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

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

于 2020-11-20T01:13:23.613 回答