先决条件:
- 高速缓存存储器
- 记忆体存取
- 分页
- 过渡后备缓冲区
重新访问缓存访问
当CPU生成物理地址时,对主存储器的访问先于对缓存的访问。如此处所示,通过使用标签和索引/设置位在缓存中检查数据。从物理地址生成标记和索引位的这种高速缓存称为物理索引和物理标记(PIPT)高速缓存。发生高速缓存命中时,内存访问时间将大大减少。
Average Memory Access Time =
Hit Time + Miss Rate* Miss Penalty
在这里,命中时间=缓存命中时间=访问缓存中的内存位置所花费的时间
Penalty小姐=从主内存将高速缓存行加载到高速缓存所需的时间
失误率= 在很长一段时间内
在当今的系统中,CPU为进程生成逻辑地址(也称为虚拟地址)。使用PIPT高速缓存时,需要先将逻辑地址转换为其相应的物理地址,然后才能搜索PIPT高速缓存中的数据。从逻辑地址到物理地址的转换包括以下步骤:
- 检查转换后备缓冲区(TLB)中的逻辑地址,如果它在TLB中存在,请从TLB中获取页面的物理地址。
- 如果不存在,请从物理内存访问页表,然后使用页表获取物理地址。
所有这些时间增加了命中时间。因此,命中时间= TLB延迟+缓存延迟
PIPT缓存的局限性
- 这个过程是很连续的,因此命中时间很高。
- 对于内部级别的缓存而言并不理想。
- 任何系统都会频繁访问数据缓存,并且每次TLB对数据的访问都会大大降低系统的速度。
虚拟索引虚拟标记缓存
即时解决方案似乎是虚拟索引虚拟标记(VIVT)缓存。 VIVT缓存直接检查缓存中的数据并获取数据,而无需将其转换为物理地址,从而显着减少了命中时间。
在这样的高速缓存中,标签和索引将是CPU生成的逻辑/虚拟地址的一部分。现在,CPU直接生成的地址可用于获取数据,从而大大减少了命中时间。
仅当高速缓存中不存在数据时,才会检查TLB,最后在转换为物理地址后,会将数据带入VIVT高速缓存。因此,VIVT的命中时间=缓存命中时间。
VIVT缓存的局限性:
- TLB包含重要标志,例如脏位和无效位,因此即使使用VIVT缓存,也无论如何都要检查TLB。
- 上下文切换时有许多缓存未命中:由于缓存特定于逻辑地址,并且每个进程都有自己的逻辑地址空间,因此两个进程可以使用相同的地址,但引用不同的数据。
请记住,这是为每个进程都配备页表的相同原因。这意味着对于每个上下文切换,都需要刷新缓存,并且每个上下文切换之后都会有很多缓存未命中,这既耗时又增加了命中时间。
解决这些问题的方法是虚拟索引物理标记缓存(VIPT Cache)。本文的下一部分将介绍VIPT缓存,VIPT Cahe中的挑战以及一些解决方案
虚拟索引物理标记缓存(VIPT)
VIPT高速缓存使用物理地址中的标记位和索引作为逻辑/虚拟地址中的索引。使用虚拟地址搜索缓存,并获得物理地址的标记部分。用虚拟地址搜索TLB,并获得物理地址。最后,将从VIPT高速缓存获得的物理地址的标记部分与从TLB获得的物理地址的标记进行比较。如果它们相同,则为缓存命中,否则为缓存未命中。
由于TLB的大小小于缓存的大小,因此TLB的访问时间将小于缓存的访问时间。因此,命中时间=缓存命中时间。
VIPT缓存在命中期间与VIVT缓存占用相同的时间,并解决了VIVT缓存问题:
- 由于也可以并行访问TLB,因此可以同时检查标志。
- VIPT缓存使用一部分物理地址作为索引,并且由于系统中的每个内存访问都将对应一个唯一的物理地址,因此用于多个进程的数据可以存在于缓存中,因此无需为每个上下文切换刷新数据。
可以想到的问题是高速缓存命中但TLB未命中,这将需要对物理内存中的页表进行内存访问。这种情况很少发生,因为TLB仅将位(地址和标志)存储为条目(与缓存中整个块(几个字节)相比)需要的空间很小。因此,TLB中的条目数比缓存中的缓存块(即TLB中的条目)多得多缓存的标记目录中的条目。
虚拟索引物理标记缓存的优势
- 避免顺序访问,减少命中时间
- 在频繁访问高速缓存的数据高速缓存中很有用
- 避免上下文切换时发生高速缓存未命中
- 可以与高速缓存访问并行访问TLB标志
虚拟索引物理标记缓存的挑战
在VIPT高速缓存中进行虚拟索引会带来挑战。一个进程可以将两个虚拟地址映射到同一物理位置。这可以在Linux中使用mmap来完成:
mmap(virtual_addr_A,4096,file_descriptor,offset)
mmap(virtual_addr_B,4096,file_descriptor,offset)
上面两行将file_descriptor指向的文件映射到两个不同的虚拟地址,但具有相同的物理地址。由于这两个虚拟地址不同并且对缓存进行了虚拟索引,因此这两个位置都可能被索引到缓存中的不同位置。这将导致具有数据块的两个副本,并且在更新这些位置时,数据将不一致。此问题称为别名。别名也可能发生在两个进程共享的块中。
以下是解决问题的四种解决方案:
- 第一种解决方案要求在更新内存位置时使高速缓存中的任何其他数据副本无效。
- 第二种解决方案是在更新内存位置时更新缓存中的所有其他数据副本
请注意,第一种和第二种解决方案需要检查是否有任何其他位置映射到相同的物理内存位置。这需要将虚拟地址转换为物理地址。但是VIPT的目的是避免翻译,因为它会增加点击延迟。 - 第三种解决方案涉及减小缓存大小。请记住,在将虚拟地址转换为物理地址的过程中,虚拟地址的页面偏移量与物理地址的页面偏移量相同。这意味着两个虚拟地址也将具有相同的页面偏移量。为了确保两个虚拟地址映射到缓存中的同一索引,索引字段必须完全在页面偏移部分中。
演示别名的示例:
Consider a system with:
32 bit virtual address,
block size 16 Bytes and page size 4 KB
(i) Direct Mapped Cache: 64 KB
(ii) Direct Mapped Cache: 4 KB
(iii) Direct Mapped Cache: 2 KB
(i)在32位虚拟地址中,对于64KB直接映射的缓存,
第15到第4位用于索引,
位11到0是页面偏移量(这意味着对于指向同一PA的任意两个VA,12个LSB位将是相同的)。
两个虚拟地址可以是0x0045626E和FF21926E,它们映射到相同的物理地址。第一个地址将被索引为(626) H高速缓存行,第二个地址将被索引为(926) H 。这表明在系统使用64KB直接映射的高速缓存时会发生别名。还应注意,这两个寻址中的最后12位相同,因为它们已映射到相同的物理寻址,并且最后12位形成页面偏移量,这两个虚拟地址都将相同。
(ii)在32位虚拟地址中,对于4KB直接映射的高速缓存,位11至4用于索引,位11至0是页偏移(这意味着对于指向同一PA的任何两个VA,将有12个LSB位是相同的)。
两个地址可以是0x12345678和0xFEDCB678。请注意,这12个LSB位相同,即(678) H 。由于对于2KB直接映射的高速缓存,索引位完全是同一页面偏移量的一部分,因此两个虚拟地址将映射到的高速缓存的索引将相同。因此,一次只能保留一个副本,并且不会发生混叠。
(iii)以下是系统的2KB直接映射的高速缓存的表示,未显示任何混叠。因此,任何大小小于或等于4KB的直接映射的缓存都不会引起混叠。
4.别名的第三个解决方案要求缓存较小,较小的缓存将导致更多的缓存未命中。解决方案1
2和3是基于硬件的。称为页面颜色/缓存着色的另一种解决方案是软件解决方案
由操作系统实施以解决混叠而不限制高速缓存大小的情况。如果是64KB缓存16
需要使用颜色以确保不会发生混叠。此外,请阅读:ARMv6上的页面着色