基本概念

操作系统中有虚拟内存与物理内存的概念。
首先理解一下什么叫物理内存?什么叫虚拟内存?

  • 物理内存是指由于安装内存条而获得的临时储存空间。主要作用是在计算机运行时为操作系统和各种程序提供临时储存。常见的物理内存规格有256M、512M、1G、2G等,当物理内存不足时,可以用虚拟内存代替。

  • 虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间),它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。

在虚拟内存出现之前,程序寻址用的都是物理地址,因此程序能寻址的范围是有限的,具体程序可以寻址的范围有多大取决于CPU的地址线条数。比如在32位平台下,寻址的范围是2^32也就是4G,并且这是固定的,如果没有虚拟内存,且每次开启一个进程都分配出来4G的物理内存,就会出现很多问题:

  • 因为物理内存是有限的,当有多个进程要执行的时候,对每个进程都要分配4G内存,很显然你内存若小一点,这很快就分配完了,于是没有得到分配资源的进程就只能等待。当一个进程执行完后,再将等待的进程装入内存。这种频繁的装入内存的操作是很没效率的。
  • 由于指令都是直接访问物理内存的,那么进程就可以修改其他进程的数据,甚至会修改内核地址空间的数据,这是我们不想看到的。
  • 因为内存是随机分配的,所以程序运行的地址也是不正确的。

为了解决上述问题,于是就出现了虚拟内存。

深入理解

一个进程运行时会被分配4G的虚拟内存。 进程有了虚拟内存后,每个进程都认为自己拥有4G的内存空间,当然这只是每个进程认为的。但实际上,虚拟内存对应的实际物理内存,可能只对应的分配了一点点的物理内存,实际使用了多少内存,就会对应多少物理内存。

进程得到的这4G虚拟内存是一个连续的地址空间(这也只是进程认为),而实际上,它的数据是存储在多个物理内存碎片的,还有一部分存储在外部磁盘存储器上,在需要时将数据交换进物理内存。

进程开始要访问一个地址,它可能会经历下面的过程

  1. 进程每次要访问地址空间上的某一个地址时,都需要把地址翻译为实际物理内存地址。
  2. 所有进程共享一整块物理内存,每个进程只把自己目前需要访问的虚拟地址空间映射到物理内存上。
  3. 进程需要知道哪些虚拟内存地址空间上的数据在物理内存上,哪些不在(可能这部分存储在磁盘上),若在物理内存上存在,则需要进一步知道数据存储在物理内存上的具体位置,这都需要通过页表来记录。
  4. 页表的每一个表项分两部分,第一部分记录此页是否在物理内存上,第二部分记录物理内存页的地址(如果在的话)。
  5. 当进程访问某个虚拟地址的时候,就会先去看页表,如果发现对应的数据不在物理内存上,就会发生缺页异常。
  6. 缺页异常的处理过程,操作系统立即阻塞该进程,并将硬盘里对应的页换入内存,然后使该进程就绪,如果内存已经满了,没有空地方了,那就找一个页覆盖,至于具体覆盖的哪个页,就需要看操作系统的页面置换算法是怎么设计的了。
关于页面置换算法(重要)

页置换采用如下方法:如果没有空闲帧,那么就查找当前没有使用的帧,将其释放。
(1)查找所需页在磁盘上的位置
(2)查找一个空闲帧

a,如果有空闲帧,那么就使用它,

b,如果没有,使用页置换算法选择一个牺牲帧

c,将牺牲帧的内容写到磁盘上,改变页表和帧表

(3)将所需页读入空闲帧,改变页表和帧表

(4)重新启动程序。

常见的页置换算法:

(I)FIFO页置换

最先进入的页被置换。

需要注意的是FIFO页置换会有一种特殊现象——Belady异常:对有的页置换算法,页错误率可能随着所分配的帧数的增加而增加。FIFO可能就出现这种现象。

(II)最优页置换opt

置换最长时间不会使用的页,即能预知将来的情况。但是将来的情况我们无法预知,因此这种算法难以实现。

(III)LRU页置换(最近最少使用算法least-recently-used algorithm)

FIFO使用的是页调入内存的时间,OPT使用的是将来的时间。

LRU置换为每个页关联上上一次使用的时间,当必须置换一页时,LRU选择最长时间没有使用的页。

最优置换和LRU置换都没有Belady算法(证明略)

(IIII)近似LRU页置换

页表中的每一项都关联一个引用位,每当引用一个页时,相应的位就被置位。因此我们虽然不知道引用顺序,但是我们知道哪些页被引用,哪些未被引用。近似LRU算法又有一下三种方法:

(a)附加引用位算法

通过在规定时间间隔里记录引用位。

