我的问题是,CPU 如何将数据写入 RAM?
据我所知,现代 CPU 使用不同级别的缓存来加速 RAM 访问。RAM 收到信息命令,然后向 CPU 发送一连串数据,CPU 将所需数据(以及一堆接近 CPU 所需地址的额外数据)存储到最高级别的缓存中,然后 CPU 逐渐要求不同的缓存将越来越小的数据块发送到缓存的下一级,直到它进入 1 级缓存,然后直接读入 CPU 寄存器。
当 CPU 写入内存时,这个过程是如何进行的?计算机是否会沿缓存级别向下移动(与读取相比,顺序相反)?如果是这样,那么如何将不同缓存中的信息与主内存同步?此外,写入操作的速度与读取操作相比如何?如果我不断写入 RAM,例如在存储桶排序的情况下,会发生什么?
提前致谢,
—假冒
编辑:我还没有得到一个可以完全接受的答案。我特别想知道 RAM 写入的同步部分。我知道我们直接从 CPU 写入 L1 缓存,并且当我们同步不同级别的缓存时,数据会被推到缓存级别,最终主 RAM 与最高级别的缓存同步。但是,我想知道的是缓存何时与主 RAM 同步和同步,以及它们相对于读取命令的速度有多快。
答案1
啊,这是一个简单但答案却很复杂的问题。简单的答案是,这取决于写入操作的方式以及缓存的类型。以下是关于缓存工作原理的入门知识。
CPU 可以以各种方式写入数据。如果没有任何缓存,数据将直接存储在内存中,CPU 等待写入完成。使用缓存时,CPU 通常按程序顺序存储数据,即,如果程序先写入地址 A,然后写入地址 B,则无论是否使用缓存,内存 A 都将先写入内存 B。缓存仅在更新物理内存时起作用,这取决于所使用的缓存类型(请参阅上面的链接)。某些 CPU 还可以非临时存储数据,即可以重新排序写入以充分利用内存带宽。因此,先写入 A,然后写入 B,然后写入(A+1)可以重新排序为一次性写入 A,然后写入 A+1,然后写入 B。
另一个复杂情况是当存在多个 CPU 时。根据系统的设计方式,一个 CPU 的写入不会被其他 CPU 看到,因为数据仍在第一个 CPU 的缓存中(缓存很脏)。在多 CPU 系统中,使每个 CPU 的缓存与物理内存中的内容相匹配被称为缓存一致性。有多种方法可以实现这一点。
当然,以上内容适用于 Pentium 处理器。其他处理器可以以其他方式执行操作。以 PS3 的 Cell 处理器为例。Cell CPU 的基本架构是一个 PowerPC 核心和多个 Cell 核心(PS3 上有八个单元,其中一个始终处于禁用状态以提高产量)。每个单元都有自己的本地内存,类似于 L1 缓存,永远不会写入系统 RAM。可以使用 DMA(直接内存访问)传输在此本地 RAM 和系统 RAM 之间传输数据。单元可以使用看似正常的读写操作访问系统 RAM 和其他单元的 RAM,但这只会触发 DMA 传输(因此速度很慢,确实应该避免)。该系统背后的想法是游戏不仅仅是一个程序,而是许多组合在一起做同样事情的小程序(如果您了解 *nix,那么它就像管道命令行程序一样,可以完成更复杂的任务)。
总而言之,在 CPU 速度与 RAM 速度匹配的时代,写入 RAM 曾经非常简单,但是随着 CPU 速度的提高和缓存的引入,该过程变得更加复杂,并且存在许多不同的方法。
斯基兹
答案2
是的,它会沿着缓存的级别向后移动并保存到内存中,但重要的一点是在多处理系统中,缓存在两个或更多处理器(核心)之间共享,并且数据必须一致,这是通过为所有多处理器或不同的缓存制作共享缓存来完成的,但通过使用关键部分来保存一致性(如果一个缓存中的数据发生变化,它会强制它写入内存并更新其他缓存)