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