深入浅出计算机组成原理
徐文浩
bothub创始人
立即订阅
13019 人已学习
课程目录
已完结 62 讲
0/4登录后,你可以任选4讲全文学习。
入门篇 (5讲)
开篇词 | 为什么你需要学习计算机组成原理?
免费
01 | 冯·诺依曼体系结构:计算机组成的金字塔
02 | 给你一张知识地图,计算机组成原理应该这么学
03 | 通过你的CPU主频,我们来谈谈“性能”究竟是什么?
04 | 穿越功耗墙,我们该从哪些方面提升“性能”?
原理篇:指令和运算 (12讲)
05 | 计算机指令:让我们试试用纸带编程
06 | 指令跳转:原来if...else就是goto
07 | 函数调用:为什么会发生stack overflow?
08 | ELF和静态链接:为什么程序无法同时在Linux和Windows下运行?
09 | 程序装载:“640K内存”真的不够用么?
10 | 动态链接:程序内部的“共享单车”
11 | 二进制编码:“手持两把锟斤拷,口中疾呼烫烫烫”?
12 | 理解电路:从电报机到门电路,我们如何做到“千里传信”?
13 | 加法器:如何像搭乐高一样搭电路(上)?
14 | 乘法器:如何像搭乐高一样搭电路(下)?
15 | 浮点数和定点数(上):怎么用有限的Bit表示尽可能多的信息?
16 | 浮点数和定点数(下):深入理解浮点数到底有什么用?
原理篇:处理器 (18讲)
17 | 建立数据通路(上):指令+运算=CPU
18 | 建立数据通路(中):指令+运算=CPU
19 | 建立数据通路(下):指令+运算=CPU
20 | 面向流水线的指令设计(上):一心多用的现代CPU
21 | 面向流水线的指令设计(下):奔腾4是怎么失败的?
22 | 冒险和预测(一):hazard是“危”也是“机”
23 | 冒险和预测(二):流水线里的接力赛
24 | 冒险和预测(三):CPU里的“线程池”
25 | 冒险和预测(四):今天下雨了,明天还会下雨么?
26 | Superscalar和VLIW:如何让CPU的吞吐率超过1?
27 | SIMD:如何加速矩阵乘法?
28 | 异常和中断:程序出错了怎么办?
29 | CISC和RISC:为什么手机芯片都是ARM?
30 | GPU(上):为什么玩游戏需要使用GPU?
31 | GPU(下):为什么深度学习需要使用GPU?
32 | FPGA和ASIC:计算机体系结构的黄金时代
33 | 解读TPU:设计和拆解一块ASIC芯片
34 | 理解虚拟机:你在云上拿到的计算机是什么样的?
原理篇:存储与I/O系统 (17讲)
35 | 存储器层次结构全景:数据存储的大金字塔长什么样?
36 | 局部性原理:数据库性能跟不上,加个缓存就好了?
37 | 高速缓存(上):“4毫秒”究竟值多少钱?
38 | 高速缓存(下):你确定你的数据更新了么?
39 | MESI协议:如何让多核CPU的高速缓存保持一致?
40 | 理解内存(上):虚拟内存和内存保护是什么?
41 | 理解内存(下):解析TLB和内存保护
42 | 总线:计算机内部的高速公路
43 | 输入输出设备:我们并不是只能用灯泡显示“0”和“1”
44 | 理解IO_WAIT:I/O性能到底是怎么回事儿?
45 | 机械硬盘:Google早期用过的“黑科技”
46 | SSD硬盘(上):如何完成性能优化的KPI?
47 | SSD硬盘(下):如何完成性能优化的KPI?
48 | DMA:为什么Kafka这么快?
49 | 数据完整性(上):硬件坏了怎么办?
50 | 数据完整性(下):如何还原犯罪现场?
51 | 分布式计算:如果所有人的大脑都联网会怎样?
应用篇 (5讲)
52 | 设计大型DMP系统(上):MongoDB并不是什么灵丹妙药
53 | 设计大型DMP系统(下):SSD拯救了所有的DBA
54 | 理解Disruptor(上):带你体会CPU高速缓存的风驰电掣
55 | 理解Disruptor(下):不需要换挡和踩刹车的CPU,有多快?
结束语 | 知也无涯,愿你也享受发现的乐趣
免费
答疑与加餐 (5讲)
特别加餐 | 我在2019年F8大会的两日见闻录
FAQ第一期 | 学与不学,知识就在那里,不如就先学好了
用户故事 | 赵文海:怕什么真理无穷,进一寸有一寸的欢喜
FAQ第二期 | 世界上第一个编程语言是怎么来的?
特别加餐 | 我的一天怎么过?
深入浅出计算机组成原理
登录|注册

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

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

简单页表

