分页的地址转换会降低内存访问性能吗?

Does the address translation of paging decrease memory access performance?

启用分页后,一些硬件负责将虚拟内存地址转换为物理地址。已知的翻译通常保存在某种缓存中,即翻译查找缓冲区 (TLB)。

假设地址转换被缓存的内存访问,它是否比直接访问没有启用分页的内存慢?

我想知道该翻译的开销,即使它被缓存了,因为访问该缓存可能也需要一些(虽然很短)时间。或者该时间是否计划为时钟周期的一部分?

(说明一下,我的问题不是关于 TLB 的页面错误或缓存未命中)

就像生活中的一切一样,这取决于! :-)

为了简单起见,我们假设 (a) 我们谈论的是数据而不是指令 (b) 所有数据内存访问都命中 1 级缓存 (c) 1 级数据缓存是典型的设置关联缓存。

数据缓存的每个块都必须用一个地址(减去偏移量)来标识。如果缓存使用虚拟地址,则不需要进行转换,也没有开销。如果缓存使用物理地址,则必须在数据访问之前转换地址,从而增加请求的延迟。即使对于小型 TLB,我认为高性能处理器也不可能在同一周期内既转换地址又完成缓存请求。所以可以公平地假设物理寻址的缓存确实有地址转换的开销。

所以虚拟寻址缓存听起来更划算,对吧?不幸的是,这是一把双刃剑。问题在于虚拟内存通常允许多个虚拟地址映射到同一个物理地址。如果在我们的缓存中有两个映射到单个物理地址的虚拟地址,修改一个不会反映到另一个。

所以,在这两个极端之间有一个选择。仍然假设一组关联缓存,我们可以使用虚拟地址作为索引,同时将地址转换为物理地址。之后,我们使用物理地址作为标签来访问数据。通过这种方式,我们将 TLB 转换从关键路径上移开,从而实现与虚拟寻址缓存相似的性能。它还允许我们避免这种 virtual/physical 别名问题,尽管它通常需要操作系统的一些额外帮助。

因此,您可以看到它可能相同或更慢,具体取决于缓存的配置方式。