深入浅出计算机组成原理
徐文浩
bothub 创始人
70432 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 62 讲
深入浅出计算机组成原理
15
15
1.0x
00:00/00:00
登录|注册

40 | 理解内存(上):虚拟内存和内存保护是什么?

缺点
优点
页表大小
页号和偏移量
地址转换方法
多级页表与哈希表的比较
Virtual Memory
计算机组成与设计:硬件/软件接口
空间复杂度
时间复杂度
页表树
多级页表
页表
程序装载到内存的过程
存储指令和数据
重要性
输出设备
输入设备
存储器
控制器
运算器
课后思考
推荐阅读
性能优化
虚拟内存地址转换
内存
五大组成部分
虚拟内存地址转换成物理内存地址

该思维导图由 AI 生成,仅供参考

我们在专栏一开始说过,计算机有五大组成部分,分别是:运算器、控制器、存储器、输入设备和输出设备。如果说计算机最重要的组件,是承担了运算器和控制器作用的 CPU,那内存就是我们第二重要的组件了。内存是五大组成部分里面的存储器,我们的指令和数据,都需要先加载到内存里面,才会被 CPU 拿去执行。
专栏第 9 讲,我们讲了程序装载到内存的过程。可以知道,在我们日常使用的 Linux 或者 Windows 操作系统下,程序并不能直接访问物理内存。
我们的内存需要被分成固定大小的页(Page),然后再通过虚拟内存地址(Virtual Address)到物理内存地址(Physical Address)的地址转换(Address Translation),才能到达实际存放数据的物理内存位置。而我们的程序看到的内存地址,都是虚拟内存地址。
既然如此,这些虚拟内存地址究竟是怎么转换成物理内存地址的呢?这一讲里,我们就来看一看。

简单页表

想要把虚拟内存地址,映射到物理内存地址,最直观的办法,就是来建一张映射表。这个映射表,能够实现虚拟内存里面的页,到物理内存里面的页的一一映射。这个映射表,在计算机里面,就叫作页表(Page Table)。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

计算机内存是计算机系统中至关重要的组成部分,程序需要加载到内存中才能被CPU执行。在Linux或Windows操作系统下,程序无法直接访问物理内存,而是通过虚拟内存地址转换成物理内存地址。这一过程通过页表实现,将虚拟内存地址映射到物理内存地址。传统的页表需要大量空间,因此引入了多级页表的解决方案,通过多级索引减少存储空间占用。尽管多级页表减少了存储空间,但增加了时间开销,需要多次访问内存。因此,文章提出了以时间换空间的策略,即多级页表。文章深入浅出地介绍了页表的基本概念和多级页表的原理,为读者解析了虚拟内存地址如何转换成物理内存地址的过程。 在优化页表的过程中,文章指出了数组和树这两种数据结构在时间复杂度和空间复杂度上的差异,以及理论软件的数据结构与硬件设计的高度相关性。此外,文章还推荐了进一步阅读材料,以及提出了课后思考问题,引发读者对多级页表和哈希表的优缺点进行思考。 总之,本文通过深入讲解页表的基本概念和多级页表的原理,为读者提供了对虚拟内存地址转换成物理内存地址的过程的全面理解,同时引发了读者对相关技术问题的思考和进一步学习的兴趣。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入浅出计算机组成原理》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(52)

  • 最新
  • 精选
  • 程序员花卷
    数据结构真的是无处不在啊! 哈希表是数组 + 链表组成的,充分的结合了数组和链表的优势,互补!但是哈希表存在哈希冲突,并且是无序的!不符合局部性原理!

    作者回复: 👍,其实算法和数据结构在软硬件的开发的方方面面都会涉及到。

    2019-12-24
    7
  • zhe
    而一个 1 级索引表,32 个 4KiB 的也就是 16KB 的大小,这个怎么算的

    作者回复: zhe同学, 你好,谢谢纠正。这里写错了,我修正过来,是128KB。写的时候太快把4KiB当成了4K Bit了。

    2019-08-19
    6
  • 焰火
    如果程序很大,两头实,中间也实,那么多级页表所占用的空间肯定比简单页表大得多吧? 进程的页表是操作系统进行统一管理的还是每个进程的装载器自我管理呢?

    作者回复: 焰火同学, 你好,不太可能都实的,比如现在64位的计算机,内存空间是 2^64,没有哪个程序会需要那么多空间的。 进程的页表是由操作系统内核来创建管理的,Linux下也就是大家所谓的Kernel在管理。

    2019-09-19
    2
  • 小先生
    一个页号是完整的 32 位的 4 字节(Byte) ------------------------------- 一个页号不是20位吗,为什么是32位呢??请问有人能回答一下吗??

    作者回复: 小先生同学, 你好,页表有2^20个项,这个2^20可以认为是一个虚拟页号。但是物理页号其实是一个内存地址,一个32位的操作系统的一个内存地址就是32Bit也就是32位。

    2019-09-23
    2
  • 红泥小火炉
    下一节是不是就出来tlb了

    编辑回复: 是

    2019-07-28
  • 鱼向北游
    哈希表有哈希冲突 并且顺序乱 不符合局部性原理 所以页表存储更复合计算机运行特点 64位系统的快表应该是对页表快速查询的一个优化吧 是用硬件实现么?期待老师下次讲解
    2019-07-27
    3
    49
  • 华新
    找了半天终于搞明白为啥用多级页表可以节省内存空间了。总觉得加了四级占的空间更大了才对。 有跟我存在一样疑惑的可以参看以下地址,说的很明白: https://www.polarxiong.com/archives/%E5%A4%9A%E7%BA%A7%E9%A1%B5%E8%A1%A8%E5%A6%82%E4%BD%95%E8%8A%82%E7%BA%A6%E5%86%85%E5%AD%98.html
    2020-05-14
    7
    35
  • -W.LI-
    我们可以一起来测算一下,一个进程如果占用了 1MB 的内存空间,分成了 2 个 512KB 的连续空间。那么,它一共需要 2 个独立的、填满的 2 级索引表,也就意味着 64 个 1 级索引表,2 个独立的 3 级索引表,1 个 4 级索引表。一共需要 69 个索引表,每个 128 字节,大概就是 9KB 的空间。比起 4MB 来说,只有差不多 1/500。 1个3级索引表,不是有32个2级索引表么? 为啥需要2个独立的3级索引表啊?
    2019-07-27
    17
    23
  • 业余爱好者
    多级页表感觉就是对大量地址的分组,如果组还是太多就接着分组,一直到一个组数规模适中的程度。查找时逐层进行。由于地址空间是个杠铃结构,很多分组就不需要了,这样就大大节省了内存空间。
    2020-06-20
    9
  • 去777
    跟调表的思想有点像
    2020-03-11
    2
    6
收起评论
显示
设置
留言
52
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部