所属频道: 网站首页 > 电商营销 > CPU加了缓存后,有人急了~

CPU加了缓存后,有人急了~

来源:IT之家 发表时间:2022-11-18 12:41 阅读量:9460  

你好,我是CPU一号车间的Q,还记得我吗。好久不见了~

我的CPU是八核CPU,有八个车间。它运行速度很快~

虚拟地址翻译

一大早,我们一车间MMU部的小黑来到领导办公室,我正好在。

领导,听说您同意了Q的计划,给每个车间都拨了一笔缓存建设预算。

你这小子,消息还挺灵通的是的,记忆的家伙太慢了添加缓存后,我们不必每次都从内存中读取数据,这可以提高我们的性能很多,这位领导说

那我们MMU部门也需要申请基金,小黑说。

领导皱着眉头问:你要申请资金干什么。

我们还想建立一个缓存

你的MMU部门做地址翻译工作,那么你需要缓存什么恐怕不是因为领导给我们拨款你吃醋了,我在一旁说道

小黑转过身,看着我说:说我吃醋,但是我问你,你知道虚拟地址翻译的流程吗。

这不会难倒我以前没少听他说过你怎么不知道以32位虚拟地址为例一个32位虚拟地址被分成三个部分,即页目录索引,页表索引和页内偏移量翻译时,从CR3寄存器中取出页目录地址,根据页目录索引找到页表,然后根据页表索引找到物理内存页,最后根据页内偏移量完成寻址我说得对吗

嘿,你是个好孩子你记性真好小黑不敢相信,接着问:既然你知道,那我再问你一遍,你一次读取数据需要访问内存多少次

我想了一下,开始计算从页目录表读取一次,再从页表读取一次,最后访问页中的数据再读取一次,一共三次

你需要访问内存三次!,我回答。

小黑点了点头,说:是啊,你知道,记忆的家伙天生就慢每次读写一个数据,都要访问内存三次谁能受得了

是的,我知道记忆的家伙很慢,但是读一次写一次要三次,但是我从来没有想过。

就这个还是32位地址来说,在我计算64位地址之前就已经变成4级页表了,所以对内存的访问次数会更大!

幸运的是,我们很快就要建立缓存设施,我们不必每次都从内存中读取数据。如果能找到缓存,我们就不用读取内存了!

但是你仍然必须检查两次页面目录和表格,布莱基说。

如果我能缓存地址转换的结果就好了,我就不用每次都从内存中检查它了,我陷入了沉思。

你看,你我考虑了一阵子,所以我向领导申请了。我们MMU部门还加了缓存,让地址翻译变得更快了,我们整个车间工作效率更高了!

这时领导站出来说:唉,要打开格局,光靠你一个车间是不行的,还得全厂八个车间一起发动小黑,别担心资金问题就看你带头了召集其他几个车间的MMU部门负责人开会,把你的计划落地

没问题!领导这么一说,小黑乐坏了。

地址转换缓存

回来的路上,我忍不住好奇我问小黑:你打算怎么处理用来翻译地址的缓存

我还没想过。我只有一个大概的计划

快跟我说说

好吧,告诉你也无妨!我给你举个例子我们假设要翻译的虚拟地址是0x12345678,这是一个32位的地址,前20位是0x12345000经过两次查找表,定位到真正的物理页0x00abc000

地址转换完成后,记录虚拟页号0x12345和物理页号0x00abc之间的映射关系,放入缓存中

在执行地址转换时,先去这个缓存看看是否已被记录如果有,直接用以前的记录如果找不到,就在内存页表中查找类似于局部性原理,翻译后的地址很可能在下一段时间内被重用,所以这个缓存是必要的!小黑非常自信的说道

听起来很棒,我期待着早点上马!

TLB

过几天我要去MMU部门看看他们的缓存做的怎么样了。

一进门就看到小黑和其他几个车间MMU部门的负责人正在紧张的讨论,一边的画板上画了一大堆规章制度。

小黑哥,你在干嘛。

我们正在研究如何存储这个翻译记录缓存项!你来得正是时候我们讨论了很久,没有什么好的来给我点建议吧

出于好奇,我问道:什么问题难倒了你们。

这是虚拟地址转换的结果。我们不知道怎么救!

有什么好纠结的缓存空间那么大,一个翻译结果就是一条记录,一条一条存储

2号车间MMU负责人连连摆手,没你想的那么简单按照你的存款方式,翻译的时候怎么找地址要全部扫描吗

我愣了一下啊,好吧,我没想那么多,但是缓存空间不大,所以不能存储太多翻译结果扫描都可以吗

那不可能我们CPU的目标就是把性能优化到极致如果采用这个方案,领导一定不骂死我,小黑说

我想了一下,有了这个,通过对虚拟页码进行模块化,每个虚拟页面的翻译记录只能存在于缓存中的一个固定位置,这样就可以一次性定位,不需要全部扫描是不是很棒

小黑摇摇头:刚才我们也讨论过这个方案。在缓存空间有限的情况下,取模后会有大量的虚拟页面映射到同一个存储位置,经常会发生冲突,并不是一个好的解决方案!

好像真的有点麻烦我不自觉地皱起了眉头,陷入了沉思

是啊,这就是我们头疼的原因。

空气突然安静下来,每个人都低头沉思。

嘿,我有了!一个想法闪过我的脑海。

什么办法跟我说说

分组连接!

数据包连接,他们问

这就对了!结合以上两种方案可以把缓存存储空间分成很多组,都是遍历太慢,直接模映射容易冲突如果映射结果不是固定位置,而是分组呢

听起来不错不仅减少了冲突,而且只需要在分组区间内遍历,大大减少了工作量这是个好主意

小黑和所有人都同意我的观点。

那怎么组一组有多少个项目有人问

嗯,这个我也不知道我得做实验验证可以试试2,4,8,16

好的,没问题,我们下来测试一下

我还有一个问题您的缓存项目将于何时更新

嘿,那还用说这里的每个人都为这份工作工作了很长时间我们比你更清楚这一点进程切换,新进程的页目录基址将被写入CR3寄存器,然后我们将清空缓存中的所有数据!,小黑自信地说

你不必把这一切都搞清楚就像一些内核页面一样,它们被所有进程共享,所以你可以保留它们

小黑点点头有道理看来我们得在地址转换记录上加一个标记,标记它是否全局有效

一个月后,八个车间MMU部门的缓存全部完成,当天投入使用我们CPU的运行效率突飞猛进,这个缓存的威力真的太大了

为了区别于我们的L2缓存,小黑还给他们的地址翻译缓存起了一个响亮的名字:TLB——翻译备份缓冲区。

责任编辑:文辉

郑重声明:此文内容为本网站转载企业宣传资讯,目的在于传播更多信息,与本站立场无关。仅供读者参考,并请自行核实相关内容。

fold