吕布竟瞒着貂蝉干出这种事......
发布日期:2021-04-30 21:10:17 浏览次数:92 分类:精选文章

本文共 1848 字,大约阅读时间需要 6 分钟。

前言

今天在厂里闲下来,匆匆忙忙转了一圈,想着忙点什么事情。转到地址翻译部门时,正巧见到了负责这项工作的小黑。看着他满头大汗的样子,我也搭个 桌子坐下聊聊。

"实在抱歉啊,阿Q,今天忙得可够紧的。"小黑从工位上转过身来,显得有些不好意思。"这么多事儿得手,来不及招待你了。"

"刚忙啥,听你这么说,满头大汗的。"我好奇地问道。

"别提了,"小黑叹了口气,"最近老是发现内存页面错误,不停地要通知操作系统处理,真是怀念以前那会儿,没这么多事儿要管。"

听他这么说,我就来了兴趣,打算听听他们的工作到底是啥样子的,还问他为什么会怀念以前。


8086时代

原来咱们的祖先就是8086,小黑还给我看了他的照片。那是纯真质朴的年代,虽然性能不高,但那个时代的程序都很简单,我们的祖先一问世就成为了明星,堪称那个时代的顶流。

看到照片中的那些金属针脚了吗?那是我们CPU和外界打交道的触角,每一根都有不同的作用。通过这些触角,CPU就能和内存打交道,获取指令和数据,辛苦工作咧。

那个年代条件比较差,能凑合的就凑合,能共用的就共用。比如祖先的CPU地址总线针脚和数据总线针脚就共用了。祖先是一个16位的CPU,数据总线有16位,一次性可以传输16个比特位。地址总线又多出了A16-A19四个线,这样就有20个地址线,可以寻址1MB的内存了。

不过祖先的寄存器都是16位的,只能存放16位的地址。他们很聪明,发明了分段式存储管理,把内存划分为最大64KB的小块。16位地址最多只能寻址64KB,然后加上段寄存器,通过段地址+段内偏移地址的方式,就能访问更多的内存了。


32位时代

后来祖先的计算能力越来越捉襟见肤,跟不上时代的节奏了。家族中的年轻一代开始挑大梁,80286和80386CPU相继问世,80386成了划时代的存在。

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

后来人类越来越贪心,想要一边听音乐,一边上网,还要编辑文档。这就需要同时运行多个程序。有人发现了商机,开发了一个叫操作系统的东西。程序不再直接和CPU打交道,而是和操作系统打交道,操作系统再和我们打交道,中间商赚差价的就是他们。

操作系统很聪明,通过时间片划分让CPU轮流执行多个程序。一会儿让音乐播放,一会儿让浏览器程序跑一会儿,又让文档编辑程序运行。我们程序员埋头苦干,根本不在意,给什么代码不是代码,咱们不挑,我们就做好地址翻译的工作吧。


虚拟内存

随着越来越多程序要运行,内存空间就变得拥挤,频繁发生冲突。祖先们为了解决这个问题,想出了一个好办法——虚拟内存。

所有程序使用的地址都是虚拟地址,在真正和内存打交道时,CPU内部工作人员会给它翻译成真实的内存地址。而内存那家伙一直被我们蒙在鼓里。

这样一来,每个程序都可以使用0x00000000到0xffffffff的4GB地址空间。虽然内存只有4GB,但按需申请分配,内存管理单元负责把内存划分成4KB的页。操作系统来管理这些分配,我们只做地址翻译的工作。

为了实现这一点,CPU内部专门增加了一个寄存器CR3,用来指向地址翻译查询字典。32位地址被划分为三部分:前两部分分别指向两级目录中的条目,定位物理内存页面的位置,最后一部分指向物理内存页面的偏移地址。这样就完成了地址的翻译工作。

每个进程都有不同的地址空间,切换进程时,只需要把CR3的内容换一下,就能使用新进程的翻译字典。这种内存管理方式我们称为分页式内存管理。相比之下,我们之前的实地址模式就比较原始,直接使用真实内存地址。


分页交换

随着程序越来越多,对内存的需求也越来越大。内存空间很快就要耗尽了。我们急中生智,找操作系统协商,看看怎么办。

内存有限,但硬盘空间却很大。我们想出了一个好办法——分页交换。内存里长时间没有用到的页面被换到硬盘上,做个标记。如果后面要访问那个页面,CPU检查发现标记,就发送页错误中断信号告诉操作系统,把页面换回来。

通过这种配合,我们解决了内存紧张的危机。后来我们把这种技术叫做内存分页交换。


现代

时间过得很快,到了我们这一辈,内存变得更大了,16GB都算小案,32GB也很常见。除了内存,CPU也越来越先进。你看咱们现在的引脚数,和先祖们那几辈就不可能比了。

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

上一篇:职业生涯之初恋,没有攻略
下一篇:送一波福利,给「沉默王二」的读者朋友们

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2026年05月30日 21时58分45秒