今天来着重学习了Cache的映射机制和替换算法,在这简单总结一下。
Part 1: cache映射机制
cache的映像机制:是指在CPU发出访问主存指令后,存储器地址先被送到cache,若命中则直接对cache进行访问。
下面阐述cache映射机制的三种类型。
[if !supportLists]一、[endif]直接映射:是以随机存取存储器作为cache存储器,电路简单,主存地址呗分为三个部分(从高到低):区号、页号、页内地址。根据该三个区域与cache进行直接映射。从下面的例子看可能更加直观:
内存容量为1GB,cache的容量为8MB,页面大小为512KB,求区号和页号位数。
①求区号:区号=内存容量/cache地址 = 128个,即7位
②求页号:页号=cache容量/页面大小 = 16页,即4位
直接映射存在缺点:地址块之间冲突绿很高,因为,主存内第n页即在cache的第n标记块中。进一步会导致cache存储空间利用不足。
[if !supportLists]二、[endif]全项链映像:主存中每一页可以映像cache中任意一页。其中主存地址划分为两部分,地址部分和数据部分。顾名思义,地址部分存放存储器地址;数据部分存储数据。其特点:cache的标记为=主存地址位,则存放相同主存中的内容,cache所需要的空间更大,导致cache的成本更高。
cache命中方式:将主存标记与cache标记逐个对比,直到命中。可见缺点:cache对比
速度慢,电路设计困难,只适合用于小容量的cache。
[if !supportLists]三、[endif]组相联映像:介于直接映像和全相联映像之间。全相联映像方式以页为单位,可以自由映像,没有固定的对应关系;直接映像方式中,主存分组,主存组内各页与cache的页之间采取的是固定的映射关系;然而在组相联映像中,主存与cache都分组,主存中一个组内的页数与cache相同。
其规则:主存中组与cache中组成直接映像关系,单每个组内的页是全相联映像关系、
下面采用例子进行阐释。一主存分为128个区,每个区8个组,每个组2个页。组相连
映像方式的主存地址。
Part2: 替换算法
cache存在未命中的时候,如果cache未命中,则需要将内容与内存中进行替换,这边是替换算法。目的是为了淘汰cache中某些旧数据,替换上新的需要使用的数据。
常用的替换算法有三种:随机算法、先进先出法、最近最少使用法。
[if !supportLists]一、[endif]随机算法:这是最简单的替换算法,不管内容进入到cache采用了什么方式,新的数据如果想要进入到cache当中则随机淘汰一页。
[if !supportLists]二、[endif]先进先出算法(FIFO),按照调入cache的时间先后顺序进行淘汰。如果新数据想要进入cache,则将里当前时间最久远的数据页替换掉,这一定程度上满足程序的时间局部性原理。
[if !supportLists]三、[endif]最近最少使用算法(LRU),LRU算法是吧CPU最近最少使用的数据块作为被替换的快,这样就要使用到一个计数器或者一个时间记录位,记录数据最近访问的最新时间,作为被替换的标准。这样最大程度满足了程序的时间局部性原理。
[if !supportLists]一、[endif]
Part3:写操作
cache中的数据需要保证与内存中一致,所以离不开写缓存。写cache常用到一下三种方法:写直达、写回、标记法。
[if !supportLists]二、[endif]写直达(write through),当要写cache的时候,数据同时写回内存。这样如果新的数据想要进入cache的话,可以直接覆盖,无需再次写回内存。
[if !supportLists]三、[endif]写回(write back),CPU修改Cache的某一块,数据不立刻写回缓存,而是从当前cache中淘汰,淘汰后块中数据写回缓存。这种策略经常需要标记单元是否修改,用于判断是否需要更新内存中页内数据。
[if !supportLists]四、[endif]标记法,对cache中每一个数据设置一个有效位,数据进入cache后,有效则标记为1,更新后则标记为0。用1和0区分访问cache和内存。1访问cache,0访问内存。这样有效的共同使用起来了cache与内存,但是存在读脏情况,需要定期更新。