为什么我们需要为每个CPU分别使用内核堆栈

时间:2012-12-19 13:11:24

标签: operating-system kernel smp

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

2 个答案:

答案 0 :(得分:6)

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

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

  • 当您希望内核具有线程和可中断性时,就像在微内核架构中一样。
  • 当您想要将线程从一个核心迁移到另一个核心时,例如在进行负载平衡时。将CPU1的内核堆栈复制到CPU2的内核堆栈是很麻烦的。毋庸置疑,它也会成为性能杀手,因为你为此目的冻结了两个核心。
  • 根据底层架构,拥有多个内核堆栈可以使MMU更容易(AS管理,...)。

答案 1 :(得分:1)

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

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

如果您正在设计一个没有这些功能的操作系统,而是将内核级执行限制为单个线程,那么只需要一个堆栈。