1.提升主存速度(双端口RAM,多模块存储器)
双端口RAM
多体并行存储器
两种存储方式:
高位交叉编址:访问n个连续存储字用时
n
T
nT
nT
低位交叉编址(408常考):访问n个连续存储字用时
T
+
(
n
−
1
)
r
T+(n-1)r
T+(n−1)r
连续访问时,低位比高位的效率更高。
存储体的数量选择
存
储
体
模
块
数
=
存
取
周
期
存
取
时
间
/
总
线
传
输
时
间
=
T
r
存储体模块数=\frac{存取周期}{存取时间/总线传输时间}=\frac{T}{r}
存储体模块数=存取时间/总线传输时间存取周期=rT
多模块存储器
单体多字存储器的灵活性相对多体并行存储器较差。
主频越高T越短,r也就越短。
2.Cache工作原理
为什么将指令cache和数据cache相分离?
主要是为了避免资源冲突,在五级指令流水线中,分为IF(取址),ID(译码),EXE(执行),MEM(访存),WB(写回)。当然也不一定是五级,现在处理器流水线的长度都在15级左右。但是IF和MEM这两步总是有的。
其中IF和MEM都会访问cache。但是IF访问cache是取指令,MEM访问内存是取数据。
当前指令的MEM和后面指令IF同时在流水线上执行,会产生同时访问cache的冲突(资源冲突),但是将指令cache和数据cache分开就能满足两者的同时访问了。就不会因为冲突,造成流水线暂停了,提高了流水线运行效率。
————————————————
版权声明:本文为CSDN博主「hopbox」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hopbox/article/details/84895398
局部性原理
空间局部性(spatial locality):如果一个存储器的位置被引用,那么将来他附近的位置也会被引用。
时间局部性(temporal locality):被引用过一次的存储器位置在未来会被多次引用(通常在循环中)。
Cache命中率H,访问Cache时间
t
c
t_{c}
tc,访问Cache时间
t
m
t_{m}
tm
两种访问策略:
先访问Cache,再访问主存:
系统的平均访问时间:t=
H
t
c
+
(
1
−
H
)
(
t
m
+
t
c
)
Ht_{c}+(1-H)(t_{m}+t_{c})
Htc+(1−H)(tm+tc)
Cache、主存同时访问:
系统的平均访问时间:t=
H
t
c
+
(
1
−
H
)
t
m
Ht_{c}+(1-H)t_{m}
Htc+(1−H)tm
主存与Cache之间以“块”为单位进行数据交换
主存中的块,也称为一个“页/页面”
Cache中的块,也称为一个“行”
3.Cache映射方式
全相联映射
主存块可以放在Cache的任意位置。
直接映射(只能放固定位置)
Cache块号=
主
存
块
号
%
C
a
c
h
e
总
块
数
主存块号\%Cache总块数
主存块号%Cache总块数
组相联映射
租号=
主
存
块
号
%
分
组
数
主存块号\%分组数
主存块号%分组数
4.Cache替换算法
只有全相联映射、组相联映射需要替换算法。
随机算法(RAND)
没有考虑局部性原理,命中率低、实际效果很不稳定。
先进先出算法(FIFO)
没有考虑局部性原理,实际运行效果低。
近期最少使用算法(LRU)
考虑到了局部性原理,Cache命中率高。
但是如果访问的主存块数>Cache行数,也有可能发生"抖动"。(1,2,3,4,5,1,2……)
最不经常使用算法(LFU)
计数器可能会加到很大的值,替换时可以按照行号递增或FIFO策略。
LFU没有很好地遵循局部性原理,实际效果不如LRU。
5.Cache写策略
读操作不会导致Cache和主存的数据不一致的问题。
写命中
写回法(write back)
增加脏位,当cache块被替换时,若脏位为1,则写回主存。
减少了访存次数,但存在数据不一致的隐患。
全写法/写直通/写直达(write through)
数据同时写入Cache和主存,使用写缓冲。
写缓冲机制
使用写缓冲,CPU写的速度很快,若写操作不频繁,则效果很好。若写操作很频繁,可能会因为写缓冲饱和而发生阻塞。
写不命中
写分配法(搭配写回法)
当CPU对Cache写不命中时,把主存中的块调入Cache,在Cache中修改,通常搭配写回法使用。
非写分配法(搭配全写法)
当CPU对Cache写不命中时只写入主存,不调入Cache。
多级Cache
i5处理器就有三级Cache,L1,L2,L3.
各级Cache之间常采用“全写法”+非写分配法。
Cache-主存之间常采用“写回法”+写分配法。
可在任务管理器中进行查看