0000000,11111111,上述两个字节分别表示在8个周期内从未被引用和一直被引用的情况。因此值最小,就是应该置换的页。

(b)二次机会算法

这种算法只有引用位本身,没有历史位,因此只有一位。当要选择一个页时,检查引用位,如为0,直接置换,如为1,则给该页二次机会,同时清0,寻找下一个0位置,所以而二次机会算法的基本算法是FIFO算法。

(c)增强型二次机会算法

通过将引用为和修改位作为一对有序位来考虑。

(0,0)——最近未使用且未修改过

(0,1)——最近未使用但修改过

(1,0)——最近使用但为修改过

(1,1)——使用且修改过

(IIIII)基于计数器的页置换

为每一个页保留一个用于记录其引用次数的计数器,因而可以形成以下两种方案:

最不经常使用页置换算法(LFU)——置换出引用次数最小的页

最常使用页置换算法(MFU)——认为最小次数的页可能刚刚调入,且还没有使用。

(IIIIII)页缓冲算法

系统保留一个空闲帧缓冲池,当出现页错误时,会选择牺牲帧,但是牺牲帧写出之前,所需要的页就从缓冲池中读到空闲内存。这样加速了重启。

关于虚拟内存与物理内存的联系,下面这张图可以很直观的帮助我们理解。

先看一下虚拟内存的结构图:
以32位机为例,我们看到的进程虚拟存储器占用3G虚拟内存空间,内核虚拟存储器占用1G的虚拟内存空间

虚拟内存与物理内存的联系:

页表的工作原理:

  1. cpu想访问虚拟地址所在的虚拟页(VP3),根据页表,找出页表中对应的页表项,判断有效位。
  2. 若有效位为1,则DRMA缓存命中,根据物理页号,找到物理页当中的内容,返回。
  3. 若有效位为0,则发生缺页异常,调用内核缺页异常处理程序。内核通过页面置换算法选择一个页面作为被覆盖的页面,将该页的内容刷新到磁盘空间当中。然后把VP3映射的磁盘文件内容缓存到该物理地址对应的页上面。然后将页表项中的有效位变成1,第二部分存储了对应的物理内存也的地址。
  4. 缺页异常处理完毕后,返回中断前的指令,重新执行,此时缓存命中,执行1。
  5. 将找到的内容映射到高速缓存当中,CPU从高速缓存中获取该值,结束。

虚拟内存的工作模式

当每个进程创建的时候,内核会为进程分配4G的虚拟内存,当进程还没有开始运行时,这只是一个内存布局。实际上并不立即就把虚拟内存对应位置的程序数据和代码(比如.text .data段)拷贝到物理内存中,只是建立好虚拟内存和磁盘文件之间的映射就好(叫做存储器映射)。这个时候数据和代码还是在磁盘上的。当运行到对应的程序时,进程去寻找页表,发现页表中地址没有存放在物理内存上,而是在磁盘上,于是发生缺页异常,于是将磁盘上的数据拷贝到物理内存中。

另外在进程运行过程中,要通过malloc来动态分配内存时,也只是分配了虚拟内存,即为这块虚拟内存对应的页表项做相应设置,当进程真正访问到此数据时,才引发缺页异常。

可以认为虚拟空间都被映射到了磁盘空间中(事实上也是按需要映射到磁盘空间上,通过mmap,mmap是用来建立虚拟空间和磁盘空间的映射关系的)
优点:

  1. 既然每个进程的内存空间都是一致而且固定的(32位平台下都是4G),所以链接器在链接可执行文件时,可以设定内存地址,而不用去管这些数据最终实际内存地址,这交给内核来完成实际映射关系。
  2. 当不同的进程使用同一段代码时,比如库文件的代码,在物理内存中可以只存储一份这样的代码,不同进程只要将自己的虚拟内存映射过去就好了,这样可以节省物理内存。
  3. 在程序需要分配连续空间的时候,只需要在虚拟内存分配连续空间,由操作系统自动完成连续的虚拟物理内存地址到分散的物理内存地址的映射,这样就可以有效的利用碎片化的物理内存。

参考:https://blog.csdn.net/lvyibin890/article/details/82217193

