【问题标题】:Why do we need separate kernel stack for each CPU [closed]为什么我们需要为每个 CPU 提供单独的内核堆栈 [关闭]
【发布时间】:2012-12-06 20:26:40
【问题描述】:
实际上,许多操作系统设计为每个线程有一个内核堆栈,或者每个 CPU 至少有一个内核堆栈。但是对于一个内核在每次进程陷阱时都被锁定的操作系统,似乎没有必要为每个 CPU 设置单独的内核堆栈。由于内核(具有自己的堆栈)仅允许单个 CPU 访问,因此 CPU 永远不应同时处于内核模式。 CPU 总是被阻塞,直到前一个 CPU 离开并清理内核堆栈,即使在嵌套陷阱情况下也是如此。那么在这种操作系统中,在哪种情况下需要多个内核堆栈呢?谢谢。
【问题讨论】:
标签:
operating-system
kernel
smp
【解决方案1】:
你是对的;在这种情况下,只要您拥有可靠的多核锁定功能,多个内核堆栈就没有用处。
我们通常有多个内核堆栈(即每个线程至少一个内核堆栈)用于以下目的:
- 当您希望内核具有线程化和可中断性时,例如在微内核架构中。
- 当您想将线程从一个内核迁移到另一个内核时,例如在负载平衡时。将 CPU1 的内核堆栈复制到 CPU2 的内核堆栈会很麻烦。不用说,这也是一个性能杀手,因为您为此目的冻结了两个内核。
- 根据底层架构,拥有多个内核堆栈会使 MMU 的工作变得更容易(AS 管理,...)。
【解决方案2】:
实际上,许多操作系统不限制运行内核级代码的线程数。事实上,设置这个限制会严重限制内核的可扩展性。如果没有此限制,则需要多个内核堆栈。
此外,在实践中,操作系统可能允许抢占和迁移当前在内核模式下执行的线程,这再次将内核堆栈与线程而非处理器联系在一起。
如果您设计的操作系统不具备这些功能,而是将内核级执行限制为单个线程,那么只需要一个堆栈即可。