还记得我吗,我是阿Q,CPU一号车间的那个阿Q。编程
今天忙里偷闲,来到厂里地址翻译部门
转转,负责这项工做的小黑正忙得满头大汗。浏览器
看到个人到来,小黑指着旁边的座椅示意让我坐下。编程语言
坐了好一下子,小黑才从工位上忙完转过身来,“实在很差意思阿Q,今天活太多,没来得及招待你”源码分析
“刚忙什么呢,看你满头大汗的”,我问道。性能
“嗨,别提了,总是发现内存页面错误,不停地要通知操做系统那边去处理,真是怀念之前啊,没有这么多破事儿要管”,小黑叹了口气。操作系统
我一听来了兴趣,“小黑你给我说说大家的工做呗,地址翻译是怎么一回事儿,为何怀念之前呢?”线程
小黑调整了下坐姿,咕噜咕噜喝了几口水说道,“这话说来可就话长了”翻译
接下来小黑开始给我讲起了历史故事······3d
原来我们的祖先叫8086,小黑还给我看了他的照片code
那是一个纯真质朴的年代,虽然工做性能不高,不过那个年代的程序都很简单,咱们的祖先一问世就成为了明星,称得上那个时代的顶流了。
看到照片中的那些金属针脚了吗?那是咱们CPU和外界打交道的触角,每一根都有不一样的做用。
经过这些触角,CPU就能够跟内存打交道,获取指令和数据,辛勤的干活啦。
那个年代,条件比较差,能凑合的就凑合,能共用的就共用。这不,你看祖先CPU的地址总线针脚和数据总线针脚就共用了。
祖先是一个16位的CPU,数据(Data)总线就有16位,一次性能够传输16个比特位。和地址(Address)总线凑合着一块儿共用,因而就取名AD0-AD15。
不过祖先的地址总线却不止16个,还多出了A16-A19整整4个呢!这样有20个地址线,能够寻址1MB的内存了!
可是祖先的寄存器都是16位的啊,只能存放16位的地址。不过他们很聪明,发明了一个叫分段式存储管理
的方法,把内存划分为最大64KB的小块,为何是64KB呢,由于16位地址最多只能寻址这么大了。而后又加了几个叫作段寄存器的东西,指向这些块的开头,这样,经过段地址+段内偏移地址的方式,就能访问更多的内存了。
后来啊,祖先的那点计算能力愈来愈捉襟见肘,实在是跟不上时代了。家族中的年轻一代开始挑大梁,80286和80386CPU相继问世,尤为是80386,成为了划时代的存在。
到了80386时代,咱们与外界通讯的引脚就更多了,而且变成了32位的CPU,那个时候,生活条件就变好了,地址线和数据线不再用共享引脚了。
后来,人类变得愈来愈贪心,想要一边听音乐,一边还要上网,同时还要编辑文档,这就同时须要运行多个程序。
这个时候,有人发现了商机,开发了一个叫操做系统
的东西,原来那些程序再也不直接和咱们CPU打交道了,而是和操做系统打交道,操做系统再和咱们打交道,中间商赚差价说的就是他们!
操做系统这玩意儿很聪明啊,经过时间片划分让咱们CPU来轮流执行多个程序,一下子让咱们执行音乐播放,一下子让咱们执行浏览器程序,一下子又让咱们执行文档编辑程序。咱们是无所谓啊,给什么代码不是代码啊,咱们不挑,埋头苦干就是了。人类的反应速度跟咱们就差得远了,他们还觉得这些程序真的是同时执行的呢。
不过随之而来出现了一个大问题,这么多程序都要运行,你们挤在一个内存里,常常发生摩擦,冲突不断。
先祖们为了此事殚精竭虑,终于想出了一个好办法,一直沿用至今。
他们提出了一个虚拟地址
的东西,全部程序使用的地址都是一个虚拟的地址,在真正和内存打交道的时候,我们CPU内部工做人员再给翻译成真实的内存地址,关于这事儿,内存那家伙一直被咱们蒙在鼓里。
这样一来,每一个程序均可以用的是0x00000000到0xffffffff总共4GB这么大范围的地址空间,固然不会真的给他们那么多空间,内存那家伙总共才4GB呢,而是要按需申请分配。分配的单元是按照页
来进行的,32位的CPU一个页是4KB。这些分配管理的累活就让操做系统来干了,中间商不能光拿好处不干正事,至于咱们CPU,作好地址翻译的工做就行了。
为此,在咱们寄存器内部专门添置了一个新的寄存器CR3,用来指向一个地址翻译查询字典,字典划分了两级目录。咱们把一个32位的地址划分了3部分,前面两部分分别指向两级目录中的条目,用来定位这个地址在物理内存的哪一个页面,最后一部分就是指向物理内存页面的偏移,这样就完成了地址的翻译工做。
每一个进程有不一样的地址空间,切换进程的时候,把CR3的内容换一下就使用新进程的翻译字典,特别的方便。
咱们把这种内存管理方式叫作分页式内存管理
。
真佩服先祖们的智慧,这样巧妙的把各个程序隔离开来,后来咱们把这种工做模式叫作保护模式
,把以前那种直接使用真实内存地址的工做模式叫作实地址模式
。
人类变得愈来愈贪婪,程序变得愈来愈多,对内存的需求也愈来愈大。随着这些程序都不断申请内存页面,内存空间很快就要耗尽了。
咱们看在眼里,急在内心,后来找操做系统协商,看看这问题该怎么办。
操做系统那家伙也不赖,想出了一个好办法。内存的大小有限,可是硬盘给力啊,硬盘空间大的多,去硬盘上划一块区域来,把内存里长时间没有用到的页面给换到这块区域里去,而后作个标记。若是后面谁要访问那个页面,我们CPU就检查若是有这个标记,就发送一个页错误的中断信号告诉操做系统去把这个页面换回来。
经过咱们之间的配合,解决了内存紧张的危机。后来咱们把这个技术叫作内存分页交换
。
时间过得很快,到了咱们这一辈,内存变得更大了,16GB都是小case,32GB也很常见。
除了内存,咱们CPU自己也更先进了,别的不说,你光看看我们如今的引脚数那比先祖们那几辈就不可同日而语。
咱们不只从32位变成了64位,还从单核变成了多核,像我所在的CPU就有8个车间,8核并行执行,比起先祖那个年代简直有云泥之别。
和小黑闲谈间,咱们车间的老K忽然出如今了门口。
“阿Q原来你在这里,让我好找,赶快回去吧,隔壁二号车间的虎子说咱们改了他们的数据,上门来闹事了······”
预知后事如何,请关注后续精彩······