Memory Hierarchy
Memory Hierarchy

从左往右,容量变得越大,价格变得越低,但访问速度变得越慢
刚开机时,数据全部装在disk中
当OS想要访问某个数据时,他先在Cache中找,如果找到就可以使用了,如果找不到就在Memory中找,如果再找不到就在Disk中找,此时会把disk中至少一个最小单位——sector(4kb)的数据搬到Memory中,再把Memory中至少一个最小单位——block搬到Cache中

在上述过程中,找不到数据叫做miss,找到叫做hit
在Cache中获取数据需要个位数级别的cycles数
在Memory中需要\(10^2\)级别的cycles数
在disk中需要\(10^5\)级别的cycles数
所以一定是尽量提高hit ratio
存储数据的器件
SRAM和DRAM
Cache用的是Static RAM,Memory用的是Dynamic RAM
RAM都是volatile的,如果没电了就会丢失数据
Flash和Disk
这两个是Non-volatile的,断电后数据也会保留
Flash内部是门电路,速度比机械硬盘的硬件快100到1000倍,但读写次数多了就会坏掉
SSD使用了多块flash storage
缺点:不能覆盖数据,如果要重写,必须先擦除再写入
SSD的寿命常用擦除来衡量
Disk Storage

Cache
Cache的原理和结构
Cache能有效降低数据访问时间的原理: 两个locality

图中每一行就是一个Cache Line,每个Cache Line的data部分由多个大小为1 byte的单元组成
对于Direct Mapped Cache,Cache中每个set只有一条Cache Line
对于n-way associative,相同大小的Cache下,set的数量变成原来的\(\frac{1}{n}\),每个set中的Cache Line数目变成原来的\(n\)倍
对于Fully Associative,则只有一个set

Direct Mapped Cache
假设Memory的容量是32个word,Cache的容量是8个word,而且Memory中block的大小是一个word
那么Memory中每个word可以用5 bit的地址表示,因为Cache中最多可以容纳8个block,所以我们把每个word的地址的低3位叫做index,高2位叫做tag
Memory中index相同的block放在Cache中同一个Cache Line

一个Cache Line的组成3个部分
valid bit:这个位置是否存了数据,
tag: 这个数据原地址的tag,
data:存储的数据
但同时也隐含着一个index的信息

假设说现在需要找地址是是10010的data
那么先在Cache里找,先找到010的index位置,判断valid bit是否为1,
再判断tag是不是10,如果是就代表数据已经存进Cache了,否则代表存的是其他block的数据,那么就要去Memory找

假设说一个Memory中一个data block依旧是1 word, 而实际上,一般Memory和Cache的单位都是byte
Memory总共有2^32个byte,32位地址,Cache大小是1024个word,使用10位index
4个byte构成一个word,那么Memory中每个byte的地址的后2位是用来标志这个byte在他的block中是第几个byte,叫做offset
Memory中每个byte的地址的第3-12位(从1开始计数)用来作为index
地址剩下的部分就是tag

写操作
在写数据时,如果要写入的数据已经在Cache中了
那么先在Cache中修改
然后需要修改Memory中的数据,首先是两个朴素的策略
- write through: 在Cache中数据被写修改时,接着就去修改Memory中对应的数据
- write back:在Cache中数据被写修改时,先不用写入Memory,等待这个数据要被从Memory读入Cache的新数据覆盖时,再写入Memory
但去到Memory耗时较长,我们不希望这个写入Memory的操作阻碍CPU的高速运行,有这样一个比较优秀的策略:
我们把Cache中被修改,但还没有送去Memory的数据叫做记为dirty data
等待冲突,在Cache中dirty data要被覆盖时,先把dirty data放入write buffer,等CPU空闲时,再把dirty data写入Memory。假如说write buffer中的数据被需要时,也可以从write buffer中获取数据
假如说要写入的数据不在Cache中,有两种策略
- write allocate policy:给要写入的数据在Cache中一个位置,然后再采用write back/write through
- no write allocate policy:直接把写入的数据放到Memory里,不用放在Cache中。比较适合变量初始化等操作
Associative Cache
Associative Cache将Cache分为多个set
比如2-way associative cache,每个set有两个Cache Line,那么一个set就可以同时放两个具有相同index的block
在Direct Mapped Cache中,每个set都只有一个Cache Line,可以理解为block就是set
下图中,原来是一个4 blocks (4 sets)的direct mapped cache,现在变成2-way associative cache,就分为两个set,用一位index即可

