源程序 执行程序 空间代码都要存在外存上,程序运行的时候操作系统要把外存的东西加载到内存里,CPU要从内存一行一行的读、译码和分析
我们来看一个例子:
指令位于内存中的代码段中,必须从内存中读出来进行译码分析之后才能运行
指令必须从内存中读出经过CPU的译码器 才能翻译成机器语言
关于存储器的一些基本术语:
如果上一级不命中回到下一级来寻找:
不命中的分类:
首先要理解局部性原理 为啥层次结构行得通 因为局部性原理访问第K层的数据要比访问第K+1层的数据要频繁。cache是由硬件自动完成的。
为啥要把指令和数据cache分开 为了避免资源的冲突 这个是一个很重要的东西 计组也考了(但是我错了)
一位不命中的代价太高了 所以cache采用按块求取的方式,读取8不命中 然后就到下方的内存中找数据。
查找方式:
比如这一条语句:
movl n(rip), %eax
传地址 然后由硬件自动将地址进行切割,找到组 然后逐路进行查找 先看有效位valid是不是1,然后再看 再比较字地址的标记位和块的tag位是不是相等。b决定从第几个字节开始读 movl决定读几个字节。
B = 64块 S = 32kB/64B每块/8路=64 E = 8 C=SEB
35 6 6机器数在计算机中是小端存储
全相联映射示意图
ACD 没有路索引
直接映射会发生窗口抖动的现象 全相联映射会出现比较器比较多而产生电路设计复杂的问题。
抖动指的是多次冲突不命中。
存储器山
编写面向cache友好的程序:
第一次 读00 调入cache 读disc调入cache
第二部访问source 01命中 但是dst 10不在cache里 调入 10 11
第三次访问source 10 m调入 11 访问dis01 命中
第四次访问source 11 命中 访问 11命中