本文参考了:git
相信你确定对这一张图很熟悉了(若是仍是第一次据说就请关掉此页面吧:))。越靠近 CPU,速度越快,可是容量小且价格昂贵。如何可以高效利用缓存(LEVEL 1),是操做系统中很是重要的一环。github
上篇文章中,咱们有讲到同一个 CPU 中的 core 之间会对 last-level cache产生竞争,从而影响系统性能。UMA 架构下,假如一个 CPU 里面有多个 threads 运行在不一样 core 中,能够将其中一个 core 上的 thread 移动到其余核,从而缓解了对 last-level cahce 的竞争,达到提升速度的目的(咱们也讲了这种方法在 NUMA 架构中不适用,具体缘由请看上篇文章)。缓存
Last-level cache 竞争给性能带来影响的缘由是显而易见的,由于 cahce 大小有限,其中一个 thread 占据一部分 cache,颇有多是会把其余 cache 的挤占掉的。这种现象是 cache miss中的一种。cache miss 的大小是衡量缓存效率的重要指标。微信
此篇文章将先讲讲 cache 一些基础的知识,后面再逐步深刻。架构
下图中,main memory 有16个 bytes,cache 有4个 bytes。app
简单来说,就是把main memory 中的 0,4,8,12映射到 cache 的0;1,5,9,13映射到 cache 的2… 对,就是取模运算。这回答了咱们的第一个问题。post
这种方法叫作Direct Mapped Cache,是最简单的一种 map方法,效率也不是最高的,还有几种能够经过如下连接查看 : en.wikipedia.org/wiki/Cache_…性能
若是要是复杂点,能够看下维基百科上的这张图,原地址以下: en.wikipedia.org/wiki/Cache_…学习
用上面的方法,能够很容易知道 main memory 某个 byte 的数据在 cache 的什么位置,可是要知道有不少个不一样的 block 指向cache 里同一个位置。fetch
能够把 main memory 的最高位做为 tag,存在cache 里面,如图:
这样,好比cache 中一个 entry 的 index 为01
,他的 tag 为11
,对应的 main memory 地址就是tag + index
,即1101
。
再进一步,加上一个 valid bit,用来表示该 cache block是不是合法的。
咱们已经知道该如何经过 main memory 的地址从 cache 中找数据了,若是正如咱们所意,确实成功在 cache 中获取到了,这一段发生了什么呢?
当 CPU 须要从 memory 中read 数据的时候,地址会发送给 cache controller:
以下图:
CPU 从cache 中获取数据能够达到 ns 级,若是是 cache miss 了,就得先把main memory 的数据load 到 cache。 如今 data 已经从 main memory 中读取到了,经过如下步骤load 到 cache:
如图:
首先 cache miss 相比 cache hit 的性能差别是数量级的,应该尽量减小 cache miss 的概率。cache miss 有不少种缘由,这里讲最主要的两种,详细列表请看: en.wikipedia.org/wiki/Cache_…
前面都是一个 byte 为一个 block 的。咱们有一个这样的假设,访问一个 address,下一次访问颇有可能会访问临近的某一个 address。这个假设大多数状况下都是正确的。这个假设就叫作Spatial locality,那该如何实现这种假设?能够增长每一个block的大小。
如今将每一个 cache block 的大小设置为2个 bytes,因而咱们就能够一次性 load 两个 bytes 的数据。当咱们要 load 位置12的数据到 cache 的时候,同时也会把位置13的也 load 过去。
这时候,能够把 main memory 也划分红两个 byte 一个 block。byte address 和 block address 的对应关系也很简单,0和1对应一个 block address:0
。
导入 cache 的过程也很以前同样,没什么好赘述的:如今从 main memory 中 load 第12或者第13个byte,都会同时12,13这两个 byte load 过去。
Cache资源对于整个系统性能的影响巨大,关于如何设计 cache,调度 cache 资源的方法、论文层出不穷。此文讲的Direct Mapped Cache是最最简单的,可是对于咱们理解 cache 有很大帮助。后面咱们还会继续深刻学习一下 cache。
最后,gakki 式求赞~
广告时间,欢迎你们关注个人微信公众号。同时本文同步于 github: github.com/liaochangji…