sli*_*ter 8 c memory caching operating-system
我只读了两篇关于这个主题的文章,它提供了不一致的信息,所以我想知道哪一个是正确的.也许两者都是正确的,但在什么情况下呢?
在第一个,我们取一个状态页面大小时间
高速缓存控制器始终观察正在加载的存储器位置,并在刚刚读取的存储器位置之后从几个存储器位置加载数据.
为了给你一个真实的例子,如果CPU加载的数据存储在地址1,000中,缓存控制器将从地址1,000之后的"n"地址加载数据.这个数字"n"叫做页面; 如果给定的处理器使用4 KB页面(这是一个典型值),它将从正在加载的当前内存位置以下的4,096个地址加载数据(在我们的示例中为地址1,000).在下图中,我们举例说明了这个例子.

在第二个状态之一,我们获取的sizeof(高速缓存行)+的sizeof(预取)时间
因此,我们可以总结内存缓存的工作原理:
- CPU请求存储在地址"a"中的指令/数据.
- 由于地址"a"的内容不在内存缓存中,因此CPU必须直接从RAM中获取它.
- 高速缓存控制器从地址"a"开始将一行(通常为64字节)加载到存储器高速缓存中.这是比CPU请求的数据更多的数据,因此如果程序继续按顺序运行(即询问地址a + 1),CPU将要求的下一条指令/数据将已加载到内存高速缓存中.
- 一个名为prefetcher的电路加载位于该行之后的更多数据,即开始将地址a + 64中的内容加载到缓存中.为了给你一个真实的例子,Pentium 4 CPU有一个256字节的预取器,所以它在已经加载到缓存中的行之后加载接下来的256个字节.
完全依赖于硬件实现.一些实现一次从主存储器加载一行 - 并且不同处理器之间的高速缓存行大小变化很大.我已经看到行大小从64字节一直到256字节.基本上"缓存行"的大小意味着当CPU从主RAM请求内存时,它一次只执行n个字节.因此,如果n是64字节,并且您在0x1004处加载4字节整数,则MMU实际上将在总线上发送64字节,所有地址从0x1000到0x1040.整个数据块将作为一行存储在数据高速缓存中.
一些MMU可以在每个请求中跨总线获取多个高速缓存行 - 因此在具有64字节高速缓存的机器上在地址0x1000处发出请求实际上从0x1000到0x1100加载四行.某些系统允许您使用特殊缓存预取或DMA操作码显式执行此操作.
然而,通过您的第一个链接的文章是完全错误的.它将OS 内存页面的大小与硬件高速缓存行混淆.这些是完全不同的概念.第一个是操作系统将立即分配的虚拟地址空间的最小大小.后者是CPU如何与主RAM通信的细节.
它们彼此相似只是因为当操作系统在物理内存上运行不足时,它会将一些最近未使用过的虚拟内存写入磁盘; 然后,当您再次使用该内存时,操作系统会将整个页面从磁盘加载回物理RAM.这与CPU从RAM加载字节的方式类似(但不相关),这就是为什么"硬件秘密"的作者感到困惑的原因.
一个了解计算机内存以及为什么缓存按照他们的方式工作的好地方是Ulrich Drepper的论文,"每个程序员应该了解的关于内存的内容".