缓存寻址方法混淆

 alxg 发布于 2023-02-08 08:37

我一直在阅读缓存可以解决的四种方式:

    物理索引物理标记(PIPT)

    物理索引虚拟标记(PIVT)

    虚拟索引物理标记(VIPT)

    虚拟索引虚拟标记(VIVT)

以下哪个缓存会受到同义词和同音词问题的影响?我知道VIVT会受到这些问题的困扰,PIPT也不会.但是PIVT和VIPT呢?

1 个回答
  • 由于在不同的虚拟地址映射到相同的物理地址(其中一个想要避免错误的错误)时发生同义词,因此在VIPT缓存中,同义词可以(虚拟地)索引到不同的缓存集(在这种情况下,数据不一致是可能的,例如通过在一个集合中写入同义词,然后在另一个集合中读取同义词[相同的物理地址,不同的虚拟地址],而在PIVT缓存中,同义词总是映射到同一个集合但是虚拟标记部分的差异地址可能导致未指示.

    (直接映射的PIVT缓存在未命中服务之前执行受害块的回写将避免同义词问题,因为访问的实际内存[物理地址]必然会强制驱逐任何同义词,因为物理地址索引将是同一个并且该索引只有一个块.直写映射PIVT高速缓存的行为相同,原因相同;最新的数据值将在后备存储[L2或内存]中.这假定任何写入物理标记缓冲区或L2缓存.如果在服务未命中之前未更新后备存储,则错误未命中[虚拟地址与标记不匹配但具有相同的物理地址]可以从后备存储读取过时数据.)

    (注意PIVT通常仅在虚拟索引与物理索引相同时才有意义,即,当使用页面偏移中的虚拟位时.如果已经足够早地知道完整的物理地址来索引缓存,则没有什么理由不要使用标签的物理地址.)

    只要同义词可以映射到缓存中的不同块,使用直写就不会删除同义词问题.如果任何索引位可能不同(使用虚拟索引)或提供了多种方式,则过时值可能会保留在该备用位置,而在使用不同的虚拟地址探测高速缓存时则无法找到该值.读取A,写入B,读取A(其中A和B是同义词)的序列可能使第二个读取A在第二个读取A是高速缓存命中时看不到写入B的结果.(即使使用直接映射的直写高速缓存,任何写入缓冲区都需要进行物理标记[物理索引不是问题,因为写入缓冲区相对较小].)

    虽然两个同义词同时出现在L1高速缓存中的概率与写入1然后读取另一个同义词的概率可能非常低,但仍然期望这样的情况将被正确处理.

    由于当同一个虚拟地址映射到不同的物理地址(其中一个想要避免错误命中)时会出现同音异义,因此在VIPT缓存中,同音异义词将映射到相同的缓存集,但标签会不同(因此没有错误的命中)而在PIVT缓存中,同音异义词可以映射到同一组(如果索引物理位碰巧匹配)并且在虚拟标记中会错误地匹配.

    总之,不太可能的PIVT设计受同义词和同音词问题的影响,而VIPT设计仅受同义词问题的影响.VIVT设计具有不切实际的PIVT和更多的所有问题(即使特殊的直接映射情况也不起作用,因为当用于索引的虚拟地址位不同时,同义词可以映射到不同的块).

    (对于多核/处理器,一致性通常由物理地址处理.虽然可以提供将物理地址转换为虚拟地址的TLB模拟[至少一个PA-RISC处理器可能已经完成此操作],但是翻译缓存会强制任何标记有该虚拟地址的缓存块被逐出类似于因耗尽ASID而导致的驱逐.)

    同义词和同音异义词的出现

    可写同义词通常可能不常见,但它们可能出现的一种方式是文件是由多个进程映射的内存.显然,如果一个进程已经映射(例如,对于堆内存)另一个进程用于映射文件的地址范围,则该一个进程不能将该文件映射到另一个进程正在使用的相同虚拟地址范围.

    只读同义词可能更常见.某些操作系统在整个系统中使用一个零填充页面,并将许多虚拟页面映射到同一个物理零页面(当程序尝试写入该页面时使用写入时的复制).如果每个进程应用地址空间布局随机化(安全功能),则不同的进程可能对代码/文本的相同物理页使用不同的虚拟地址.

    也许最常见的同音异义形式与多个地址空间有关.在常见的操作系统中,每个进程都有自己的地址空间(尽管操作系统通常为自己保留该地址空间的一部分,并在不同进程中为该部分使用相同的映射).通过将地址空间标识符附加到虚拟地址,可以减少这种类型的谐音.通过这种方式,只有当ASID被重用于特定的虚拟标记高速缓存时,才需要对这种同音异义词进行特殊处理.(ASID降低了特殊缓存管理的频率,以避免同音异义问题,但它们并不能解决一般问题.但是,即使降低频率也可以通过降低性能要求使软件变得更简单;高度优化的代码通常都更难生产,更难维护.)

    另一种形式的谐音是当页面被换出然后换回到不同地址的内存时.如果I/O是从内存完成的(不是某些处理器中的缓存),那么操作系统必须至少回写任何缓存内容,因此刷新适当的内容不是问题.虽然当操作系统认为它是驱逐到磁盘的良好候选者时,页面在缓存中具有某些内容的概率(尤其是使用虚拟地址的L1缓存因为延迟优势而最具吸引力)的可能性很低且任何此类内容的概率很低将保留在缓存中,直到页面交换回内存很低,即使这些不太可能的产品不是零.

    在任何情况下,即使硬件设计者不能认为对同义词和同音异义词有任何有用的用途,也可能不需要对这种情况进行特殊处理.

    对于单地址空间OS,同音异义词是不可能的,因为所有进程使用相同的虚拟地址到物理地址的映射,并且如果允许同义词,则它们用于只读存储器.在这些条件下,VIVT缓存可以在没有同音词和同义词问题的情况下使用.(SASOSes可以简化进程间通信.但是,类UNIX操作系统和其他一些操作系统是为多个地址空间设计的.)


    作为旁注,只读存储器的同义词不会引入正确性问题(仅可能从同一物理存储器的重复高速缓存中浪费来自错误和缓存容量的带宽).这使得VIVT对于指令缓存不那么缺乏吸引力.(x86在要求指令高速缓存是高速缓存一致方面有点不寻常,尽管提供连贯的指令高速缓存可以简化某些软件.)

    此外,VIPT缓存中的同义词问题可以通过使用初始虚拟索引作为路径预测的形式来处理(探测未命中的备用设置 - 这是由AMD Athlon的64 KiB,2路缓存和4 KiB页面完成的 - 或者使用物理索引的包含标签的L2缓存,其中包含用于索引L1的多余虚拟地址位,使先前缓存的L1虚拟索引处的块无效)或者通过要求任何同义词索引同一组缓存块(大多数简单地通过页面着色,其中相应的物理地址位与用于索引的虚拟地址位人为地相同.

    2023-02-08 08:46 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有