返回「计算机、信息技术与工程」

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

更多
Markdown 结构化数据
本文目录 6 个章节

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

# 虚拟内存和物理内存的区别和联系

创建时间:2020/3/17 23:01

我如何完整的回答:

物理内存就是真实的硬件设备(比如内存条)提供的内存,虚拟内存是为了解决物理内存不足的问题,利用磁盘空间虚拟出来的一块逻辑内存。 32位平台下每个进程运行时都会得到4G的虚拟内存。它通常是被分隔成多个物理内存碎片,还有一部分存储在外部磁盘存储器上,在需要时进行数据交换。 每次我要访问地址空间上的某一个地址,都需要把地址翻译为实际物理内存地址 通过页表来记录,哪些地址空间上的数据在物理内存上,哪些不在。 如果不在就会发生缺页中断。操作系统会将硬盘里对应的页换入内存。 如果内存已经满了,就通过页面置换算法来决定把内存中的哪一块而进行换进换出。

概念

物理内存:真实的硬件设备(内存条)

虚拟内存:利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间(Swap Space)。(为了满足物理内存的不足而提出的策略)

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

为什么需要物理内存

没有虚拟内存概念的时候,程序寻址用的都是物理地址。程序能寻址的范围是有限的,这取决于CPU的地址线条数。比如在32位平台下,寻址的范围是2^32也就是4G。 每个进程运行时都会得到4G的虚拟内存

  • 内存不足,没有得到分配资源的进程就只能等待。进程频繁的装入内存的操作是很没效率的。
  • 指令都是直接访问物理内存的,那么我这个进程就可以修改其他进程的数据,甚至会修改内核地址空间的数据
  • 内存时随机分配的,所以程序运行的地址也是不正确的

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

进程访问一个地址的过程

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

虚拟内存是怎么工作的

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

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

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

利用虚拟内存机制的优点

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