operating-system - 为什么我们需要为每个 CPU 单独的内核堆栈

标签 operating-system kernel smp

关闭。这个问题是off-topic .它目前不接受答案。












想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。

8年前关闭。




Improve this question




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

最佳答案

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

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

  • 当您希望内核具有线程化和可中断性时,例如在微内核架构中。
  • 当您想将线程从一个核心迁移到另一个核心时,例如在负载平衡时。将 CPU1 的内核堆栈复制到 CPU2 的内核堆栈会很麻烦。毋庸置疑,这也是一个性能杀手,因为您为此目的卡住了两个内核。
  • 根据底层架构,拥有多个内核堆栈使 MMU 事情变得更容易(AS 管理,...)。
  • 关于operating-system - 为什么我们需要为每个 CPU 单独的内核堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13953175/

    相关文章:

    c - 从实模式切换到保护模式后远跳

    c - 在 shell 中运行 cat 命令时文件描述符错误

    multicore - 多CPU、多核和超线程有什么区别?

    linux - SMP 系统中的 linux 内核是否保证将从网络按顺序到达的 UDP 数据包按顺序从套接字读取?

    linux - percpu 指针在 Linux 内核中是如何实现的?

    assembly - 为什么linux在entry_SYSCALL_64函数中从rcx寄存器读取ip寄存器?

    operating-system - while(1) 无限循环和递归函数有什么区别?

    linux - ip_append_data 中的一个问题

    linux - 减小 Linux 内核镜像的大小

    linux - 从磁盘读取单个扇区