CPU瞒着内存竟干出这种事

还记得我吗,我是阿Q,CPU一号车间的谁人阿Q。

今天忙里偷闲,来到厂里地址翻译部门转转,卖力这项事情的小黑正忙得满头大汗。

看到我的到来,小黑指着旁边的座椅示意让我坐下。

CPU瞒着内存竟干出这种事

坐了好一会儿,小黑才从工位上忙完转过身来,“着实不好意思阿Q,今天活太多,没来得及招待你”

“刚忙什么呢,看你满头大汗的”,我问道。

“嗨,别提了,总是发现内存页面错误,不停地要通知操作系统那里去处置,真是眷念以前啊,没有这么多破事儿要管”,小黑叹了口吻。

CPU瞒着内存竟干出这种事

我一听来了兴趣,“小黑你给我说说你们的事情呗,地址翻译是怎么一回事儿,为什么眷念以前呢?”

小黑调整了下坐姿,咕噜咕噜喝了几口水说道,“这话说来可就话长了”

接下来小黑最先给我讲起了历史故事······

8086

原来咱们的祖先叫8086,小黑还给我看了他的照片

CPU瞒着内存竟干出这种事

那是一个单纯质朴的年月,虽然事情性能不高,不外谁人年月的程序都很简朴,我们的祖先一问世就成为了明星,称得上谁人时代的顶流了。

看到照片中的那些金属针脚了吗?那是我们CPU和外界打交道的触角,每一根都有差其余作用。

CPU瞒着内存竟干出这种事

通过这些触角,CPU就可以跟内存打交道,获取指令和数据,辛勤的干活啦。

谁人年月,条件比较差,能拼集的就拼集,能共用的就共用。这不,你看祖先CPU的地址总线针脚和数据总线针脚就共用了。

祖先是一个16位的CPU,数据(Data)总线就有16位,一次性可以传输16个比特位。和地址(Address)总线拼集着一起共用,于是就取名AD0-AD15。

不外祖先的地址总线却不止16个,还多出了A16-A19整整4个呢!这样有20个地址线,可以寻址1MB的内存了!

然则祖先的寄存器都是16位的啊,只能存放16位的地址。不外他们很伶俐,发明晰一个叫分段式存储治理的方式,把内存划分为最大64KB的小块,为什么是64KB呢,由于16位地址最多只能寻址这么大了。然后又加了几个叫做段寄存器的器械,指向这些块的开头,这样,通过段地址+段内偏移地址的方式,就能接见更多的内存了。

CPU瞒着内存竟干出这种事

32位时代

厥后啊,祖先的那点盘算能力越来越左支右绌,着实是跟不上时代了。家族中的年轻一代最先挑大梁,80286和80386CPU相继问世,尤其是80386,成为了划时代的存在。

CPU瞒着内存竟干出这种事

到了80386时代,我们与外界通讯的引脚就更多了,而且变成了32位的CPU,谁人时刻,生活条件就变好了,地址线和数据线再也不用共享引脚了。

CPU瞒着内存竟干出这种事

厥后,人类变得越来越贪心,想要一边听音乐,一边还要上网,同时还要编辑文档,这就同时需要运行多个程序。

这个时刻,有人发现了商机,开发了一个叫操作系统的器械,原来那些程序不再直接和我们CPU打交道了,而是和操作系统打交道,操作系统再和我们打交道,中间商赚差价说的就是他们!

操作系统这玩意儿很伶俐啊,通过时间片划分让我们CPU来轮流执行多个程序,一会儿让我们执行音乐播放,一会儿让我们执行浏览器程序,一会儿又让我们执行文档编辑程序。我们是无所谓啊,给什么代码不是代码啊,我们不挑,埋头苦干就是了。人类的反应速度跟我们就差得远了,他们还以为这些程序真的是同时执行的呢。

虚拟内存

不外随之而来泛起了一个大问题,这么多程序都要运行,人人挤在一个内存里,经常发生摩擦,冲突不停。

CPU瞒着内存竟干出这种事

