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

我所在的CPU是一个八核CPU,就有八个工作车间,那运行起来速度杠杆的~

虚拟地址翻译

一大早,我们一号车间MMU(内存管理单元)部门的小黑就来到领导办公室,恰好我也在。

“领导,听说您同意了阿Q他们的方案,给每个车间都划拨了缓存建设预算?”

你这小子,消息还挺灵通的。没错,内存那家伙实在太慢了,加了缓存后,不用每次都从内存读取数据,能让咱们的性能提升不少”,领导说到。

“那我们MMU部门也要申请一笔经费”,小黑说到。

领导眉头一紧,问道:“你们要申请经费干什么?”

“我们也要建设缓存”

“你们MMU部门做地址翻译工作,要缓存做什么,怕不是看领导给我们拨了款,眼红了吧?”,我在一旁说到。

小黑转过身来,看着我说道:“说我眼红,我倒是问你,你知道虚拟地址翻译的过程吗?”

这可难不倒我,以前就没少听他说过,“怎么不知道?以32位的虚拟地址为例,一个32位的虚拟地址分为三部分,分别是页目录索引、页表索引、页内偏移。翻译的时候,从CR3寄存器中取出页目录地址,根据页目录索引找到页表,再根据页表索引找到物理内存页面,最后根据页内偏移,完成寻址。我说的对吧?”

“嘿,你小子不错啊,记性挺好”,小黑有点不敢相信,随后又问到:“既然你知道,那我再问你,这读取一次数据,需要访问几次内存?”

我思考了一下,开始算了起来。从页目录表中读取一次,从页表中再读取一次,最后访问页面内数据再读取一次,总共就是三次。

“需要访问三次内存!”,我回答到。

小黑点了点头说道:“没错,你知道的,内存那家伙本来就慢,这每读写一个数据,都要访问内存三次,这谁顶得住啊?”

说的是啊,内存那家伙慢我是知道的,但读写一次就要折腾三回,我倒是没想过。

“就这还是32位地址的情况,我还没算64位下变成了4级页表呢,那访问内存的次数就更多了!”

“好在咱们马上就要建设缓存设施了,也不用每次都从内存读取数据,要是缓存能找到,就不用读取内存了嘛!”

“可是查页目录和页表还是得要两次啊”,小黑说到。

“要是能把地址翻译的结果也缓存起来就好,就不用每次都从内存查了”,我陷入了思考。

“你看,你跟我想到一会儿去了,所以我才向领导申请,咱们MMU部门也加上缓存,这样地址翻译变快了,咱们整个车间工作效率才高嘛!”

这时,领导站了起来,说道:“唉~格局要打开,光你们一号车间提高不行,得发动全厂八个车间一起。小黑,经费的问题不用担心,这事由你牵头,把其他几个车间的MMU部门负责人召集起来开个会,把你说的方案落地下去”

“没问题!”,领导这么一说,小黑高兴坏了。

地址翻译缓存

回去的路上,我又忍不住好奇,向小黑打听起来:“你们这翻译地址用的缓存,准备怎么个弄法?”

“我还没想的很成熟,只有个大概的方案”

“快给我透露一下”

“好吧,告诉你也无妨!我举个例子吧,假设要翻译的虚拟地址是0x12345678,这是一个32位的地址,前面的20位是0x12345000,经过两次查表后,定位到真实的物理页面0x00abc000,最后再加上页内偏移,翻译结果就是0x00abc678

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

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

“听上去很不错,期待早点上马啊!”

TLB

过了几天,我打算去MMU部门转转,想看看他们的缓存搞的咋样了。

一进门,只见小黑和其他几个车间的MMU部门负责人正在紧张的讨论着,一旁的画板上画了不少条条框框的图。

“小黑老哥,你们这是在做什么呢?”

“我们正在研究这个翻译记录缓存项的存储方式呢!你来的正好,我们讨论了半天也没什么好的思路,快来帮我出出主意”

