CPU瞒着内存竟干出这种事

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

今天忙里偷闲,来到厂里地址翻译部门转转,负责这项工作的小黑正忙得满头大汗。

看到我的到来,小黑指着旁边的座椅示意让我坐下。
CPU瞒着内存竟干出这种事

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

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

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

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

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

接下来小黑开始给我讲起了历史故事······

8086

原来咱们的祖先叫8086,小黑还给我看了他的照片
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就检查如果有这个标记,就发送一个页错误的中断信号告诉操作系统去把这个页面换回来。
通过我们之间的配合,解决了内存紧张的危机。后来我们把这个技术叫做内存分页交换。

现在

时间过得很快,到了我们这一辈,内存变得更大了,16GB都是小case,32GB也很常见。
除了内存,我们CPU本身也更先进了,别的不说,你光看看咱们现在的引脚数那比先祖们那几辈就不可同日而语。

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

作者:火焰
链接:https://editor.****.net/md?articleId=106148328
来源:****
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。