计算机的虚拟内存

来自 深入浅出计算机组成原理

在操作系统中,程序执行的时候并不是直接访问物理内存去取指令。实际的物理内存被分为了固定大小(一般4KB)的内存页,然后通过虚拟内存的转换找到实际的物理内存地址(内存管理策略),再拿到程序所需要的数据。所以计算机程序"看到的地址"都是虚拟内存地址,那虚拟内存地址是如何转换成实际的物理内存地址呢?

最简单直观的方式是通过增加一张维持双方地址信息的映射表,里面存放着虚拟内存地址的页以及虚拟内存地址页对应的实际物理内存地址页。这个表在计算机里面叫做页表(Page Table)。将一个内存地址(包括虚拟内存和实际的物理内存)分为页号偏移量

在32位的操作系统里面,内存地址的高位20位表示页号,低位12位表示偏移量,表示数据在该页中的相对位置。所以对于一个内存地址转换,就是这样的一些步骤:

  1. 程序读取虚拟内存地址的页号(高位)和偏移量(低位)。
  2. 从页表中找到虚拟内存地址对应的实际物理地址的页。
  3. 根据读取的偏移量找到对应的数据。
内存地址转换

这样子做看是流程很合理,但自习想想确实是有问题的,就像我们常用的Mysql数据库的索引,每次建立一个索引都需要生成单独的B+树,索引越多,对应的需要的索引空间就会越大。同理,计算机的每个程序都独占进程,每个进程都需要有自己的虚拟内存,所以每个程序都要维护一张页表。而且不管程序是几十K还是几百M的程序,都需要一张独立的页表。

以32位的操作系统为例,表一共需要记录 2^20 个到物理页号的映射关系。这个存储关系,就好比一个 2^20 大小的数组。一个页号是完整的 32 位的 4 字节(Byte),这样一个页表就需要 4MB 的空间。当运行的程序一多,占用的内存空间就非常的大了。如果是64位的系统,就更加的大了。

多级页表(以时间换空间)

其实大部分的程序运行的时候所需要的内存都是有限的,并不是要用上全部的物理内存地址,所以只需要维护用到的内存地址之间的映射就好了。

进程的内存地址如何分配

进程的内存地址分配,通常都是两头实,中间空,在程序运行的时候,内存地址从顶部往下,不断分配占用的栈的空间。而堆的空间,内存地址则是从底部往上,是不断分配占用的。所以进程的堆和栈都是连续的地址空间,而这种连续的地址空间分布,非常适合多级页表。

所谓的多级页表其实就是将直接映射(类数组)的高位拆分成更细粒度的部分,比如拆分成三部分即三级页表。举个例子:

image.png

如上图,是一个32位操作系统的二级页表的实例图,这里的每一级页都是用4个bits来表示,对于虚拟地址0x01ABC来转换成物理地址,由于12个低位表示偏移,所以ABC就是物理地址实际页的偏移量,0一级页表的相对位置,1是二级页表的相对位置(这里的0和1是十六进制值)。所以先从0找到二级页表是哪个表,定位好了二级页表那么从1这个位置参数找到具体的物理地址了。

这个过程就像树的查找过程,所以多级页表也称为页表树

页表树

我们可以一起来测算一下,一个进程如果占用了 8MB 的内存空间,分成了 2 个 4MB 的连续空间。那么,它一共需要 2 个独立的、填满的 2 级索引表,也就意味着 64 个 1 级索引表,2 个独立的 3 级索引表,1 个 4 级索引表。一共需要 69 个索引表,每个 128 字节,大概就是 9KB 的空间。比起 4MB 来说,只有差不多 1/500。

但是这是一种以时间来换取空间的策略,虽然空间占用很小了,但是类数组的映射只需要访问一次内存,页表树就要访问多次了内存了。对于加速的性能,就需要了解 TLB

TLB 地址变换高速缓冲

TLB 其实就是一块缓存芯片,缓存了之前已经进行过内存地址转换的结果,也是里局部性原理,这样,当同样的虚拟地址需要进行地址转换的时候,我们可以直接在 TLB 里面查询结果,而不需要多次访问内存来完成一次转换。TLB的原理和CPU高速缓存的原理是一样的。缓存同步,一级二级缓存以及写回策略。

TLB

而且为了性能,整个内存转换过程也要由硬件来执行。在 CPU 芯片里面,我们封装了内存管理单元(MMU,Memory Management Unit)芯片,用来完成地址转换。和 TLB 的访问和交互,都是由这个 MMU 控制的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容

  • 本文转载自 https://juejin.im/post/59f8691b51882534af254317 参考:...
    xingdong阅读 2,718评论 0 3
  • 我们应该知道物理内存(Physical Memory)指的是硬件上的内存,即 RAM。它通常指的是插在主板上的内存...
    安佳玮阅读 1,873评论 0 0
  • ## 一些小话 前段时间因为一些杂七杂八的事情 被逼无奈 赶各种作业 再加上某个姓张的贱人 欺骗我说计网...
    小师弟_831a阅读 2,281评论 0 5
  • 维基百科——虚拟内存定义 虚拟内存是计算机内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存(一个连续完整...
    小胖学编程阅读 845评论 0 8
  • 概述 现代操作系统了提供了一种对主存的抽象概念,叫做虚拟内存。它为每个进程提供了一个非常大的,一致的和私有的地址空...
    要上班的斌哥阅读 16,412评论 2 55