虚拟内存和物理内存的直观理解(概念、区别与联系)相关推荐

  1. 操作系统——Linux 虚拟内存和物理内存的理解

    虚拟内存: 第一层理解 1..每个进程都有自己独立的4G内存空间,各个进程的内存空间具有类似的结构: 2.一个新进程建立的时候,将会建立起自己的内存空间,此进程的数据,代码等从磁盘拷贝到自己的进程空间 ...

  2. 虚拟内存与物理内存的区别,

    第一层理解 1.每个进程都有自己独立的4G(32位系统下)内存空间,各个进程的内存空间具有类似的结构 2.一个新进程建立的时候,将会建立起自己的内存空间,此进程的数据,代码等从磁盘拷贝到自己的进程空间 ...

  3. 虚拟内存与物理内存的联系与区别

    操作系统有虚拟内存与物理内存的概念.在很久以前,还没有虚拟内存概念的时候,程序寻址用的都是物理地址.程序能寻址的范围是有限的,这取决于CPU的地址线条数.比如在32位平台下,寻址的范围是2^32也就是 ...

  4. 详解操作系统中虚拟内存与物理内存的关系

    点击链接: 一文理解虚拟内存.物理内存.内存分配.内存管理 - 知乎 目录 一.虚拟内存与物理内存 1.1 虚拟内存 1.2 虚拟内存与物理内存 二.C/C++中虚拟内存分配模型 2.1 C语言中内存 ...

  5. python使用虚拟内存_虚拟内存、物理内存

    前一段时间在面试总监的时候,总监问了我这样的一个问题:你个我说说物理内存和虚拟内存到底是怎么一回事? 其实之前我看过这个问题,据我理解的,当时是这么回答的"进程在运行的时候,操作系统都为其分 ...

  6. Linux 内存管理 详解(虚拟内存、物理内存,进程地址空间)

    Linux -操作系统内存管理 存储系统 存储器的层次结构 Linux的内存管理 物理内存 物理内存管理 虚拟内存 虚拟地址空间 (写时拷贝) 和物理地址映射关系 页表 虚拟内存优缺点 「在 4GB ...

  7. 24|虚实结合:虚拟内存和物理内存

    24|虚实结合:虚拟内存和物理内存 你好,我是LMOS. 上一课中学习了内存地址空间,我们搞清楚了内存地址与地址空间的本质. 今天我们开始学习虚拟内存与物理内存.其实虚拟内存也好,物理内存也罢,我们从 ...

  8. 虚拟内存、物理内存/RAM 干嘛的

    原创文章,转载请注明出处. 本文记录自己理解后的虚拟内存.物理内存的作用 前言 虚拟内存 物理内存/RAM 前言 了解之前先了解几个概念 1>RAM 随机存储器=物理内存: 这是个插到电脑主机箱 ...

  9. 转载,大佬关于虚拟内存与物理内存关系讲解。

    内容来自:<0day安全:软件漏洞分析技术> 关于操作系统与组原课程中比较棘手的虚拟内存与物理内存讲解简单易懂!所以转述一下! Windows 的内存可以被分为两个层面:物理内存和虚拟内存 ...

最新文章

  1. 【数学 技巧】2.14计数
  2. js根据身份证号码判断性别和年龄
  3. 自然语言处理NLP-100例 | 第二篇:在线课程评论情感分析-本科毕设实战案例
  4. java 编写方法和属性,编写一个关于教师的JAVA-BEAN,要求实现其基本属性如年龄,性别等的get和set方法...
  5. 在ASP.NET中使用Microsoft Word文档
  6. 《程序员》2014年11月刊:电商峰值系统架构设计
  7. Java协作开发,Java开发学习笔记之八:servlet之间的协作
  8. macOS卸载Java9及利用Homebrew搭建并配置Java开发环境
  9. lvds单8转双8芯片_单片机定时芯片方案开发,2到8小时可调定时IC,低功耗触发延时芯片sop-8封装-丽晶微电子...
  10. ios沙盒机制与文件操作
  11. 数据结构算法基础定义
  12. Maven配置ojdbc14-10.2.0.4.0.jar
  13. 高斯09linux教程,Gaussian 09的安装与使用
  14. 【JavaScript】英雄联盟官网作品介绍,轮播图的实现
  15. 【博弈论-完全信息动态博弈】 扩展式博弈
  16. python K折交叉验证
  17. Aspect基础使用方法
  18. U盘快捷方式病毒查杀
  19. centos7 修改时间、时区问题
  20. 围城书评_书评:关于HTML5的真相

热门文章

  1. Linux学习整理-用户与组相关的命令-who,whoami,w,id,logname
  2. 玩蛇记--Python处理海量手机号码
  3. 跳舞机(Tango Tango Insurrection, UVa 10618)
  4. CGIC(一)——基础知识
  5. android sensors
  6. 怎样实现EDIUS中的视频快放的制作
  7. spss可以关键词词频分析吗_综合词位置因素和词频因素的文本关键词权重计算方法与流程...
  8. 快递单号查询,筛选暂存件单号归类为已签收
  9. 起点安全|信息安全、网路安全、数据安全
  10. xfs文件系统d_type=0的问题