先祖们为了此事殚精竭虑,终于想出了一个好办法,一直沿用至今。

他们提出了一个虚拟地址的器械,所有程序使用的地址都是一个虚拟的地址,在真正和内存打交道的时刻,咱们CPU内部事情人员再给翻译成真实的内存地址,关于这事儿,内存那家伙一直被我们蒙在鼓里。

简述SpringCloud框架

CPU瞒着内存竟干出这种事

这样一来,每个程序都可以用的是0x00000000到0xffffffff总共4GB这么大范围的地址空间,固然不会真的给他们那么多空间,内存那家伙总共才4GB呢,而是要按需申请分配。分配的单元是根据来举行的,32位的CPU一个页是4KB。这些分配治理的累活就让操作系统来干了,中间商不能光拿利益不干正事,至于我们CPU,做好地址翻译的事情就好了。

CPU瞒着内存竟干出这种事

为此,在我们寄存器内部专门添置了一个新的寄存器CR3,用来指向一个地址翻译查询字典,字典划分了两级目录。我们把一个32位的地址划分了3部门,前面两部门划分指向两级目录中的条目,用来定位这个地址在物理内存的哪个页面,最后一部门就是指向物理内存页面的偏移,这样就完成了地址的翻译事情。

每个历程有差其余地址空间,切换历程的时刻,把CR3的内容换一下就使用新历程的翻译字典,稀奇的利便。

我们把这种内存治理方式叫做分页式内存治理

真信服先祖们的智慧,这样巧妙的把各个程序隔离开来,厥后我们把这种事情模式叫做保护模式,把之前那种直接使用真实内存地址的事情模式叫做实地址模式

分页交流

人类变得越来越贪心,程序变得越来越多,对内存的需求也越来越大。随着这些程序都不停申请内存页面,内存空间很快就要耗尽了。

我们看在眼里,急在心里,厥后找操作系统协商,看看这问题该怎么办。

CPU瞒着内存竟干出这种事

操作系统那家伙也不赖,想出了一个好办法。内存的巨细有限,然则硬盘给力啊,硬盘空间大的多,去硬盘上划一块区域来,把内存里长时间没有用到的页面给换到这块区域里去,然后做个符号。若是后面谁要接见谁人页面,咱们CPU就检查若是有这个符号,就发送一个页错误的中止信号告诉操作系统去把这个页面换回来。

通过我们之间的配合,解决了内存重要的危急。厥后我们把这个手艺叫做内存分页交流

现在

时间过得很快,到了我们这一辈,内存变得更大了,16GB都是小case,32GB也很常见。

除了内存,我们CPU自己也更先进了,其余不说,你光看看咱们现在的引脚数那比先祖们那几辈就不可同日而语。

CPU瞒着内存竟干出这种事

我们不仅从32位变成了64位,还从单核变成了多核,像我所在的CPU就有8个车间,8核并行执行,比起先祖谁人年月简直有云泥之别。

彩蛋

和小黑闲谈间,我们车间的老K突然泛起在了门口。

“阿Q原来你在这里,让我好找,赶忙回去吧,隔邻二号车间的虎子说我们改了他们的数据,上门来生事了······”

预知后事若何,请关注后续精彩······

往期热门回首

完了!CPU一味求快出事儿了!

恐怖!CPU竟成了黑客的帮凶!

哈希表哪家强?几大编程语言吵起来了!

内核地址空间大冒险4:线程切换

震撼!全网第一张源码剖析全景图揭秘Nginx

一个整数+1引发的灾难

一网打尽!每个程序猿都该领会的黑客手艺大汇总

看过无数Java GC文章,这5个问题你也未必知道!

一个Java工具的回忆录:垃圾接纳

谁动了你的HTTPS流量?

路由器里的广告隐秘

一个HTTP数据包的奇幻之旅

我是一个流氓软件线程

CPU瞒着内存竟干出这种事

CPU瞒着内存竟干出这种事

原创文章,作者:28x29新闻网,如若转载,请注明出处:https://www.28x29.com/archives/9207.html