想要把虚拟内存地址,映射到物理内存地址,最直观的办法,就是来建一张映射表。这个映射表,能够实现虚拟内存里面的页,到物理内存里面的页的一一映射。这个映射表,在计算机里面,就叫作页表(Page Table)。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入浅出计算机组成原理》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(28)

  • -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
    4
    6
  • 鱼向北游
    哈希表有哈希冲突 并且顺序乱 不符合局部性原理 所以页表存储更复合计算机运行特点 64位系统的快表应该是对页表快速查询的一个优化吧 是用硬件实现么?期待老师下次讲解
    2019-07-27
    5
  • zhe
    而一个 1 级索引表,32 个 4KiB 的也就是 16KB 的大小,这个怎么算的

    作者回复: zhe同学,

    你好,谢谢纠正。这里写错了,我修正过来,是128KB。写的时候太快把4KiB当成了4K Bit了。

    2019-08-19
    3
  • 32 位的内存地址空间,页表一共需要记录 2^20 个到物理的映射关系。这个存储关系,就好比一个 2^20 大小的数组。一个页号是完整的 32 位的 4 字节(Byte),这样一个页表就需要 4MB 的空间
    请问这两个是怎么算出来的?



    2019-07-26
    4
    2
  • 美美
    一个页号是完整的 32 位的 4 字节(Byte)
    -------------------------------
    一个页号不是20位吗,为什么是32位呢
    2019-07-30
    1
    1
  • 2个独立的二级索引,一个三级索引,一个四级索引吧? 为什么2个独立索引 还需要两个独立3级索引呢? 一个三级索引不就可以引用2个独立索引了吗?
    2019-07-26
    1
    1
  • 免费的人
    页大小是4KByte 还是Bit ?
    2019-07-26
    2
    1
  • 许童童
    多级页表相对于哈希表,优点我觉得应该是可以用到计算机的局部性原理,而用哈希表的话,顺序是打乱的而且存在哈希冲突。多级页表的缺点就是要一级一级查找,速度相对比较慢。
    2019-07-26
    1
  • 徐凯
    哈希表会有哈希冲突,比较不稳定。对于访问内存页的过程影响很大 老师是这样么
    2019-07-26
    1
  • 啦啦啦
    还是你讲的更通俗易懂
    2019-07-26
    1
  • xindoo
    计算机科学里,只要是有局部性,都可以通过加cache的方式解决,所以内存里肯定有另外一个数据结构,可以快速将某些常用的虚拟地址转化成物理地址。
    2019-07-26
    1
  • 有情有义
    老师,你好 ,请问下为什么进程加载简单页表时候,就一定要全部加载进去呢?? 为什么不只加载和多级页表一样的只有自己需要的地址呢??感觉这一讲好多地方都不像之前那样好理解啊.
    2019-11-12
  • 拯救地球好累
    ---问题---
    老师您好,有个问题还是没明白,按这种数据结构,多级页表比简单页表可以访问更大的虚拟空间,但是为什么能够更节省内存呢?某个进程所需要访问的虚拟内存空间一定的情况下,两者不是都需要一样多的页表项吗?
    2019-10-30
  • Luciano李鑫
    多级页表省空间的原因是把简单页表切碎了 。
    简单页表是一个大数组 ,数组的长度是2^20 ,总大小是40M。
    多级页表是把数据切碎成32^4个数组,全部填满元素是40M。
    体现了升维的思想,相当于四维空间,要访问四次才能拿到最终的物理地址。
    2019-10-16
    5
  • Luciano李鑫
    请问老师,关于之前来时讲的告诉缓存中数据从内存块(block)到高速缓存(cache line)中的内存块和本节中的内存页有什么区别
    2019-10-16
  • zaab
    我看不懂的地方1.使用32位的内存地址,因为1位只能是0或者1, 所以最多有2的32次方的种不同排列,一个地址对应存1bit数据, 那么1024bit = 1kb , 1024kb=1M 1024M=1G , 所以是 4294967296 /1024/1024/1024= 4GB;
     2.以一个页的大小是 4K 字节(4KB)为例,我们需要 20位高位,12位低位; 12位低位做偏移量,2的12次方=4096=4kb..
    2019-10-12
  • 小先生
    一个页号是完整的 32 位的 4 字节(Byte)
    -------------------------------
    一个页号不是20位吗,为什么是32位呢??请问有人能回答一下吗??

    作者回复: 小先生同学,

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

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

    作者回复: 焰火同学,

    你好,不太可能都实的,比如现在64位的计算机,内存空间是 2^64,没有哪个程序会需要那么多空间的。

    进程的页表是由操作系统内核来创建管理的,Linux下也就是大家所谓的Kernel在管理。

    2019-09-19
  • 活的潇洒
    为什么我们不用哈希表而用多级页表呢?
    虚拟内存占用的地址空间,通常是两段连续的空间。而不是完全散落的随机的内存地址。而多级页表,就特别适合这样的内存地址分布
    day40 笔记:httpshttps://www.cnblogs.com/luoahong/p/11383429.html
    2019-08-21
  • 蒋旺Foo
    提供一个问题供同窗们一起思考,对理解为何会采用“多级页表”挺有帮助。「同样都是把页表存储在内存中,为何多级页表就比一级页表要省空间?」
    2019-08-09
收起评论
28
返回
顶部