高速缓存控制器一次从主存到二级高速缓存获取多少字节?
Posted
技术标签:
【中文标题】高速缓存控制器一次从主存到二级高速缓存获取多少字节?【英文标题】:How many bytes the cache controller fetches a time from main memory to L2 cache? 【发布时间】:2012-04-07 06:00:05 【问题描述】:我刚刚阅读了两篇关于这个主题的文章,它们提供的信息不一致,所以我想知道哪一篇是正确的。也许两者都是正确的,但在什么情况下?
first 声明我们每次获取页面大小
缓存控制器始终观察正在加载的内存位置,并从刚刚读取的内存位置之后的几个内存位置加载数据。
举个真实的例子,如果 CPU 加载存储在地址 1000 中的数据,缓存控制器将从地址 1000 之后的“n”个地址加载数据。这个数字“n”称为页;如果给定的处理器正在处理 4 KB 页面(这是一个典型值),它将从正在加载的当前内存位置下方的 4,096 个地址(在我们的示例中为地址 1,000)加载数据。在下图中,我们说明了这个例子。
second 声明我们一次获取 sizeof(cache line) + sizeof(prefetcher)
所以我们可以总结一下内存缓存是如何工作的:
CPU 请求存储在地址“a”中的指令/数据。 由于地址“a”的内容不在内存缓存中,CPU 必须获取它 直接从 RAM 中。 高速缓存控制器将从地址“a”开始的一行(通常为 64 字节)加载到内存中 缓存。这比 CPU 请求的数据多,所以如果程序继续按顺序运行 (即要求地址 a+1)CPU 将要求的下一条指令/数据将已经加载到 内存缓存。 称为预取器的电路加载位于此行之后的更多数据,即开始加载内容 从地址 a+64 到缓存。给你一个真实的例子,奔腾 4 CPU 有一个 256 字节 预取器,因此它会在已加载到缓存中的行之后加载接下来的 256 个字节。
【问题讨论】:
不能是整页。当前的处理器在 32 位模式下最多可支持 4 MB 的页面,在 64 位模式下最多可支持 1 GB。 【参考方案1】:完全依赖于硬件实现。一些实现一次从主内存加载一条线——缓存线的大小在不同的处理器之间变化很大。我见过从 64 字节一直到 256 字节的行大小。基本上,“高速缓存行”的大小意味着当 CPU 从主 RAM 请求内存时,它会一次 n 个字节。因此,如果 n 是 64 字节,并且您在 0x1004 处加载一个 4 字节整数,则 MMU 实际上将通过总线发送 64 字节,所有地址从 0x1000 到 0x1040。整个数据块将作为一行存储在数据缓存中。
一些 MMU 可以在每个请求中通过总线获取多条缓存线——因此,在具有 64 字节缓存的机器上在地址 0x1000 发出请求实际上会加载从 0x1000 到 0x1100 的四条线。 Some systems 允许您使用特殊的缓存预取或 DMA 操作码显式执行此操作。
但是,通过您的第一个链接的文章是完全错误的。它混淆了操作系统memory page 和硬件cache line 的大小。这些是完全不同的概念。第一个是操作系统将立即分配的虚拟地址空间的最小大小。后者是 CPU 如何与主 RAM 对话的详细信息。
它们相似只是在操作系统的物理内存不足时,它会将一些最近未使用的虚拟内存分页到磁盘;稍后,当您再次使用该内存时,操作系统会将整个页面从磁盘加载回物理 RAM。这与 CPU 从 RAM 加载字节的方式类似(但不相关),这就是为什么《硬件秘密》的作者感到困惑的原因。
Ulrich Drepper 的论文What Every Programmer Should Know About Memory 是了解计算机内存以及缓存为何如此工作的好地方。
【讨论】:
+1 链接到 Drepper 的记忆文件。但是,页面大小肯定是一个硬件特性,操作系统不能为其选择任意值(例如,查找页表的工作方式)。 @janneb 这个答案似乎不适合讨论缓存提取、d-ERAT 页面大小、TLB 大小和软件 VMEM 表大小之间的区别。但长话短说,许多实现允许 TLB 中的可变页面大小。我的办公桌上有一台设备,它允许将内存分配为 4kb、64kb 或 4mb 页面。 当然不是,但就目前而言,通过阅读您的答案,您可能会错误地理解内存页面仅仅是操作系统实现细节,而实际上它与硬件如何进行虚拟化密切相关->物理地址查找。以上是关于高速缓存控制器一次从主存到二级高速缓存获取多少字节?的主要内容,如果未能解决你的问题,请参考以下文章