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

Nerazzur Nerazzur     2022-10-24     156

关键词:

操作系统有虚拟内存与物理内存的概念。在很久以前,还没有虚拟内存概念的时候,程序寻址用的都是物理地址。程序能寻址的范围是有限的,这取决于CPU的地址线条数。比如在32位平台下,寻址的范围是2^32也就是4G。并且这是固定的,如果没有虚拟内存,且每次开启一个进程都给4G的物理内存,就可能会出现很多问题:

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

于是针对上面会出现的各种问题,虚拟内存就出来了。

在之前一篇文章中进程分配资源介绍过一个进程运行时都会得到4G的虚拟内存。这个虚拟内存你可以认为,每个进程都认为自己拥有4G的空间,这只是每个进程认为的,但是实际上,在虚拟内存对应的物理内存上,可能只对应的一点点的物理内存,实际用了多少内存,就会对应多少物理内存。

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

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

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

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

页表的工作原理如下图:

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

 

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

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

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

利用虚拟内存机制的优点 

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

————————————————
版权声明:本文为CSDN博主「TLpigff」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lvyibin890/article/details/82217193

电脑物理内存与虚拟内存的区别与关系

...认为是可以看到见,摸得到的东西。我们常听说的“虚拟内存”和“物理内存”是不能混为一谈的。我们主要从以下方面进行探讨。物理内存是真正的内存,在应用中顾名思义,物理上,真实的插在板子上的内存... 查看详情

(转)虚拟内存与内存映射文件区别与联系

  虚拟内存与内存映射文件是操作系统内存管理的重要部分,二者有相似也有不同的地方,本文是作者学习与应用中得到的一些体会,有错误的地方,请提点。二者的联系:虚拟内存与内存映射文件都是将一部分内容加载的内... 查看详情

嵌入式软件开发杂谈:linux下内存与虚拟内存

参考链接:虚拟内存与物理内存的联系与区别Linux虚拟地址和物理地址的映射Linux虚拟内存和物理内存的理解简单记录下了解的内存与虚拟的关系。总结:1.每个进程有4G的虚拟内存空间,分为3G的用户空间和1G的内核空... 查看详情

嵌入式软件开发杂谈:linux下内存与虚拟内存

参考链接:虚拟内存与物理内存的联系与区别Linux虚拟地址和物理地址的映射Linux虚拟内存和物理内存的理解简单记录下了解的内存与虚拟的关系。总结:1.每个进程有4G的虚拟内存空间,分为3G的用户空间和1G的内核空... 查看详情

虚拟内存与物理内存的区别

第一层理解      1.每个进程都有自己独立的4G(32位系统下)内存空间,各个进程的内存空间具有类似的结构       2.一个新进程建立的时候,将会建立起自己的内存空间,此进程的数... 查看详情

电脑物理内存与虚拟内存的区别与关系

...认为是可以看到见,摸得到的东西。我们常听说的“虚拟内存”和“物理内存”是不能混为一谈的。我们主要从以下方面进行探讨。物理内存是真正的内存,在应用中顾名思义,物理上,真实的插在板子上的内存... 查看详情

内存映射文件原理探索

首先说说这篇文章要解决什么问题?1.虚拟内存与内存映射文件的区别与联系.2.内存映射文件的原理.3.内存映射文件的效率.4.传统IO和内存映射效率对比.虚拟内存与内存映射文件的区别与联系 二者的联系虚拟内存和内存映射文件... 查看详情

内存映射文件原理探索

首先说说这篇文章要解决什么问题? 1.虚拟内存与内存映射文件的区别与联系. 2.内存映射文件的原理. 3.内存映射文件的效率. 4.传统IO和内存映射效率对比.虚拟内存与内存映射文件的区别与联系二者的联系虚拟内存... 查看详情

硬盘与内存的区别和联系

(1)硬盘与内存的区别和联系    硬盘与内存都是存储器,一个是内部,一个是外部。    硬盘与内存的区别是很大的,这里只谈最主要的三点:一、内存是计算机的工作场所,硬盘用来存放暂时不用的信息。二、内存是... 查看详情

linux操作系统原理—虚拟内存管理

目录文章目录目录虚拟内存技术页式内存管理技术x86_32CPU虚拟内存虚拟地址格式与内核页表虚拟内存空间KernelSpaceUserSpacex86_64CPU虚拟内存虚拟地址格式与内核页表(四级页表)虚拟内存空间TLB缓冲(快表)进程页表虚拟内存技术... 查看详情

win3内存管理之私有内存跟共享内存的申请与释放(代码片段)

...内存简介私有内存申请  通过上一篇文章.我们理解了虚拟内存与物理内存的区别.那么我们有API事专门申请虚拟内存与物理内存的.有私有内存跟共享内存.私有内存的意思就是这块内存申请只在本进程的物理页当中.共享内存就... 查看详情

虚拟地址与物理地址的映射

...MSM,即多核共享内存或DDR)时。CPU所訪问的32位地址就是虚拟地址了。在訪问达到外部内存之前。corePac中的XMC模块就会将32位的虚拟地址映射(由16对MAPAX寄存器( 查看详情

虚拟内存和物理内存有啥区别?

】虚拟内存和物理内存有啥区别?【英文标题】:Whatarethedifferencesbetweenvirtualmemoryandphysicalmemory?虚拟内存和物理内存有什么区别?【发布时间】:2012-12-3002:39:18【问题描述】:我经常对操作系统中的虚拟化概念感到困惑。将RAM视... 查看详情

linux下内存空间分配物理地址与虚拟地址映射

​一、Linux内核动态内存分配与释放​1.1kmalloc函数​Kmalloc分配的是连续的物理地址空间。如果需要连续的物理页,可以使用此函数,这是内核中内存分配的常用方式,也是大多数情况下应该使用的内存分配方式。​传递给函数... 查看详情

虚拟地址与物理地址之间的关系

MMU 请点评 现代操作系统普遍采用虚拟内存管理(VirtualMemoryManagement)机制,这需要处理器中的MMU(MemoryManagementUnit,内存管理单元)提供支持,本节简要介绍MMU的作用。首先引入两个概念,虚拟地址和物理地址。如果处... 查看详情

memory内存与swap内存之小解

  计算机内存分为物理内存与虚拟内存,这两个内存分别对应memory内存与swap内存memory内存:机器的物理内存,由RAM芯片组成,读写速度低于CPU一个量级,但是高于磁盘一个量级,也就是CPU>memory>磁盘swap内存:由磁盘代替... 查看详情

linux中物理内存和虚拟内存

参考技术Avmstat是VirtualMeomoryStatistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监控。他是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。vmstat工具提供了一种低开销的系统... 查看详情

tlb与内存寻址,内存读取,虚拟内存的相关原理

...okasideBuffer)转换检测缓冲区是一个内存管理单元,用于改进虚拟地址到物理地址转换速度的缓存。TLB是一个小的,虚拟寻址的缓存,其中每一行都保存着一个由单个PTE(PageTableEntry,页表项)组成的块。如果没有TLB,则每次取数据都需... 查看详情