在缓存和寄存器中运行程序

在缓存和寄存器中运行程序

在我的操作系统课上,我们看到了一张描绘内存层次结构的图,最昂贵、速度最快的在最上面,最便宜、速度最慢的在最下面。最上面是寄存器,下面是缓存。教授说,运行程序的最佳位置是缓存。我想知道为什么程序不能在寄存器中运行?另外,程序如何将自身加载到缓存中?缓存不是由 CPU 控制并自动运行而无需软件控制的东西吗?

答案1

这是一个非常复杂的问题,随着人们对其他人的回答的了解越来越多,预计会有一些答案。:)

教授说,运行程序的最佳位置是在缓存中。

请记住,缓存比普通 RAM 贵很多倍。当“大型”计算机为 8MB(不是千兆,是兆字节)时,您会发现所有机器都是“缓存”(从技术上讲,它是一种称为 SRAM 的特殊 RAM),但它们更贵。现在,您的家用机器有 4GB 内存,连接到芯片的 4GB SRAM 将非常昂贵。此外,您有许多聪明的人在玩程序和编译器,以充分利用缓存。使用正确的缓存算法,您可以获得 95% 的缓存收益,而成本仅为一小部分。当然,猜测并不总是正确的。谷歌“分支预测”了解更多信息。

我想知道为什么程序不能在寄存器中运行?

寄存器实际上是用来加载和存储数据和地址的。把它们想象成出租车。它们可以来回运送东西,它们运送的是你的程序数据和地址。你的程序中“运行”的每一部分都要经过寄存器。

我猜你问的是为什么不能完全从寄存器运行。原因之一是寄存器太少了。经典的英特尔 x86 寄存器以字节为单位,但程序以兆字节、千兆字节为单位。如果你有一个可以用寄存器运行 MS-Word 的芯片,那你就是个相当有钱的人了。

另外,程序如何将自身加载到缓存中?

程序则不然。操作系统运行程序,并使用内存管理单元芯片从普通 RAM 加载程序区域。在执行此操作时,MMU 很聪明,还会将部分内存放入缓存中,因为我刚刚使用了它,所以我可能很快需要再次使用它。

缓存不是由 CPU 控制并且不需要软件控制而自动运行的吗?

是的,从技术上讲,内存管理芯片不是 CPU。它曾经是一个单独的芯片,但现在是 CPU 模块的一部分,以加快通信速度。

答案2

您的程序现在正在轮流使用寄存器和缓存,可能在您的操作系统内核的指导下。

如果您希望程序做的只是反复取一个数字并对其加一,那么您可能可以在寄存器中完成所有这些操作。寄存器非常小,每个寄存器存储一个数字,常见的 x86 处理器有 16 个寄存器(8 个整数和 8 个浮点数)。

类似地,如果您有一个适合缓存的小程序(并且操作系统不需要间歇地将其交换出去以执行其他操作),则它将从缓存中运行。

如今,大多数软件程序都比缓存大得多。而且您要求计算机同时处理多项任务,例如更新时钟和保持驱动器索引,或绘制此网页。这意味着计算机每秒钟需要多次将下一个任务交换到缓存中,以便可以稍微处理一下(称为切换上下文)。

您可以阅读更多关于缓存寄存器

答案3

您的程序是从寄存器运行的!它们也从缓存运行。所有这些都有助于让您的计算机运行得更快。最大的限制因素是大小。CPU 寄存器非常有限。典型的 x86 机器只有 8 个 32 位寄存器,CPU 使用这些寄存器来存储正在处理的数据。如您所知,访问寄存器的速度非常快,但是由于大小有限,寄存器中只能存储很少的数据。

缓存也类似,其大小有限。CPU 首先检查较小的缓存(例如 L1)是否有数据,如果在该缓存中找不到数据,则检查后续缓存(L2、L3 等)。每一级缓存都会逐渐变大,访问速度也会变慢。如果检查完所有缓存后仍未找到数据,则 CPU 必须从 RAM 中提取数据。

软件应用程序通常无法明确控制放入寄存器或缓存中的内容,除非该应用程序是低级驱动程序或类似的应用程序。

答案4

我想知道为什么程序不能在寄存器中运行?

大多数指令集架构 (ISA) 不支持寄存器中的间接寻址。即,寄存器地址在指令中被编码为常量。(此限制大大简化了流水线操作。)

缓存还具有微架构特性的优势,即其大小和其他特性仅在性能方面对软件可见。这允许 ISA 的不同实现使用不同的大小等,而不会损失二进制兼容性,例如,针对不同的性能或应用程序目标,或根据制造技术的变化调整权衡平衡的变化。

此外,随着软件可见寄存器数量的增加,编译器管理的好处相对于编译器复杂性和编译时间的成本趋于降低,尤其是对于具有复杂控制流的程序。如果使用多级寄存器(如 Cray-1)来允许快速的小型寄存器组,则编译器寄存器分配的复杂性会增加。

此外,通用寄存器的大小通常由地址空间的大小设置,而缓存行(缓存的可比项目)的大小涉及标签开销、预期的引用空间局部性(较大的缓存行可以有效地预取附近的数据,但如果数据在缓存中时未使用,则会浪费带宽和存储空间)、带宽考虑(更长的内存突发更节省带宽 - 使较大的缓存行更具吸引力 - 并且缓存一致性流量受行大小影响)、错误共享(一个处理器写入另一个处理器将读取的位置附近的位置;大型缓存行会引入错误的通信依赖性)等的权衡。

另外,程序如何将自身加载到缓存中?缓存不是由 CPU 控制并自动运行而无需软件控制吗?

缓存由 CPU 控制,但软件可以明确地将项目预取到缓存中(并且 Itanium ISA 支持非临时的缓存级别 N 提示,以帮助硬件更好地管理缓存分配和替换)。普通内存访问会将请求的项目和自然对齐的缓存行内的项目加载到 L1 缓存中,并且该缓存行通常(例如,不包括一致性无效)将一直存在,直到 CPU 选择将其替换为另一个由另一个(可能是推测性的)内存访问或硬件预取请求的另一个缓存行数据;因此软件确实有一些管理缓存内容的能力。

软件还可以利用缓存系统的特定特性(缓存意识算法和数据结构)或大多数缓存系统共享的一般特性的知识(缓存无关算法) 来减少缓存未命中的频率(需要从内存或更接近内存的缓存级别中检索项目)。

相关内容