多核 CPU 如何工作?

多核 CPU 如何工作?

我知道,问题标题很模糊,但我的主要问题是,1 个核心是否必须一次只执行一个程序?CPU 级别的“多任务处理”是否通过在任务之间切换来实现,如果是,为什么?为什么 CPU 不能同时处理多个任务?它们有数十亿个晶体管,为什么有些晶体管不能处理一个问题而其他晶体管处理另一个问题?这是硬件限制,还是仅仅是操作系统限制?

答案1

晶体管无法“解决问题”。它是 CPU 的基本构建块,本身毫无用处,但需要构建逻辑门(然后可以计算简单的操作,如加法等)。单个核心中有很多硬件,而不仅仅是一个晶体管。

CPU 的功能远不止“做事”。它还有虚拟内存管理器、硬件缓存管理器、连接 CPU 和主板以及系统内存的各种接口等等。多核 CPU 通常会共享实际 CPU 内部的大量硬件。

“程序”是一个软件概念 - CPU 不知道它是什么。CPU 所做的只是执行操作系统发送的操作。从这个意义上讲,单核 CPU 一次只能执行一个逻辑操作。但即使在单核处理器上,您仍然可以同时执行多个任务,因为操作系统会以非常快的速度切换当前正在运行的程序。多核 CPU 允许您同时运行多个任务,操作系统可以利用这一点,让您轻松地同时运行更多程序,或者让一个程序利用多个内核来更快地运行。

从技术上讲,“程序”是一个分为一个或多个线程的进程,每个线程在执行时都是独立进行的,它们都有自己的堆栈、CPU 上下文(寄存器等)和其他内容,但显然它们仍然可以在进程内相互通信。

答案2

CPU 遵循的经典周期是:

获取指令 -> 解码 -> 执行

原因是,人们过去想要用计算机解决的大多数问题都涉及遵循一系列步骤,一次一个,按顺序进行,其中一些步骤的结果可能会影响后续步骤。对于这样的问题,使用多个“工作者”从中间跳来跳去并解决它并不是很有效。所以这个模型很好地服务于这些类型的程序,这些程序实际上仍然非常常见。(也就是说,直到 3D 图形渲染变得普遍......)

当然,上述模型多年来一直在优化和修改。随着时间的推移,确保更少的 CPU 空闲的工作也取得了进展。甚至早在 68000 时代,您就有了“流水线”,其中多个指令实际上在 CPU 的各个部分“飞行中”(这就是开发分支预测的原因,因为如果您有多个流水线指令,然后因为分支而不得不丢弃结果,那么您会损失性能)。今天,您还有其他可以防止 CPU 停顿或等待某些事情的东西,例如:

  • 缓存(防止 CPU 有时不得不等待慢速内存)
  • 无序执行(将获取的指令重新排列为更高效执行的顺序)
  • 寄存器重命名(通过在其他指令完成其工作时为指令提供自己的寄存器副本,使无序执行更好地工作)

因此,每个处理器或核心都包含多个子系统,它们共同协作来解释和执行指令流。从某种意义上说,现代 CPU 的某些部分确实在处理某件事,而其他部分则同时在处理其他事。

但是,虽然使用上述技术可以使它们非常高效,最终它们都在同一个指令流上协同工作。因此它们不能完全独立。如果你想同时执行两个指令流,你需要两个 CPU 或核心。

现代多任务操作系统在内存中存储的各种指令流(即程序)之间来回切换。操作系统所做的是,当程序占用过多的时间片时将其切断(大多数为多任务环境设计的 CPU 都有一个计时器,会在一定间隔后引发 IRQ,或类似的机制),或者当进程正在等待某种类型的 I/O 或输入时切换到另一个任务。它永远不会在单个 CPU 上同时执行两个指令。

我认为你谈论的类似想法已经在 Itanium 上尝试过了,而且超长指令字架构。阅读那篇维基百科文章,它比我在这里尝试解释的更好、更深入。

答案3

实际上,“切换任务”部分由操作系统执行。处理器是一个相对“愚蠢”的硬件,只会“处理数字”。从技术角度来看,处理器无法处理多个任务,因为所有任务都是假设它们在执行时可以完全控制处理器而编写的。这在一定程度上是由于需要向后兼容而遗留的。

使用多核处理器会有多个可用的“完整处理器”,因此多个程序可以同时拥有“完整处理器”可用,从而可以同时执行。

答案4

操作系统只能同时在一个核心上运行一个进程的一个线程,但是一旦您知道一个进程在操作系统中被分成多个线程然后才能在核心上运行,并且任何现代操作系统通常都运行大约 100 个或更多的进程,您将能够想象切换发生的速度有多快,如果核心的主频为 1 GHz,它将每秒刷新约十亿次以释放“空间”供即将到来的线程执行。

最近,在英特尔处理器中,您可能听说过他们的多线程技术,该技术使一个核心能够同时运行两个线程,理论上使核心性能翻倍。

相关内容