Linux内存管理-虚拟内存篇

介绍

  • 虚拟内存是现代所有的操作系统支持的一个核心功能。虽然内存的容量增长快速,但
    是软件的大小增长更快。这一发展的最终结果就是需要运行的程序会有可能大到内存
    无法容纳,而且必然需要系统能够支持多个程序的同时运行,即使内存可以满足其中
    单一程序的需要,总体来看可能仍然会超出内存的大小。早期出现了覆盖技术,思想
    是把程序分割成许多片段,每个片段就是一个覆盖序列.在程序开始执行时,将覆盖管理
    模块载入内存,该覆盖管理模块立即装入并运行序列0.执行完,序列0就通知覆盖管理模
    块载入序列1,如果有多余的空间就占用序列0的上方位置,没有则占用序列0.覆盖块存
    放在磁盘中,在需要时,由操作系统换入换出.这样看起来好像没有太大的问题,因为是
    由操作系统来进行换入换出.但是应用程序需要被分割成多个片段.把一个大的程序分
    割成小的、模块化的片段是非常耗时和枯燥的,并且容易出错.而且这个事要交给程序
    员去做,那估计要崩溃了.没过多久聪明的人类就找到了解决版本,提出了虚拟内存的
    概念.

  • 虚拟内存的基本思想是:每个程序都拥有自己的地址空间,这个空间被分成多个块,
    每个块叫做一个页或一个页面.每一页有连续的地址范围.这些页被映射到物理内存,
    但并不是所有的页必须在内存中才能运行程序.当程序引用到一部分在物理内存中
    的地址空间时,由硬件立刻执行必要的映射.当程序引用到一部分不在物理内存中的
    地址空间时,再由操作系统负责将缺失的部分装入物理内存并重新执行失败的命令,
    这个过程叫缺页中断处理处理. 虚拟内存很适合在多道程序设计系统中使用,许多
    程序的片段同时保存在内存中. 当一个程序等待它的一部分读入内存时,可以把CPU
    交给另一个程序使用. 这里解释一下什么是多道程序设计系统,所谓的多道程序设
    计系统指的是允许多个程序同时进入一个计算机系统的主存储器(即内存)并启动进
    行计算的方法.也就是说,计算机内存中可以同时存放多个(两个或以上相互独立的)
    正在运行的程序,它们都处于开始和结束之间.从宏观上看是并行的,多道程序都处
    于运行中,并且都没有运行结束;从微观上看是串行的,各道程序轮流使用CPU,交替
    执行.引入多道程序设计技术的根本目的是为了提高CPU的利用率,充分发挥计算机
    系统部件的并行性,现代计算机系统都采用了多道程序设计技术.

  • 程序在访问一个内存地址指向的内存时,CPU不是直接把这个地址送到内存总线
    上,而是被送到一个叫内存管理单元的硬件上(业界也叫MMU,是Memory Management
    Unit的简称),然后由这个硬件把这个内存地址映射到实际的物理内存地址上.程序
    操作的这个地址称为虚拟内存地址.MMU作为CPU芯片的一部分,其实是单独的一个
    芯片.MMU把虚拟内存地址映射成物理内存地址再送到总线的过程如下图:


    mmu-convert01-1.jpg

分页技术

  • 上面提到了虚拟内存地址,实际上程序所访问的这些内存地址,构成了一个虚拟
    地址空间,正如上面提到的,虚拟地址空间按照固定的大小被划分成若干单元,每
    个单元叫做一个页或者一个页面.同时实际的物理内存也被划分成若干单元,但是
    物理内存对应的这个单元被业界称作Page Frame(页帧或页框).虚拟内存的页面
    和物理内存的页框通常是一样大的,比如都是4KB或者2MB,实际的页面大小可能从
    512 byte到1GB.如下图,按每页4KB划分一个32KB的物理内存空间和一个64KB的虚
    拟地址空间,可得到8个页框和16个虚拟页面.内存和磁盘之间的交换总是以整个
    页面为单元进行的.


    mmu-convert02.jpg

    结合这两个图,下面简单的解释一下:
    当程序试图访问地址0时,如执行下面的指令:

    MOV REG, 0

这句伪代码的意思是把地址0的数据送入寄存器中,REG是register的简称,
表示寄存器.但并不是真实的寄存器的名字,这里是伪代码.真实的寄存器如
AX,BX,CX,SS,SP等.

将虚拟地址0送到MMU,MMU看到虚拟地址0落在(0~4095)这个页面上,而这个页面
被映射到2(8K~12K)这个页框上,所以MMU把地址变成8192,并把地址8192送到总
线上.内存对MMU一无所知.它只看到一个对地址8192的读或写请求并执行它.
同理:

    MOV REG, 8192

被转换成

    MOV REG, 24576

页面8192被映射到第6个页框上即 1024 x 24 = 24576
上面的图中因为只有8个物理页框的内存,所以只有8个页面被映射到了物理内存
,正如图上有页框号的页面,其他的页面上都是叉号,表示没有被映射到物理内存
.在实际的硬件中,是用一个标志位("在/不在")来记录页面是否被映射到物理内
存.如0表示当前页没有被映射,1表示被映射.
再如,当程序访问了一个没有被映射的页面:

    MOV REG, 24576

MMU注意到该页面没有被映射,于是CPU通知操作系统,出现了上面提到的缺页错
误或缺页异常.操作系统找到一个很少使用的页框,且把它的内容写入磁盘.然
后把需要访问的这个页面的内容读到刚才的页框里,修改一下映射关系,然后重
新执行刚才的异常指令.这个过程就叫缺页中断处理.

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

推荐阅读更多精彩内容

  • 1. 基础知识 1.1、 基本概念、 功能 冯诺伊曼体系结构1、计算机处理的数据和指令一律用二进制数表示2、顺序执...
    yunpiao阅读 5,225评论 1 22
  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 7,758评论 0 27
  • 概述 我们都知道一个进程是与其他进程共享CPU和内存资源的。正因如此,操作系统需要有一套完善的内存管理机制才能防止...
    SylvanasSun阅读 3,803评论 0 25
  • 1 内存寻址 1.1 物理地址、虚拟地址以及线性地址 物理地址: 物理内存的内存单元地址 虚拟地址: 程序员看到的...
    疯狂小王子阅读 2,780评论 3 21
  • 什么都知道一点,但都不甚了解。是最可怕的,他会让你以为自己很牛逼了
    zgo阅读 207评论 0 0