本文节选自书籍《大话处理器:处理器基础知识读本》
PDF版本可以访问我的网盘通过网盘分享的文件:大话处理器:处理器基础知识读本.pdf 提取码: 1234
0 什么是 Cache
- 随处可见的Cache–技术来源于生活
使用电脑的人对 Cachc 并不会陌生,只要在 Windows 下搜索“Cache”,就会找到一大堆命名包括“Cache”的文件和文件夹,系统目录下有,浏览器目录下有,QQ目录下有,PPStream目录下有,迅雷看看目录下有……
维基百科对 Cache的定义是:它是一个部件,透明地存储了一些数据,当下次需要这些数据时,就能更快的访问到。以迅雷看看为例,在网络上看完一个节目后,节目就存储在本地硬盘上,当下次再看这个节目时,就真接访问硬盘上缓存的内容,而不是从网络上去取,这样获取节目的速度就加快了。“透明”的意思是,用户不需要关心这段数据存在哪。Cache 的思想,并不是计算机专有的,它来源于生活。我们在大学读书时,书都放在宿舍里,今天要上《高数》课,就把《高数》的课本放进书包,明天要上《C语言》,就把书包中的《高数》课本取出来,把《C语言》课本放进书包,这个包就是一个 Cache(缓存)。垃圾篓、旅行包等都可以叫Cache。
1 处理器的 Cache 结构
1.1 Cache 的层次–层次化管理
我们通常会有这样的生活习惯,将最常用的东西放在桌上,这样可以最方便地拿到,将次常用的东西放在抽屉里,也能较快地拿到,将不常用的东西放在箱子里,去箱子里拿东西需要耗一点时间。
这种思想也被用在了Cache中,现在的处理器,都采用多级的Cache 组织形式,来达到性能和功耗的最优。
- 单核处理器大都采用如下的 Cache 结构:
单核处理器通常包含两级Cache:L1Cache和L2 Cache,L表示 Level(级)。在 L1中,程序(Program)和数据(Data)使用各自的缓存(LIP和LID),而在L2中,程序和数据共用一套缓存。通常 L1空间为几十K,L2空间为几百K。
当内核需要访问程序或数据时,会先从L1中去取,如果L1中没有,则L1从L2中将数据导入,如果 L2中也没有,则L2从内存中将数据导入。
L1 通常和内核同频率,以保证速度,L2通常会降频使用,工作频率比内核低,这样能降低功耗。 - 多核处理器大都采用如下的 Cache 结构:
在多核处理器中,一般每个内核独享自己的L1和L2,所有的内核会共用一个大容量的 L3。
1.2 Cache的工作方式——命中与未命中
整个 Cache 空间被分成了N个line,每个line(Cache line)通常是32 byte、64 byte等,Cache line 是 Cache 和内存交换数据的最小单位,每个Cache line 最少会包含如下3部分:
- block中存储的是内存在Cache中缓存的数据
- tag中存储的是该Cacheline 对应的内存块的地址。
- valid 表示该Cache line中的数据是否有效。
下面描述了一个基本的Cache 工作方式,假设处理器只有一级Cache,当内核访问一个数据时,内核首先会在Cache中找,一开始自然找不到,于是就发生了Cachemiss(未命中),这时内存中的数据被导入到一个Cache line的block中,将地址写到相应的 tag 位置处,并将valid 标志置1。当下一次内核继续访问这个数据时,处理器根据地址在Cache中找到对应的 Cache line,发现 valid 标志为1并且tag 标志也匹配,就知道找到了数据,直接从 Cache 中取这个数据,这个过程叫 Cache hit。
- 当Cache 命中时,内核直接从Cache中取数据,时间通常为几个cycle
- 当 Cache 未命中时,数据需要从内存中导入,时间通常是几十、几百个cycle,极大地拖垮了处理器的性能。
1.3 Cache的映射方式–多对一的策略
由于内存的空间要远远大于Cache的空间,因此内存中的数据搬到Cache 中时,会存在一个多对一的映射。
- Full-associative Cache(全关联 Cache)
内存以字节为存储单位,不过由于内存和Cache交换数据的最小单位是一个Cacheline,因此姑且将内存也看成按照 line的方式存储。
在Full-associativeCache中,内存中的每个1ine能够被映射到Cache中的任意一个Cacheline,如下图: