目录

8086

32位时代

虚拟内存

分页交换

现在

往期热门回顾

推荐阅读


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

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

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

坐了好一会儿,小黑才从工位上忙完转过身来,“实在不好意思阿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位地址最多只能寻址这么大了。然后又加了几个叫做段寄存器的东西,指向这些块的开头,这样,通过段地址+段内偏移地址的方式,就能访问更多的内存了。

32位时代


后来啊,祖先的那点计算能力越来越捉襟见肘,实在是跟不上时代了。家族中的年轻一代开始挑大梁,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核并行执行,比起先祖那个年代简直有云泥之别。

往期热门回顾


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

可怕!CPU竟成了黑客的帮凶!

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

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

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

一个整数+1引发的灾难

一网打尽!每个程序猿都该了解的黑客技术大汇总

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

一个Java对象的回忆录:垃圾回收

谁动了你的HTTPS流量?

路由器里的广告秘密

一个HTTP数据包的奇幻之旅

我是一个流氓软件线程

推荐阅读


《Linux内存管理:内存描述之内存节点node》

《Linux内存管理:内存描述之内存区域zone》

《Linux内存管理:内存描述之内存页面page》

《Linux内存管理:内存描述之高端内存》

《Linux内存管理:分页机制》

《内存管理:Linux Memory Management:MMU、段、分页、PAE、Cache、TLB》

《Linux内存管理:分页机制》

《Linux内存管理:ARM64体系结构与编程之cache(1)》

《Linux内存管理:ARM64体系结构与编程之cache(2):cache一致性》

《Linux内存管理:ARM64体系结构与编程之cache(3):cache一致性协议(MESI、MOESI)、cache伪共享》

《ARM SMMU原理与IOMMU技术(“VT-d” DMA、I/O虚拟化、内存虚拟化)》

《内核引导参数IOMMU与INTEL_IOMMU有何不同?》

《提升KVM异构虚拟机启动效率:透传(pass-through)、DMA映射(VFIO、PCI、IOMMU)、virtio-balloon、异步DMA映射、预处理》

《Linux内存管理:内存寻址之分段机制与分页机制》

Linux内存管理:一个故事看懂CPU内存管理技术相关推荐

  1. 一个故事看懂Linux文件权限管理

    前情回顾: 我通过open这个系统调用虫洞来到了内核空间,又在老爷爷的指点下来到了sys_open的地盘,即将开始打开文件的工作. 详情参见:内核地址空间大冒险:系统调用 open系统调用链 小说网站 ...

  2. 一个故事看懂机械硬盘原理

    前情回顾:<第二回:内存揭奥秘,总线解玄机> 上回说到,阿飞从混沌中醒来,意外发现自己的大脑被数据化存储到了一台计算机内存中,阿飞想逃离这里,内存却告诉他,如果不赶紧把自己持久化存储起来, ...

  3. 清空list_3. Python3轻食丨一个故事看懂List所有用法:1年级1班的班级生活

    List(列表)知识:1年级1班的班级生活 1.1 列表是个啥:List(列表)的基础知识: 今天我们来讲Python六大数据类型的第一种:List(列表).本文将引入一个1年级1班的班级故事,本故事 ...

  4. 一个故事看懂“区块链”

    区块链是比特币的底层技术和基础架构,本质上是一个去中心化的数据库.区块链是一串使用密码学方法相关联产生的数据块,每一个数据块中包含了一次比特币网络交易的信息,用于验证其信息的有效性(防伪)并生成下一个 ...

  5. 一个故事看懂AI神经网络工作原理

    我是一个AI神经元 我是一个AI神经元,刚刚来到这个世界上,一切对我来说都特别新奇. 之所以叫这个名字,是因为我的工作有点像人类身体中的神经元. 人体中的神经元可以传递生物信号,给它输入一个信号,它经 ...

  6. php-fpm进程的用户组,一文看懂PHP进程管理器php-fpm

    php-fpm是什么 php-fpm是PHP的一个进程管理器.php下面的众多work进程皆有php-fpm进程管理器管理. php-fpm的工作原理 php-fpm全名是PHP FastCGI进程管 ...

  7. 一个用了统计CPU 内存 硬盘 使用率的shell脚本

    一个用了统计CPU 内存 硬盘 使用率的shell脚本 一个统计 CPU 内存 硬盘 使用率的shell脚本,供大家学习参考 代码如下: #!/bin/bash #This script is use ...

  8. 计算机处理器的参数及意义,如何看懂CPU的性能参数?

    原标题:如何看懂CPU的性能参数? 有人说:"电脑好不好,全看CPU."没错,作为电子计算机的主要设备之一,同时也是电脑中的核心配件,CPU对电脑重要性不言而喻. 简单来说,CPU ...

  9. 如何看计算机cpu的好坏,cpu主要的性能参数有哪些、怎么看?教你几招轻松看懂CPU性能好坏...

    CPU是Central Processing Unit(中央处理器)的缩写,CPU的详细参数包括内核结构, 主频,外频,倍频,接口,缓存,多媒体指令集,制造工艺,电压,封装形式,整数单元和浮点单元等. ...

最新文章

  1. 第1关:8位可控加减法电路设计
  2. EXTJS学习之道(一)
  3. 中石油训练赛 - Insertion Order(二叉搜索树+构造)
  4. CDN如何实现,关键技术是什么?
  5. SSH连接远程服务器,本地known_hosts文件记录了什么
  6. 程序员的进阶课-架构师之路(6)-链表
  7. html下拉表覆盖透明,css透明元素如何遮挡住fixed元素
  8. TCP/UDP,SOCKET,HTTP,FTP 简析
  9. Ubuntu 周立功CAN分析仪 USBCAN-II 驱动
  10. 运筹学matlab实例,运筹学与MATLAB应用答案
  11. SSH命令批量操作服务器
  12. c语言编程计算圆柱体的表面积,c语言求圆柱体的表面积和体积
  13. Pyhton计算一元二次方程的根
  14. centos7 安装hashcat
  15. 开关电源中电容与电感时间常数
  16. 建立自己的数据集 并用Tensorflow object detection API进行训练
  17. 开机卡logope引导不了_开机卡LOGO不要慌小匠来帮忙—常见的开机卡LOGO问题排查方法...
  18. 机器学习入门 ————》 一元及多元线性回归
  19. excel 闪退应急打开文件的方法
  20. 国际著名标准化组织及ISO/IEC/ASTM/IEEE等国际标准免费下载地址

热门文章

  1. 移除动态view android,请教Android,动态添加到控件能动态删除吗?
  2. AcWing 204. 表达整数的奇怪方式 / Strange Way To Express Integers
  3. GitBook的使用方式,快速创建网页文档
  4. Linux分区之parted命令
  5. Python之路【第十六篇续】Django进阶篇
  6. bzoj3202:[Sdoi2013]项链
  7. 为什么我们要使用min-height和max-height样式属性?
  8. VMware 11安装Mac OS X 10.10
  9. HDU 4515 推断时间
  10. SQL 2008 表死锁的解决