cache与MMU与总线仲裁

时间:2023-01-06 20:07:14

为了以合理的价格,设计容量和速度满足计算机系统的需求,计算机体系结构设计者设计出了存储器的层次结构。

“Cache-主存”和“主存—辅存”是最常见的两种层次结构。

常见的集中cache hierarchy的size与access time:

cache与MMU与总线仲裁

计算机运行的任何时刻都存在多个进程,每个进程都有自己的地址空间。如果为每个进程分配全部的地址空间,那系统的开销太大,而且很多进程也只是使用该地址空间内的一小部分。

虚拟存储器一种存储器共享技术,把物理内存的一部分拿出来让很多进程共享。且有一套保护机制,保证一个进程只能访问自己的内存块。虚拟存储技术也可以减少程序启动时间,

因为程序启动前没必要将所有代码和数据都加载入内存。

虚拟存储器的特点:

1)       多个进程共享主存空间,主存空间以页/段为单位,分配给个进程。

2)       自动的对存储系统进行管理,减轻了程序员负担。(不用担心空间越界的问题)。

3)       动态加载,程序可以在需要的时候方便的载入主存的任何一个位置。

分段,以程序的逻辑意义进行划分,分为代码段,数据段,堆栈段等。

分页,以虚拟存储器的空间来进行划分,4k~64k

MMU完成虚拟内存地址到物理地址的转换,虚拟存储器的必要部件。

在多处理器,为了支持多用户多任务的操作系统,必须支持虚拟存储器。

cache与MMU与总线仲裁

MMU的地址映射是分级操作的,每一级的表项都指向下一级页表的地址,最后一级上的每一行叫做地址变换条目,来完成映射。

cache与MMU与总线仲裁

每一行的地址变换条目中都包含一些控制位和访问权限等信息(如是否cache等信息),但是每次从几级页表中读取地址变换条目会有点慢,

所以存在一种快速变换列表(TLB),每次的地址映射先从TLB中查找变换条目,cache miss也会产生加载动作。

只有在访问存储器时,才会有地址映射的变换。在普通的CPU读写操作中,一般都是在cache中完成的。

MMU一般放在CPU和Cache旁边的,只在读写cache miss的情况下,才会启用MMU

Cache是按块进行管理的,Cache和主存被分割成大小相同的块,信息以块为单位调入Cache,CPU访问内存分为两部分,块地址和块内地址。

由于主存的容量远大于Cache的大小,所以说数据从主存到Cache存在一个映射问题。

1)       全相联映射(full associative),主存中的任何一块都可以放在Cache的任何一个位置。主存映射灵活但是CPU的检索会比较慢。

2)       直接映像(direct mapped),主存中的一个块只能放在Cache中的唯一的位置。主存的第i块,Cache的第j块,则j=I mod(M),M为Cache块数

3)       组相连映像(set associative),主存中的每一块都可以被放置到Cache中的唯一的一个组的任何位置。直接映像和全相连映像的折中。

Cache中有一个目录表,该表中包含的项数与Cache中的相同,每一项对应Cache中的一个块,记录了该主存块的高位部分(tag)。每一组中,主存块可以由其tag唯一的来确定。

Cache的更新情况:

1)       Read cache miss时,需要从主存中奖数据读出。

2)       CPU需要将数据写入Cache。其中的写策略有:write-through,不仅将数据写入Cache,同时写入主存中。

Write-back,只将数据写入Cache,在发生Cache替换的时候,才写入主存。

在读写都miss的情况下,还有read alloacted和write allocated策略。

Cache替换方法:

1)       随机法,不考虑程序局部性,效率较低。

2)       先进先出法,有点容易实现,但是反应不了程序局部性。

3)       最近最少使用方法(LRU),实现较困难,但是可以反映程序局部性。

在集中式的共享存储器体系结构中,每个处理器都有自己的高速缓存,所以cache中的数据,存在一致性问题。具体可以分为两个方面:

1)       高速缓存一致性(coherence),定义了读操作可以返回怎样的值。

2)       存储器一致性(consistency),定义了写入的数据,何时进行读操作。

解决cache一致性问题的方案:

基于总线监听(Bus Snooping)的MESI方案,对cache的访问以cache line为单位,一个cache line通常为32/64字节,MESI给每个cache line定义一个一致性状态:原理简单,易于实现,软件透明

