CPU瞒着内存竟干出这种事
记得我吗我是阿q,CPU一号车间的阿q
今天,我从百忙中抽出时间,去了工厂的地址翻译部负责这项工作的小黑满头大汗
看到我的到来,小黑指了指旁边的座位,示意我坐下。
坐了很久,小黑从他的操作台转过身来真的很抱歉,Q,我今天工作太多了,没时间招待你
你在忙些什么你在流汗,我问
嘿,别客气总是发现内存页面错误,要通知操作系统处理我真的很怀念过去没有那么多破事要管,小黑叹了口气
我一听就来了兴趣,小黑,跟我说说你的工作地址翻译怎么了为什么怀念过去
小黑调整了一下坐姿,喝了几口水说:这个说来话长。
接下来,小黑开始给我讲历史故事。
8086
我们的祖先叫8086,小黑给我看了他的照片。
那是一个纯粹简单的时代,虽然工作业绩不高,但是那个时代的手续很简单,我们的祖先一出来就成了明星,可以称得上是那个时代的顶尖流。
看到照片中的金属针了吗那是我们CPU处理外界的触角,每个都有不同的功能
通过这些触角,CPU可以处理内存,获取指令和数据,努力工作。
当时条件比较差,能做的都做了,能分享的都分享了不,你看,祖传CPU的地址总线引脚和数据总线引脚是共用的
祖先是16位CPU,数据总线16位,一次可以传输16位和地址总线共享在一起,因此命名为AD0—AD15
但是,祖先的地址总线不止16条,A16—A19还有4条!所以有20条地址线,可以寻址1MB内存!
但是祖先的寄存器都是16位的,所以只能存储16位的地址不过他们很聪明,发明了一种叫做分段存储管理的方法,把内存分成小块,最大64KB为什么是64KB因为16位地址最多只能寻址这么大然后增加几个叫段寄存器的东西指向这些块的开头,这样就可以在段内以段地址+偏移量地址的方式访问更多的内存
32位时间
后来祖先的计算能力越来越捉襟见肘,真的跟不上时代了家里年轻一代开始带头,80286,80386CPU相继问世,尤其是80386,成为划时代的存在
到了80386的时候,我们有了更多的引脚与外界交流,它就变成了32位的CPU那时候生活条件变好了,地址线和数据线再也不用共用管脚了
这时有人发现了商机,开发了一个叫操作系统的东西原来那些程序不再直接和我们的CPU打交道,而是和操作系统打交道,操作系统又会和我们打交道
虚拟内存
可是,一个大问题随之而来这么多程序要运行,大家都挤在一个内存里,所以摩擦冲突频繁
老祖宗在这件事上很努力,最后想出了一个好办法,一直沿用至今。
他们提出了一个虚拟地址,所有程序使用的地址都是虚拟地址在处理内存的时候,我们内部的CPU工作人员会把它翻译成真实的内存地址关于这件事,记忆的家伙一直被我们蒙在鼓里
这样,每个程序可以使用从0x00000000到0xffffffff的大范围地址空间,总共4GB当然不会真的给他们那么大的空间内存的家伙总共只有4GB,却要根据需求申请分配分配单元是按页进行的,32位CPU的一页是4KB分销管理的辛苦就交给运营系统了,中间商不能只顾利益不务正业至于我们的CPU,做好地址翻译就好了
所以在我们的寄存器中专门增加了一个新的寄存器CR3,指向一个地址翻译查询字典,这个字典分为两级目录我们将32位地址分为三部分前两部分分别指向两级目录中的条目,用于定位该地址在物理内存的哪一页最后一部分是指向物理内存页面的偏移量,从而完成地址的翻译
每个进程都有不同的地址空间当切换进程时,通过改变CR3的内容来使用新进程的翻译字典特别方便
我们称这种内存管理方法为分页内存管理。
我真的很佩服老祖宗的智慧,如此聪明地隔离了程序后来我们把这种工作模式叫做保护模式,之前那种直接使用实内存地址的工作模式叫做实地址模式
寻呼交换机
人类越来越贪婪,程序越来越多,对内存的需求也越来越大伴随着这些程序不断申请内存页,内存空间很快就会耗尽
我们看在眼里,担心在心里后来我们和操作系统协商,看这个问题怎么办
操作系统的家伙也不差他想出了一个好主意内存大小有限,但硬盘牛逼硬盘空间大很多在硬盘上画一个区域,把内存中长时间不用的页面换到这个区域,然后做个标记如果以后有人想访问那个页面,我们的CPU会检查的如果有此标志,它将发送一个页面错误中断信号,告诉操作系统将此页面改回
通过我们的合作,我们解决了内存不足的危机后来我们把这种技术叫做内存分页交换
那一刻,立刻,马上,一就
时光飞逝,到了我们这一代,记忆变大了16GB是小情况,32GB也很常见
除了内存,我们的CPU本身更先进不说别的,光看我们现在的图钉数量,就和我们的祖先相差太远了
我们不仅从32位变成了64位,也从单核变成了多核比如我的CPU有8个车间,8个核心并行执行,和我们的祖辈有很大不同
郑重声明:此文内容为本网站转载企业宣传资讯,目的在于传播更多信息,与本站立场无关。仅供读者参考,并请自行核实相关内容。