操作系统缓存机制

来源:互联网 发布:命令模式 java 编辑:程序博客网 时间:2024/06/16 05:27

起源

在每个指令周期中,CPU至少会访问内存一次,来抓取下一条执行的指令,而且经常会附带着更多次的访问,来获取操作数,以及存储结果。而CPU执行指令的速度就因此大大受限于对内存的访问速度,而且随着CPU的速度提高大大快于内存的访问速度提高,这个问题会越来越严重。理论上来说,我们可以制造一种存取速度与CPU寄存器相同的内存,但那样的话内存就会相当昂贵,所以为了解决这个问题,就需要利用短时间内指令的聚合特性来设计一个在CPU和主存之间工作的缓存。

缓存工作原理

缓存持有主存的一部分拷贝,当处理器试图访问内存中的一个地址时,会首先判断该地址中的内容是不是已经在缓存中了,如果是的话,则数据直接从缓存传送到处理器中,不是不是的话,则首先将该指令以及该指令附近的数据读取到缓存中,然后再从缓存中读取数据到处理器中。

缓存设计

1.缓存大小
合理的缓存大小可以大大加快cpu访问数据的速度
2.缓存单次数据交换大小
起初随着缓存单次交换数据增长,缓存命中率会增加,因为更多目标数据附近的数据被加载到了缓存中,但是随着缓存单次交换数据继续增长,性能反而会下降,这是因为此时将过多的数据从内存中加载到缓存中,这个数据交换花费了过多时间,而缓存命中率并不会继续显著的增加。
3.缓存替换算法
缓存替换算法是当一块新的内存数据被加载到缓存中时,来确定将哪部分缓存中已经存在的数据交换回去,好的缓存替换算法会维持缓存的一个高命中率,但是算法本身也会耗费时间,所以需要权衡。

数据局部性

数据局部性原理是缓存能大幅度提高性能的原理
数据局部性在以下四个方面中起作用
1.除了占整个程序小部分的跳转指令(调用函数),以及条件分支,大部分程序都是线性执行,这代表在大部分情况下,当前要执行的下一条指令就在当前指令的后面。
2.许多循环指令都是在短时间内执行大量的重复指令,这些指令都聚集在相对接近的地址段中。
3.在许多程序的运算中,都会处理线性数据结构,如数组,以及C语言中的结构体,这些数据结构item的地址都是连续的


欢迎关注我的github https://github.com/luckyCatMiao

原创粉丝点击