翻译|CPU加了缓存后,没想到有人急了~( 二 )


“没问题!” , 领导这么一说 , 小黑高兴坏了 。
地址翻译缓存回去的路上 , 我又忍不住好奇 , 向小黑打听起来:“你们这翻译地址用的缓存 , 准备怎么个弄法?”
“我还没想得很成熟 , 只有个大概的方案”
“快给我透露一下”
“好吧 , 告诉你也无妨!我举个例子吧 , 假设要翻译的虚拟地址是0x12345678 , 这是一个32位的地址 , 前面的20位是0x12345000 , 经过两次查表后 , 定位到真实的物理页面0x00abc000 , 最后再加上页内偏移 , 翻译结果就是0x00abc678”

“地址翻译完成后 , 将虚拟页编号0x12345和物理页编号0x00abc的映射关系记录起来放到缓存中”

“在进行地址翻译的时候 , 先去这个缓存里瞅一瞅 , 看看有没有记录过 , 如果有就直接用之前记录的 , 找不到再去内存页表中找 。 跟局部性原理类似 , 翻译过的地址 , 在接下来一段时间内再次用到的可能性很大 , 所以这个缓存是很有必要的!” , 小黑非常自信的说到 。


“听上去很不错 , 期待早点上马啊!”
TLB过了几天 , 我打算去MMU部门转转 , 想看看他们的缓存搞得咋样了 。
一进门 , 只见小黑和其他几个车间的MMU部门负责人正在紧张地讨论着 , 一旁的画板上画了不少条条框框的图 。

“小黑老哥 , 你们这是在做什么呢?”
“我们正在研究这个翻译记录缓存项的存储方式呢!你来得正好 , 我们讨论了半天也没什么好的思路 , 快来帮我出出主意”
我有些好奇 , 问道:“什么问题把你们都难倒了?”
“就是虚拟地址翻译的结果 , 我们不知道怎么存了!”
“这有什么好纠结的 , 缓存空间就那么大 , 一个翻译结果就是一条记录 , 一条一条的存呗”
二号车间MMU负责人连连挥手 , “没你想得这么简单 , 按照你这种存法 , 那在翻译地址的时候 , 怎么查找?难道要全部扫描一遍?”

我愣了一下 , “啊这 , 我倒是没想这么多···不过缓存空间也不大 , 存不了太多翻译结果 , 全部扫描也还好吧?”
“那可不行 , 咱们CPU的目标就是要把性能优化到极致 , 这种方案上了 , 领导还不得骂死我” , 小黑说到 。
我想了想 , “有了 , 给虚拟页编号取模 , 每个虚拟页的翻译记录只能存在缓存中固定的位置 , 这样不用全部扫描 , 一次就能定位 , 是不是很赞?”

小黑摇了摇头:“这个方案我们刚才也讨论过了 , 缓存空间有限 , 会导致大量的虚拟页取模后映射到同一个存储位置 , 就会经常冲突 , 也不是个好办法!”
“看来还真有点麻烦啊” , 我也不自觉地皱起了眉头 , 陷入了思考之中 。
“可不是嘛 , 所以我们才头疼啊”
空气突然安静 , 所有人都在低头沉思 。
“哎 , 有了!” , 一个念头在我脑中闪现 。
“什么办法?快说说看”
“分组连接!”
“分组连接?” , 众人问到 。
“没错!把前面这两种方案结合一下 。 可以把缓存存储空间划分很多个组 , 全部遍历太慢 , 直接取模映射又容易冲突 , 那如果映射的结果不是一个固定的位置 , 而是一个分组呢?”

“听上去不错唉 , 这样既降低了冲突 , 遍历也只需在分组区间里进行了 , 工作量大大降低了 , 真是个好办法”
小黑和大家都一致同意了我的想法 。
“那怎么分组呢 , 多少项为一组呢?” , 有人问到 。
“嗯 , 这个我也说不好 , 得做实验验证 , 2、4、8、16都可以试试 , 实践出真知嘛!”
“好 , 没问题 , 咱们下来测试下”