【操作系统】虚拟内存的作用小结
在系统中所有的进程之间是共享CPU和主存这些内存资源的。当进程数量变多时,所需要的内存资源就会相应的增加。可能会导致部分程序没有主存空间可用。此外,由于资源是共享的,那么就有可能导致某个进程不小心写了另一个进程所使用的内存,进而导致程序运行不符合正常逻辑。为了更加有效的管理内存并少出错,现代系统提供了一种对主存的抽象的概念,叫做虚拟内存(Virtual Memory,VM)。
虚拟内存是硬件地址翻译、主存、磁盘文件和内核软件间的完美交互,他为每个进程提供了一个大的、一致的和私有的地址空间。虚拟内存提供了三个重要的能力:
1)缓存:将主存视为一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据;
2)内存管理:为每个进程提供了一致的地址空间,简化内存管理;
3)内存保护:保护了每个进程的地址空间不被其他进程破坏。
一、缓存
概念上,虚拟内存被组织为一个由存放在磁盘上的N个连续字节大小的单元组成的数组。每字节都有一个唯一的虚拟地址,作为数组的索引。磁盘上的内容被缓存在内存中。
VM系统将虚拟内存分割为大小固定的块,称为虚拟页(VP),来作为磁盘和主存之间的传输单元;每个虚拟页的大小为P=2^p字节。物理内存也被分割为物理页(PP)(也称为页帧),大小也是P字节。
虚拟页面分为三个互斥子集:
1)未分配的:VM系统还未分配(或创建的)页。未分配的块没有任何数据和它们相关联,因此也就不占用任何磁盘空间。
2)缓存的:当前已缓存在物理内存中的已分配的页。
3)未缓存的:未缓存在物理内存中的已分配的页。
二、内存管理
操作系统为每个进程提供一个独立的页表,因而也就是独立的虚拟地址空间。而VM为每个进程提供独立的地址空间。操作系统为系统中的每个进程都维护一个独立的页表。按需页面调度和独立的虚拟地址空间的结合,对系统内存的使用和管理造成了深远的影响。VM简化了加载和链接、代码和数据的共享,以及应用程序的内存分配。
(1)简化链接
独立地址空间允许每个进程的内存映像使用相同的基本格式。而不管代码和数据实际存放在物理内存的何处。例如在64位x86-64平台上,代码段总是从虚拟地址0x400000开始。数据段跟在代码段后,中间夹杂着对齐空白。栈占据用户进程地址空间的最高部分,并向下增长。这样的一致性极大地简化了链接器的设计和实现,运行链接器生成完全连接的可执行文件,这些可执行文件是独立于物理内存中代码和数据的最终位置的。
(2)简化加载
虚拟内存使得容易向内存中加载可执行文件和共享对象文件。将一组连续的虚拟页面映射到任意一个文件中的任意位置的表示法称作内存映射(memory mapping)。Linux 提供了一个 nmap 的系统调用,允许应用程序自己做内存映射。
(3)简化共享
独立地址空间为操作系统提供了一个管理用户进程和操作系统自身之间共享的一致机制。一般情况下,每个进程都有自己私有的代码、数据、堆栈。这些内容不与其他进程共享。在这种情况下,操作系统创建页表,将相应的虚拟页映射到不连续的物理页面。
(4)简化内存分配
虚拟内存向用户进程提供一个简单的分配额外内存的机制。当一个用户程序要求额外的堆空间时候,操作系统分配 k 个适当的连续的虚拟内存页面,并且将他们映射到物理内存的中的 k 个任意页面,操作系统没有必要分配 k 个连续的物理内存页面。
三、内存保护
虚拟内存大大简化了内存管理,操作系统提供独立的地址空间使得区分不同进程的私有内存变得容易,但是地址翻译机制可以使用一种自然的方式拓展到提供更好的访问控制。每次 CPU 生成一个地址时,地址翻译硬件都会读一个 PTE ,通过在 PTE 上添加一些额外的控制位来控制对一个虚拟页面内容的访问。
本文来自博客园,作者:Jcpeng_std,转载请注明原文链接:https://www.cnblogs.com/JCpeng/p/15027453.html