启用分页时,某些硬件负责将虚拟内存地址转换为物理地址。已知的翻译通常保存在某种缓存中,翻译旁观缓冲区(TLB)。
假设内存访问缓存了地址转换,是否比没有启用分页直接访问内存要慢?
我想知道该翻译的开销,即使它被缓存,因为访问该缓存可能也需要一些(虽然很短)的时间。或者这个时间是作为时钟周期的一部分计划的?
(为了说清楚,我的问题不是关于TLB的页面错误或缓存未命中)
答案 0 :(得分:2)
像生活中的一切一样,取决于它! : - )
为简单起见,我们假设(a)我们讨论的是数据而不是指令(b)所有数据存储器访问都达到了1级缓存(c)1级数据缓存是典型的集合关联高速缓存中。
必须使用地址(减去偏移量)来标识数据高速缓存的每个块。如果缓存使用虚拟地址,则不需要进行转换,也没有开销。如果缓存使用物理地址,则必须在数据访问之前转换地址,从而为请求添加额外的延迟。即使对于小型TLB,我也不认为高性能处理器既可以转换地址,又可以在同一周期内完成缓存请求。因此,假设物理地址缓存确实具有地址转换的开销是公平的。
所以实际上解决的缓存听起来更好,对吧?不幸的是,这是一把双刃剑。问题是虚拟内存通常允许多个虚拟地址映射到同一物理地址。如果在我们的缓存中有两个映射到单个物理地址的虚拟地址,则修改一个不会反映在另一个中。
所以,这两个极端之间有一个选择。仍假设一组关联缓存,我们可以使用虚拟地址作为索引,同时将地址转换为物理地址。之后,我们使用物理地址作为标记来访问数据。这样我们就可以从关键路径中取出TLB转换,从而实现与虚拟寻址缓存相似的性能。它还允许我们避免这种虚拟/物理混叠问题,尽管它通常需要操作系统的一些额外帮助。
因此,您可以看到它可以相同或更慢,具体取决于缓存的配置方式。