我有些好奇,问道:“什么问题把你们都难倒了?”

“就是虚拟地址翻译的结果,我们不知道怎么存了!”

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

二号车间MMU负责人连连挥手,“没你想的这么简单,按照你这种存法,那在翻译地址的时候,怎么查找?难道要全部扫描一遍?”

我愣了一下,“啊这,我倒是没想这么多···不过缓存空间也不大,存不了太多翻译结果,全部扫描也还好吧?”

“那可不行,咱们CPU的目标就是要把性能优化到极致,这种方案上了,领导还不得骂死我”,小黑说到。

我想了想,“有了,给虚拟页编号取模,每个虚拟页的翻译记录只能存在缓存中固定的位置,这样不用全部扫描,一次就能定位,是不是很赞?”

小黑摇了摇头:“这个方案我们刚才也讨论过了,缓存空间有限,会导致大量的虚拟页取模后映射到同一个存储位置,就会经常冲突,也不是个好办法!”

“看来还真有点麻烦啊”,我也不自觉的皱起了眉头,陷入了思考之中。

“可不是嘛,所以我们才头疼啊”

空气突然安静,所有人都在低头沉思。

“哎,有了!”,一个念头在我脑中闪现。

“什么办法?快说说看”

“分组连接!”

“分组连接?”,众人问到。

“没错!把前面这两种方案结合一下。可以把缓存存储空间划分很多个组,全部遍历太慢,直接取模映射又容易冲突,那如果映射的结果不是一个固定的位置,而是一个分组呢?”

“听上去不错唉,这样既降低了冲突,遍历也只需在分组区间里进行了,工作量大大降低了,真是个好办法”

小黑和大家都一致同意了我的想法。

“那怎么分组呢,多少项为一组呢?”,有人问到。

“嗯,这个我也说不好,得做实验验证,2、4、8、16都可以试试,实践出真知嘛!”

“好,没问题,咱们下来测试下”

“我还有一个问题,你们的这个缓存项什么时候更新呢?咱们在保护模式下,不同的进程中,同一个虚拟页翻译后对应的物理页面可是不同的,你们可不要用了错误的缓存,那可就出大乱子了!”

“嗨,这还用你说,在场的各位干这份工作时间都不短了,这一点我们比你更清楚。进程切换的时候,会把新进程的页目录表基地址写到CR3寄存器中,那时候我们就会把缓存中的数据全部清掉啦!”,小黑胸有成竹的说到。

“也不用全部清掉吧,像有些内核页面,是所有进程共享的,就可以保留啊”

小黑点了点头,“有道理,看来得给地址翻译记录增加一个标记,用来标记是不是全局有效”

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

为了跟我们的一二级缓存相区分,小黑还给他们的地址翻译缓存取了一个响亮的名字:TLB——翻译后备缓冲区


推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

关注公众号,后台回复「1024」获取学习资料网盘链接。

欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~