[M]:Modified状态,表示该cache line中数据经过修改,是系统中唯一正确的数据,其他处理器cache全部失效,读操作直接由本处理器cache提供数据,

(同一数据在各个Cache中,只可能有一个Cache中的状态是[M])

[E]:  Exclusive状态,该cache line是系统中唯一与主存一致的数据,其他处理器cache全部失效,对数据的读操作,可以由主存/cache提供,写操作,状态从[E]改为[M]。

[S]:Shared状态,该处理器的cache与其他处理器的cache处于共享状态,可以直接cache read,但是写操作,应该是write-through,状态改为[E]。

[I]:处于该状态的Cache行无效,对处于[I]状态的数据进行读操作,会发生cache miss。

MESI状态除了受本地处理器存储操作的影响外,共享总线上的其他处理器的读写操作也会改变共享数据的性质,改变本地Cache的MESI状态。

本地处理器的读写操作对MESI状态的影响:

读命中时,Cache line的状态只能是[M],[E],[S]的,直接由cache提供数据。

读不命中时,数据不在cache或者cache line状态是[I],总之是要访问存储器,首先,查询Cache 目录表,某个Cache中处于[M]状态,则更新主存,再从主存中读取数据,

更新状态为[S],如果本身cache line状态是[I],更新状态为[S]。

写命中,处于[M],[E],[I]的Cache line,直接更新本地Cache,处于[S]状态的Cache line,修改主存,更新Cache line状态为[E]

写不命中,更新主存,Cache line各行不变。

其他处理器对MESI状态的影响:

当在其他Cache中发现,处于[M]状态的Cache line时,表示主存中的数据已经”失效”,监听模块将暂时占用总线将[M]中的Cache数据写入主存中,

此次的总线使用权不经过总线仲裁,回写完毕后,直接将总线使用权交给主模块。同时将监听模块的Cache line的专题改为[S]

如果监听命中了处于[E],[S]的Cache line,直接将更新该处理器的Cache line,并将状态改为[S]

如果主模块出现了写存储器操作,则监听模块将所有监听命中的Cache line改为[I]状态。

监听Cache协议存在一定的局限性,它只适用于由总线互联的多处理器系统,受总线带宽和Cache本身工作效率的影响,这种系统所接的处理器数目不能太多,一般在10个左右。

在互联网络型多处理器系统中,Cache一致性不是向所有的Cache广播,而是通过查找目录表,可以知道某共享数据块副本所在的所有的Cache,

直接向这些cache发出一致性命令,克服了对处理器数目过低的限制。

Tang实现方法:允许未经修改的数据存在多个Cache中,但是经过修改的数据块只能存在一个Cache中。Cache内的每一个Line都带有一个修改位。

各个Cache的全部修改位,集中记录在主存的一个集中式目录表中。

写命中时,如果该Cache line的修改位已经有效,则直接写入。否则修改集中目录表中记录,并作废其他Cache中的副本。

写不命中时,首先搜索集中式目录表,若另一Cache中有修改过的Cache line,直接写入主存,再从主存中,write allocate。

若另一Cache中没有修改过的Cache line,副本全部作废后,由write through和write back来确定接下来是先写入Cache还是直接写入主存。

由cache coherence带来的主存的读写,与write through/write back这样策略独立。

两种解决cache coherence的方案:

1)处理器写数据项之前,保证该处理器的独占访问;

2)写入数据时,更新该数据的所有副本。

总线监听法和目录法都可以实现这两种策略。(这两种方法的本质区别不是很明白)

MMU与Cache和CPU之间的位置关系。

如果MMU在Cache和CPU之间,那每次的Cache操作都必须先经过虚实地址的转变;降低了cache的效率,Cache中存放物理tag

如果MMU在Cache和BUS之间,Cache中存放虚拟tag,在miss的情况下,需要到MMU进行addr transfer。

http://www.cnblogs.com/-9-8/p/5921052.html

由于virtual address与physical address不是一个对应的关系,所以:

在Cache中同时存放物理tag和虚拟tag,MMU放在旁路,Cache可以正常的读操作,写操作,以及总线的snooping操作,只有在

读写失效的情况下,启用MMU单元。这样解决了虚拟存储器和bus snnoping的问题。称为双TAG的数据CACHE