为什么 Linux 需要虚拟内存

概述


虚拟内存是操作系统物理内存和进程之间的中间层,它为进程隐藏了物理内存这一概念,为进程提供了更加简洁和易用的接口以及更加复杂的功能。
8 虚拟内存技术 - 图1

它为每个进程提供了一个非常大的一致的私有的 地址空间。
操作系统的虚拟内存作为一个抽象层,起到了以下三个非常关键的作用:

  • 虚拟内存可以**利用磁盘起到缓存的作用提高进程访问磁盘的速度**;
  • 虚拟内存可以为**进程提供独立的内存空间,简化程序的链接、加载过程并通过动态库共享内存**;
  • 虚拟内存可以**控制进程对物理内存的访问,隔离不同进程的访问权限,提高系统的安全性**;

总结:

虚拟内存的设计方法是软件工程中的常见手段,通过结合磁盘和内存各自的优势,利用中间层对资源进行更合理地调度充分提高资源的利用率并提供和谐以及统一的抽象,而在实际的业务场景中,类似的缓存逻辑也比较常见。

Linux操作系统中为什么需要虚拟内存

  • 虚拟内存可以结合磁盘和物理内存的优势为进程提供看起来速度够快并且容量足够大的存储 (缓存)
  • 虚拟内存可以为进程提供独立的内存空间并引入多层的页表结构将虚拟内存翻译成物理内存进程之间可以共享物理内存减少开销,也能简化程序的链接、装载以及内存分配过程
  • 虚拟内存可以控制进程对物理内存的访问隔离不同进程的访问权限提高系统的安全性

缓存


我们可以将虚拟内存看作是在磁盘上一片空间,当这片空间中的一部分访问比较频繁时,该部分数据会以页为单位被缓存到主存中以加速CPU访问数据的性能,虚拟内存利用空间较大的磁盘存储作为“内存”并使用主存储缓存进行加速,让上层认为操作系统的内存很大而且很快,然后区域很大的磁盘并不快,而很快的内存也并不大
8 虚拟内存技术 - 图2
虚拟内存中的虚拟页(Virtual Page)可能处于以下三种状态——
未分配(unallocated)未缓存(uncached)已缓存(cached)
其中未分配的内存页是没有被进程申请使用的,也就是空闲的虚拟内存,不占用虚拟内存磁盘的任何空间。
未缓存已缓存的内存也分别标识仅加载到磁盘中的内存页和已加载到主存中的内存页。
如上图所示,绿色的虚拟内存页由主存中的物理内存页(Physical Page,PP)支撑,所以它是已经缓存过的,而黄色的虚拟内存页仅在磁盘中,所以没有被物理内存缓存。

当用户程序访问未被缓存的虚拟页时,硬件就会触发缺页中断(Page Fault),在部分情况下,被访问的页面已经加载到了物理内存中,但是用户程序的页表(Page Table)并不存在该对应关系,这个时候我们需要在页表中建立虚拟内存到物理内存的关系;在其他情况下,操作系统需要将磁盘上未被缓存的虚拟页加载到物理内存中。
8 虚拟内存技术 - 图3
因为主内存的空间是有限的,当主内存中不包含可以使用的空间时,操作系统会从选择合适的物理内存页驱逐回磁盘,为新的内存页让出位置,选择待驱逐页的过程在操作系统中叫做页面替换(Page Replacement)。缺页中断和页面替换技术都是操作系统调页算法的一部分,该算法的目的就是充分利用内存资源作为磁盘的缓存以提高程序的运行效率。

内存管理


虚拟内存可以为正在运行的进程提供独立的内存空间,制造一种每个进程的内存都是独立的假象。
**8 虚拟内存技术 - 图4
内存虚拟空间只是操作系统中的逻辑结构,应用程序最终还是需要访问物理内存或者磁盘上的内容。因为操作系统加了一个虚拟内存的中间层,所以我们页需要为进程实现地址翻译器,实现从虚拟地址到物理地址的转换,页表是虚拟内存系统中的重要数据结构,每一个进程的页表中都存储了从虚拟内存到物理内存页的映射关系。