一个故事看懂CPU的TLB,程序员必须要了解的知识点
作者:互联网
我思考了一下,开始算了起来。从页目录表中读取一次,从页表中再读取一次,最后访问页面内数据再读取一次,总共就是三次。
“需要访问三次内存!”,我回答到。
小黑点了点头说道:“没错,你知道的,内存那家伙本来就慢,这每读写一个数据,都要访问内存三次,这谁顶得住啊?”
说的是啊,内存那家伙慢我是知道的,但读写一次就要折腾三回,我倒是没想过。
“就这还是32位地址的情况,我还没算64位下变成了4级页表呢,那访问内存的次数就更多了!”
“好在咱们马上就要建设缓存设施了,也不用每次都从内存读取数据,要是缓存能找到,就不用读取内存了嘛!”
“可是查页目录和页表还是得要两次啊”,小黑说到。
“要是能把地址翻译的结果也缓存起来就好,就不用每次都从内存查了”,我陷入了思考。
“你看,你跟我想到一会儿去了,所以我才向领导申请,咱们MMU部门也加上缓存,这样地址翻译变快了,咱们整个车间工作效率才高嘛!”
这时,领导站了起来,说道:“唉~格局要打开,光你们一号车间提高不行,得发动全厂八个车间一起。小黑,经费的问题不用担心,这事由你牵头,把其他几个车间的MMU部门负责人召集起来开个会,把你说的方案落地下去”
“没问题!”,领导这么一说,小黑高兴坏了。
地址翻译缓存
回去的路上,我又忍不住好奇,向小黑打听起来:“你们这翻译地址用的缓存,准备怎么个弄法?”
“我还没想的很成熟,只有个大概的方案”
“快给我透露一下”
“好吧,告诉你也无妨!我举个例子吧,假设要翻译的虚拟地址是0x12345678
,这是一个32位的地址,前面的20位是0x12345000
,经过两次查表后,定位到真实的物理页面0x00abc000
,最后再加上页内偏移,翻译结果就是0x00abc678
”
“地址翻译完成后,将虚拟页编号0x12345
和物理页编号0x00abc
的映射关系记录起来放到缓存中”
“在进行地址翻译的时候,先去这个缓存里瞅一瞅,看看有没有记录过,如果有就直接用之前记录的,找不到再去内存页表中找。跟局部性原理类似,翻译过的地址,在接下来一段时间内再次用到的可能性很大,所以这个缓存是很有必要的!”,小黑非常自信的说到。
“听上去很不错,期待早点上马啊!”
TLB
过了几天,我打算去MMU部门转转,想看看他们的缓存搞的咋样了。
一进门,只见小黑和其他几个车间的MMU部门负责人正在紧张的讨论着,一旁的画板上画了不少条条框框的图。
“小黑老哥,你们这是在做什么呢?”
“我们正在研究这个翻译记录缓存项的存储方式呢!你来的正好,我们讨论了半天也没什么好的思路,快来帮我出出主意”
我有些好奇,问道:“什么问题把你们都难倒了?”
“就是虚拟地址翻译的结果,我们不知道怎么存了!”
“这有什么好纠结的,缓存空间就那么大,一个翻译结果就是一条记录,一条一条的存呗”
二号车间MMU负责人连连挥手,“没你想的这么简单,按照你这种存法,那在翻译地址的时候,怎么查找?难道要全部扫描一遍?”
我愣了一下,“啊这,我倒是没想这么多···不过缓存空间也不大,存不了太多翻译结果,全部扫描也还好吧?”
“那可不行,咱们CPU的目标就是要把性能优化到极致,这种方案上了,领导还不得骂死我”,小黑说到。
我想了想,“有了,给虚拟页编号取模,每个虚拟页的翻译记录只能存在缓存中固定的位置,这样不用全部扫描,一次就能定位,是不是很赞?”
小黑摇了摇头:“这个方案我们刚才也讨论过了,缓存空间有限,会导致大量的虚拟页取模后映射到同一个存储位置,就会经常冲突,也不是个好办法!”
“看来
《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
还真有点麻烦啊”,我也不自觉的皱起了眉头,陷入了思考之中。
“可不是嘛,所以我们才头疼啊”
空气突然安静,所有人都在低头沉思。
“哎,有了!”,一个念头在我脑中闪现。
“什么办法?快说说看”
“分组连接!”
“分组连接?”,众人问到。
“没错!把前面这两种方案结合一下。可以把缓存存储空间划分很多个组,全部遍历太慢,直接取模映射又容易冲突,那如果映射的结果不是一个固定的位置,而是一个分组呢?”
“听上去不错唉,这样既降低了冲突,遍历也只需在分组区间里进行了,工作量大大降低了,真是个好办法”
小黑和大家都一致同意了我的想法。
标签:知识点,翻译,缓存,MMU,TLB,地址,内存,CPU,小黑 来源: https://blog.csdn.net/m0_64867220/article/details/121767652