CPU加了缓存后,有人急了~相关推荐

  1. AppList.json文件为空,主界面清缓存后加载后还正常显示

    问题: AppList.json文件为空,主界面清缓存后加载后还正常显示? 解决: 清缓存后运行不行的话,SelectService中加debugger运行试试.

  2. java基础—java内存模型(JMM)CPU架构、缓存一致性、重排序、JMM的实现、JMM保证可见性、有序性问题的详解

    java基础-JMM(CPU架构.JMM保证可见性.有序性) 文章目录 java基础-JMM(CPU架构.JMM保证可见性.有序性) CPU架构 说一说现在计算机存储器的结构层次 使用CPU缓存,会导 ...

  3. Android 自定义WebView 实现可以加载缓存数据

    1.自定义WebView说明 1.1.这个WebView可以加载缓存的数据.(需要后端配合,将html转换成一个字符串,主要是图片要用特殊格式) 1.2.注入了图片链接,为了方便点击webView中的 ...

  4. Android网络图片加载缓存处理库的使用---第三方库学习笔记(五)

    两款比较优秀的开源图片处理库框架:Universal-ImageLoader和Picasso. Universal-ImageLoader 简介: Universal-ImageLoader是目前An ...

  5. CPU多核并发缓存架构介绍

    CPU多核并发缓存架构 为什么要加入缓存 从主内存中读取数据的时候,会经过系统总线以及内存总线,这时会受到总线的限制,速度会大大降低.而且会存在众多问题.读入缓存,下次用时从缓存读取,效率会大大提高. ...

  6. ajax 滚动加载 缓存,Ajax实现加载缓存的loding效果

    这次给大家带来Ajax实现加载缓存的loding效果,Ajax实现加载缓存loding效果的注意事项有哪些,下面就是实战案例,一起来看一下. Ajax 异步请求的时候,一般都会利用一个动态的 gif小 ...

  7. 面试官:说说你对keep-alive的理解是什么?怎么缓存当前的组件?缓存后怎么更新?

    故心故心故心故心小故冲啊 文章目录 一.Keep-alive 是什么 二.使用场景 三.原理分析 四.思考题:缓存后如何获取数据 参考文献 一.Keep-alive 是什么 keep-alive是vu ...

  8. 计算机CPU加,减,乘,除的原理

    计算机CPU加,减,乘,除的原理 对于计算机实现加减乘除的研究记录,如有错误还请指出 1.加法 计算机的加法就如同我们的数学计算一样,只不过是进制变成了2进制,需要满2进一,如5+3,二进制表示则是 ...

  9. mysql 预加载缓存_预加载与缓存

    最近的项目中为了能够提升那么一丢丢性能,尝试了一下对 chunks 进行预加载处理.虽然做了异步加载的处理,但是项目大小决定了还是有多个异步的 chunk.js 需要进行预加载,这里我指的是 prel ...

最新文章

  1. Java改知能机_Java 面试突击之 Java 并发知识基础 进阶考点全解析
  2. 15 种 SQL 优化中,老司机才懂的处理技巧
  3. 20172317 2018-2019-1 《程序设计与数据结构》第6周学习总结
  4. 内部类的分类及其定义
  5. matlab中fprintf函数的具体使用方法
  6. 关于vue.js element ui 表单验证 this.$refs[formName].validate()的问题
  7. java 状态机_基于 RAFT 一致性算法的 Java 实现 SOFAJRaft
  8. ML.NET Cookbook:(3)如何从CSV加载包含多个列的数据?
  9. ubuntu mysql怎么备份_Ubuntu下MySQL备份与异地备份
  10. 【Python爬虫】股票数据定向爬虫
  11. Simple2D-15(音乐播放器)使用 glfw 库
  12. python中将字符变为大写_python如何同时把字符串大写变小写,小写变大写
  13. 又一篇好文:折磨人的商业计划书
  14. [Silverlight]解决Silverlight无法…
  15. http://www.cnblogs.com/zxp_9527/archive/2009/05/07/1452253.html
  16. 使用pip出现报错:Could not find a version that satisfies the...No matching distribution distributio...
  17. 手工清除U盘Survial病毒
  18. IOS 逆向开发(一)密码学 非对称加密RSA
  19. 架构师修炼系列【业务高可用】
  20. Lifeline功能介绍02——个人事件的添加

热门文章

  1. Apache日志记录组件Log4j出现反序列化漏洞 黑客可以执行任意代码 所有2.x版本均受影响...
  2. 2014-7-29-阿里电面-第一轮
  3. css z-index
  4. 谈“80后”程序员为什么找不到工作? [转]
  5. MySQL批量update数据(更新的数据值不同)
  6. 学成在线--11.RabbitMQ快速入门
  7. 交换机的工作转发原理
  8. 生成n套数位加减乘除_leetcode 算法汇总(四)位运算
  9. python 裁判文书网_python - 用selenium模拟登陆裁判文书网,系统报错找不到元素。...
  10. ann matlab,人工神经网络ann及其matlab仿真.ppt