我找到了这个链接:
我理解为什么线程有单独的堆栈,但我读到该进程可能有两个堆栈。为什么是这样?可能是因为我们计算了进程堆栈+线程堆栈吗?
那里有解释:
所以,如果你说,“一个进程可以有两个堆栈”是部分正确的。进程本身没有任何堆栈,但它的线程有- 与线程数一样多。
现代操作系统为每个用户级进程分配称为内核中断堆栈的东西。通过用户级进程,我指的是任何未在kernel-mode中运行的进程。这使得在处理处理器中断后更容易切换到另一个进程。假设您的处理器正在运行需要对内核进行系统调用的进程 x,然后发生了处理器中断,这使得处理器运行该中断的处理程序。在这个处理程序完成后,操作系统可以选择运行进程y而不是继续进程x。要支持这种类型的开关,您需要这个内核中断堆栈。我们保存在其中整个执行环境供以后使用。进程y完成后,x 可以继续进行系统调用而不会出现任何问题。请注意,如果您的用户级进程没有对内核级的任何系统调用,那么您将有一个空的内核中断堆栈。这可能是您正在谈论的第二个堆栈。 两个堆栈图
这被多次使用,不仅用于处理处理器中断。有时进程准备好并等待轮到它继续执行,然后我们将它的状态保存在它的内核中断堆栈中,当我们开始执行时,我们获取状态并将其放入寄存器中。此外,如果进程请求完成 I/O 操作,则该进程将暂停,直到 I/O 事件完成,之后,它继续以上述相同的过程执行。
由于内存限制,UNIX开始时所有进程的内核中断堆栈都很少,而不是每个进程的内核中断堆栈。然而,在内存变得更便宜之后,现在更容易为每个进程拥有内核堆栈。
有关它的更多信息,您可以查看“操作系统:原理与实践第 2 版”中的第 2 章内核抽象和第 4 章并发和线程