5

在实践中,许多操作系统被设计为每个线程有一个内核堆栈,或者每个 CPU 至少有一个内核堆栈。但是对于一个内核在每次进程陷阱时都被锁定的操作系统,似乎没有必要为每个 CPU 设置单独的内核堆栈。由于内核(具有自己的堆栈)仅允许单个 CPU 访问,因此 CPU 永远不应同时处于内核模式。CPU 总是被阻塞,直到前一个 CPU 离开并清理内核堆栈,即使在嵌套陷阱情况下也是如此。那么在这种操作系统中,在哪种情况下需要多个内核堆栈呢?谢谢。

4

2 回答 2

7

你是对的; 在这种情况下,只要您具有可靠的多核锁定功能,多个内核堆栈就不会有用。

我们通常有多个内核堆栈(即每个线程至少有一个内核堆栈)用于以下目的:

  • 当您希望您的内核是线程化的和可中断的时,例如在微内核架构中。
  • 当您想将线程从一个核心迁移到另一个核心时,例如在负载平衡时。将 CPU1 的内核堆栈复制到 CPU2 的内核堆栈会很麻烦。不用说它也会成为性能杀手,因为您为此目的冻结了两个内核。
  • 根据底层架构,拥有多个内核堆栈使 MMU 的事情变得更容易(AS 管理,...)。
于 2012-12-19T13:48:28.767 回答
1

实际上,许多操作系统不限制运行内核级代码的线程数。事实上,设置这个限制会严重限制内核的可扩展性。如果没有此限制,则需要多个内核堆栈。

此外,在实践中,操作系统可能允许当前在内核模式下执行的线程的抢占和迁移,这再次将内核堆栈绑定到线程而不是处理器。

如果您正在设计一个不具备这些特性的操作系统,而是将内核级执行限制为单个线程,那么只需要一个堆栈即可。

于 2012-12-19T16:36:27.443 回答