如果只有一个set,那么就是Fully Associative

Replacement Policy: 如何选择把set中哪个block踢出去
如果有non-valid的,优先踢出
LRU: Least Recently Used 把最老的踢出去,但这种方法还需要记录时间,比较麻烦
经常使用随机剔除,在high associativity时和LRU性能差不多
Cache的设计
Miss可以区分为以下三种

需要适当设计block的大小
block越大,越适应spatial locality,但从Memory搬移到Cache或者是从Cache更新到Memory时间也会增加。而且在大小固定的Cache中,block越大,Cache Line就越少,miss rate可能也会上升

衡量Cache的运行速度
-
通过实际CPI衡量
![image]()
-
通过衡量average memory access time
![image]()
Multilevel Cache

使用多级的Cache,可以有效地提高hit rate
L1 Cache一般注重减少hit time
L2 Cache注重于提高hit ratio,避免对Memory的访问
Virtual Memory
计算机中原始数据一定都是放在Disk中,Memory就相当于一个装有部分Disk数据的Cache
Virtual Memory就相当于一个映射
应用程序访问数据时,只会去使用Virtual Memory的地址访问数据。如果数据在Memory中,Virtual Memory就会把地址映射到Memory中的地址,否则就把地址映射到Disk中的地址
每个应用程序都有自己独立的Virtual Memory
Virtual Memory可以使,每个程序每次都使用相同的Vitual Memory,且使得应用程序之间使用的Memory隔离开

Memory可以看作一个Fully Associative Cache,Disk中的数据根据改良过的LRU直接丢进Memory里
Disk每次搬移一个page大小的数据到Memory,这些pages在Memory中的位置就记为Physical Page Number,相当于Cache中的index,加上一个offset,就是具体每个byte的地址
如果想要访问的数据没有存在Memory中,而要去Disk中取,就叫做page fault,发生一次page fault需要百万次cycle
与普通的Cache不同的是,Memory用Page Table来记录数据是否有被搬移到Memory中
Page Table是放在Main Memory里的,CPU中有Page Table Register来存Page Table在Main Memory中的位置
每个程序,也就是每个Virtual Memory都会有自己的一个Page Table,Page Table就负责将Virtual Page Number映射成Physical Page Number(page在Memory中的位置)或者是Disk Address(page在Disk中的位置)
Physical Page Number加上page offset就得到了Memory中具体每个byte的地址

Page Table中有多行数据,每一行叫做一个Page Table Entry (PTE)
每一个Page Table Entry对应着一个Virtual Page Number,并记录着该Virtual Page Number对应的Physical Page Number/Disk Address和一个valid bit,如果valid bit是1代表该Disk Page已经被搬移到Memory中了,地址是Physical Page Number,否则就要去Disk中的Disk Address找该数据

所以应用程序每次想要获取数据,就是用Virtual Address请求,然后OS先根据Page Table Register,找到Memory中的Page Table,看目标Virtual Address对应的数据是在Memory中还是在Disk中
Replacement Policies
使用改良的LRU,因为精确的LRU太费时
给PTE加多一位,叫做reference bit
1代表最近使用过,0代表未使用
OS会定期给reference bit全部填0,replacement就是使用LRU根据reference bit来做判断
Write-Back
想要给Disk写数据时,先在Memory上写,到该Page在Memory上要被踢出去时,再写入Disk,需要给PTE加上一个dirty bit来标记
Translation look-aside buffer(TLB)
Page Table中常用的部分就会被放入Cache中,这叫做Translation Look-aside Buffer
减少了一次查找Page Table需要的Memory访问

使用以上的技术
假如说,程序想要访问数据,他就会先去TLB查找PTE,如果没有找到,就去Page Table里查找PTE
如果在Page Table里找到了数据在Memory中的物理地址,那么就去Cache里查找数据,并把该PTE搬到TLB中
如果在Cache里没有找到,再去Memory里查找




浙公网安备 33010602011771号