继续整理整理~~
首先我们必须认识到不同存储器之间的效率差异,见下图:
基于不同存储技术访问时间的差异很大,我们能够得到下图所示的存储器层次结构:
根据这种规律,位于第K层的更小更快的存储设备可以作为位于第k+1层的更大更慢的存储设备的缓存,来节约时间提高效率。
简单介绍一下缓存:
缓存:一种较小,速度较快的存储设备,可作为存储设备的暂存区较大,较慢的设备中的数据子集。
对于第k+1层存储器,其被划分为连续数据对象组的块,对k层亦然。
只不过第k层的块少于第k+1层,而k层缓存应包含k+1层块的子集数据副本(通常相邻层次块大小固定,不同层次间可有不同大小的块)
局部性原理:具有局部性原理的程序倾向于使用,那些接近或等于他们最近使用过的那些数据和指令,这种局部性包括空间局部性和时间局部性。
一个好的程序总是保持这良好的局部性。
局部性好的程序就是充分地利用了存储的缓存机制。
空间局部性(命中相邻)
for(int i = 0;i < M;++i){
sum += v[i];
//其中sum常用,对于时间局部性,i为索引,步长为1很小,对应空间局部性
}
对于缓存命中hit,即当前访问数据无需从慢的k+1层存储访问,直接从第k层缓存读取。
磁盘驱动器:
设某单面磁盘旋转速度为每分钟 6000 转,每个磁道有 100 个扇区,相邻磁道间的平均移动时间为 1ms。若在某时刻,磁头位于 100 号磁道处,并沿着磁道号增大的方向移动(如下图所示),磁道号请求队列为 50,90,30,120(采用电梯调度),对请求队列中的每个磁道需读取 1 个随机分布的扇区,则读完这 4 个扇区点共需要多少时间 ?
可以发现实际上耗时最长的还是寻道时间和旋转时间,而旋转时间用硬件决定难以优化,因此一般优化磁盘臂调度策略。
通常缓存组织形式为组,每组内有若干行行:
不同的缓存存储类型:
直接映射高速缓存——每组仅有一行(E = 1)
由于组内仅有一个行,比较tag,若match则命中,再找块偏移。
组相联高速缓存——E > 1
与直接映射高速缓存差异不大,只不过这里组内多行,都比较找tag是否match
注意写回问题:
L1,L2,主内存,磁盘可能存在多个数据副本:
高速缓存与原副本之间的更新问题,直写方式为 写命中时更新的缓存数据立即写入内存;写回方式为 脏页被替换策略替换时才写回
基本了解了缓存原理,这就要求我们编程时保持良好的局部性原理,提高缓存命中效率。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务