内存管理

历史

在早期的计算机,程序是直接运行在物理内存上的,也就是说,程序所访问的地址都是物理内存。但是我们往往需要同时运行多个程序,所以就有一个很明显的问题如何把计算机上有限的物理内存分配给多个程序使用

举个例子

假如我们计算机有128M内存,现在:

  • 程序A需要10M内存
  • 程序B需要100M内存
  • 程序C需要20M内存

如果我们需要同时运行A和B,那么比较直接的做法是这样的,0-10M分给A,10-110M分给B,如下:


2016-06-04-1
2016-06-04-1

这样分配,问题会有很多,大致有以下三个:

  1. 地址空间不隔离: 恶意程序可以很容易改写其他程序的内存数据,如A可以通过类似*(p + 1024 * 1024 * 10) = xxx来访问到B里的内存,这是很危险的。
  2. 内存使用率低: 比如我们在A、B同时运行的时候,突然要运行C。这个时候内存已经不够,我们可以采取的一个办法是把某个程序的数据暂时写到磁盘里,等到需要的时候再读回来。这个时候问题来了,由于地址空间是连续的,我们取出A也没法把C放入内存运行,只能取出B,可以看到这是一个巨大的IO操作,会导致效率十分低下。
  3. 程序运行的地址不确定:因为程序每次需要装入运行时我们都需要一块足够大的空闲区域,这个区域是不确定的,就需要程序重定位。

怎么办?还是那个熟悉的配方,熟悉的味道:增加中间层。

一切计算机的问题都可以通过增加中间层来解决。

思想:我们把程序的地址视为一种虚拟地址,然后通过映射的方式将这个虚拟地址转换成实际的物理地址。只要我们妥善的处理映射的方式,就能达到空间隔离的效果。

分段管理

这个时候分段的管理方法就出现了,先上图:


2016-06-04-2
2016-06-04-2

分段管理:把一段程序所需要的内存大小的虚拟空间映射到某个地址空间。
零散论点:分段的虚拟空间大小不一定相等,这是一个和分页不同的特点。
如上图,我们A需要10M的大小,那么我们的虚拟空间就是从0x00000000开始到0x00A00000结束。所以:

  1. 如果A访问的地址空间超过了0x00A00000,那么硬件就会判断这是个非法访问,就会拒绝这个请求,从而实现了隔离。
  2. 对于程序来说,我们只在0x00000000到0x00A00000来编写程序、放置变量,所以程序不需要再重定位。

分段解决了但是分段还是没有解决我们第二个问题-内存使用效率问题。人们很自然的就想到了更小粒度的内存分割和映射方法,于是,分页出现了。

分页管理

分页的基本方法是把地址空间人为的分成固定大小的页,一般都是4KB。
首先我们要知道三种页:

  • 磁盘页:磁盘中的页。
  • 虚拟页:虚拟空间的页。
  • 物理页:物理内存中的页。

程序会放在虚拟页中,最后进行映射。


2016-06-04-3
2016-06-04-3

我们把程序中常用的数据和代码页装到内存中(虚拟页中0、1、7),把不常用的放在磁盘页(虚拟页中2、3),暂未用到的不映射(虚拟页中的4、5、6)。

页错误

如果进程需要使用虚拟页的2、3,但是这时它们在磁盘页中,硬件会捕获这个消息,这就是所谓的页错误

这时操作系统会用自己的办法(用空再写,就是TLB那块)把磁盘中表示虚拟页2、3的数据读出来并且装入内存。

以页为单位来存取和交换这些数据非常方便,硬件本身就支持这种以页为单位的操作方式。

MMU

映射需要硬件来实现,几乎所有的硬件都采用一个叫MMU的部件来进行映射,如图所示。


2016-06-04-4
2016-06-04-4

写在结尾

如果您有所收获,希望点个赞支持。
也欢迎收录我的博客专栏:biggergao的博客,谢谢。
Done


作者 @biggergao

2016年06月04日

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

推荐阅读更多精彩内容