CPU 缓存「Cache」指的访问速度比一般内存快得多的高速存储器,主要是为了解决 CPU 运算速率与内存读写速率不匹配的问题。因为 CPU 的运算速率比内存读写速率快得多,当 CPU 需要向内存请求数据或者写入数据时,就需要一直等待内存缓慢的读写。在这个过程中,CPU 的高速运算能力就无法得到充分发挥。
「所以缓存的作用就像是 CPU 和内存之间进行数据缓冲的桥梁。」宫本若有所思。
缓存中的数据是内存中的一部分,这一部分数据被认为是 CPU 在短时间内会即将访问到的数据。当 CPU 在调用数据时,会先从缓存中调用,而不直接通过内存。当在缓存中找到想要的数据时,就会立即读取并返回给 CPU 处理;如果没有找到,就以相对较慢的速度从内存中读取,同时将这个数据所在的数据块都调入缓存中,方便下次对该数据块的读取。
首先来讲讲计算机存储系统的层次结构。一般而言,通用计算机的存储层级分为四层,分别为 CPU 内部寄存器、高速缓存、主存储器和辅存储器。主存可以看作是一般而言的内存,而辅存又可根据是否与计算机相连分为联机和脱机两种类型。
从层次结构上可以看出,高速缓存处于第二层次,起到承上启下的作用。而为了能够与 CPU 进行高速交互,同时与主存进行数据的交换,高速缓存的结构也十分具有个人特色。高速缓存并不是一中概念上的缓存,而是由特定 SRAM 组成的物理芯片。在现代 CPU 中,大量的空间都已经被 SRAM 占据。下图是一张Intel CPU的放大图片,红色框标出的就是其中一部分高速缓存。
高速缓存一般由两部分组成,控制部分和存储器部分。控制部分是用来判断 CPU 所请求的数据是否保存在存储器中,如果在,则称为命中;若不在则没有命中。当 CPU 命中缓存时,即可直接对高速缓存的存储器进行寻址;未命中时,则需要根据缓存替换算法将主存中的数据块替换到高速缓存的存储器中。
3
「接下来是地址映像方法了吧。」宫本还没从缓存的组成结构中缓过神来,就听见前座传来一声沧桑的话语。「诶师傅,行家啊!」宫本惊讶的抬起头,正好对上后视镜中那双炯炯有神的目光。原来是宫本在学习时不自觉地自言自语起来,引起了司机师傅的注意。「哈哈哈,早年学过,忘得差不多了。」司机师傅腼腆一笑。宫本心里一惊,没想到真是全民学编程的时代,高手无处不在。「那您也太厉害了,我正准备了解下高速缓存中的地址映像方法呢。」宫本赞叹道。「我之前还在当程序员的时候,就经常被拉去当面试官。关于地址映像方法啊,页面置换算法啊之类的问题基本上是必问的问题了。这也是对于计算机组成原理的基本考察。」司机师傅仿佛打开了话匣子。「那您这功力很深厚呀,这么多年了还记得这么基础的东西。」宫本没想到这位师傅原来还是一位资深的程序员,时间过去这么久依然记得高速缓存的一些技术重点。「其实也还好,这种基础的知识虽然实际工作中不会直接用到,但是对于理解代码还是有辅助作用的。只不过现在很多年轻人都比较忽视这方面的学习。」司机师傅略带惋惜的说道。宫本听完表示赞同的一笑,也没有接话,继续沉迷自己学习中去了。的确也是,现在许多年轻人都是为了编程而编程,反而忽视了许多计算机基本的常识和基本思想。估计很多人可能都还不知道高速缓存中有哪些地址映像方法。实际上地址映像方法就是为了将主存地址与高速缓存中存储器的地址对应起来,进行地址的映射,这样 CPU 在工作才能通过缓存正确地对主存数据进行快速读写。地址映像方法有三种,直接映像,全相联映像和组相联映像。
看到这,宫本对 CPU 高速缓存的概念已经有了比较清晰的了解。再次抬起头,发现已经能够看到小区耸立的高楼。一栋栋楼盘,亮着灯的已经不多。「师傅,我快到加了,这回感谢你哈。没想到打车也能遇到同行哈哈。」看完缓存,宫本松了口气,看来下班回家的时间还是能够利用起来的。「不过我还是想问一下,您当初为啥不干这行了呢?」一直怀着这样的疑问,宫本还是忍不住问了出来。「我啊,其实也没为啥吧。之前当程序员的时候,虽然赚得挺多的,但是累是真的累。很长一段时间也找不到自己成长的方向,在公司工作的时间越来越长,却感觉已经少了那股跟新人一样的活力和朝气。怎么说呢,就像是为了工作而工作。」「所以您就不干啦?」「倒也没有那么果断吧,纠结了挺长时间的。你别看我现在在开滴滴,其实这只不过是我目前的副业。」「那你现在还敲代码吗?」「现在还是天天敲键盘,只不过不是敲代码啦。我开滴滴也就在你们公司这附近接单,主要是为了找找以前的感觉,同样也是找找灵感吧。」「哇,那您应该财富自由了吧哈哈。」「哈哈哈,还行~」小区到了,宫本轻松的走下了车,并再次跟司机师傅道了声谢谢。短短的几十分钟的车程,让他收获满满。不仅对 CPU 缓存原理进行了快速的复习,还有幸遇到了别样的人生。他也不清楚自己是否能够迈过35岁这道坎,但至少情况可能没那么糟糕。就像那位司机师傅一样,大胆的尝试加上勇敢的付出,或许也能够成就别样的人生。