虚拟内存,cache,TLB,页表
# 页表,TLB
参考: https://baike.baidu.com/item/%E9%A1%B5%E8%A1%A8/679625?fr=aladdin
cpu访问内存的时候,需要知道其物理地址(注意是内存的物理地址,跟硬盘没关系)。
MMU(Memory Management Unit,内存管理单元)通过查页表,将==逻辑地址(虚拟地址)== 转换为 ==物理地址==将虚拟地址转换为物理地址。
转换过程中会先查TLB(translation lookaside buffer,一个小容量高速页表),没有的话再去查页表。
# cache、内存、虚拟内存
参考: https://blog.csdn.net/Com_ma/article/details/78145333
cache就是高速内存,可以有多级cache。
虚拟内存是为了防止内存不够用,从硬盘上分割出一些空间给内存扩展使用,可以看做低速内存。注意==虚拟内存跟虚拟地址是两回事==
访问内存时,需要有一个物理地址,根据这个物理地址,先去cache中找,没有再去内存中找。
cache和主存(就是内存)之间有地址的映射关系,但是它们的地址都是物理地址,而不是逻辑地址。因此访问时要先从虚拟地址转换为物理地址。
# TLB,内存的关系
cpu访问数据时,==先将逻辑地址转换为物理地址,再根据物理地址访问cache或者内存。==
CPU首先得到的是虚拟地址,要经过地址翻译成物理地址才能进行数据访问,这个过程要检查TLB(翻译后备缓冲器),如果命中,会得到其物理地址;如果没命中,那么通过查页表得到物理地址;如果查页表没查到,就会通过请页机制(缺页异常)从硬盘中加载页到内存。
得到物理地址之后,先去cache中访问,如果有就取到,本次访问结束。如果没有就取内存中取,并更新cache。
也可以参考这个文章,里面有图解: https://cloud.tencent.com/developer/article/1459252
# 某篇论文
https://segmentfault.com/a/1190000018551515?utm_medium=referral&utm_source=tuicool 讲了Intel中cpu访问数据,TLB miss,cache等详细的测试和分析。(CPU & Memory, Part 2: CPU caches)
虚拟地址不是唯一的:
一个虚拟地址在不同时间可以指向不同的物理地址。 不同进程的相同的地址也可能指向不同的物理地址。
虚拟地址必须在Memory Management Unit(MMU)的帮助下才能翻译成物理地址。不过这个步骤是很耗时的(注:前面提到的TLB cache缓存的是虚拟->物理地址的翻译结果)。
# 面试题1
- 以你的经验或者估计,在Intel或者你了解的CPU上,一次TLB Miss大概需要消耗多少个CPU Cycle?
看上面的论文可能是二三百个吧。
# 面试题2
- 对于CPU来说,一次TLB miss和一次Last Level Cache Miss 哪个的开销一般会更大一些?
TLB miss开销更大。参考: 链接:https://www.jianshu.com/p/dc4b5562aad2
那么TLB和Cache有什么关系呢?可以说TLB命中是Cache命中的基本条件。TLB不命中,会更新TLB项,这个代价非常大,Cache命中的好处基本都没有了。