为了更加有效地管理内存并且少出错,现代系统提供了一种对主存的抽象概念,叫做虚拟内存(VM)。
虚拟内存提供了三个重要的能力:
(1)它将主存看成是一个存储在磁盘上的地址空间的告诉缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,它高效地使用了主存
(2)它为每个进程提供了一致的地址空间,从而简化了内存管理
(3)它保护了每个进程的地址空间不被其它进程破坏
虚拟内存在工作中,不需要程序员做任何干涉,但是程序员还是需要理解它,原因如下:
(1)虚拟内存是核心的
虚拟内存遍及计算机系统的所有层面,在硬件异常、汇编器、链接器、加载器、共享对象、文件和进程的设计中扮演着重要角色。理解虚拟内存将帮助我们更好地理解系统通常是如何工作的。
(2)虚拟内存是强大的
虚拟内存给予应用程序强大的能力,可以创建和小灰内存片、将内存片映射到磁盘文件的某个部分,以及与其他进程共享内存。比如,你知道可以通过读写内存位置读或者修改一个磁盘文件的内容吗?或者可以加载一个文件到内存中,而不需要进行任何显示地复制吗?理解虚拟内存将帮助你利用它的强大功能在应用程序中添加动力
(3)虚拟内存是危险的
每次应用功能程序引用一个变量、间接引用一个指针,或者调用一个诸如 malloc 这样的动态分配程序时,它就会和虚拟内存发生交互。如果虚拟内存使用不当,应用将遇到复杂危险的与内存有关的错误。例如,一个带有错误指针的程序可以立即崩溃于“段错误”或者“保护错误”,它可能在崩溃之前还默默地运行了几个小时,或者最令人惊慌地,运行完成却产生不正确的结果。理解虚拟内存以及诸如 malloc 之类的管理虚拟内存的分配程序,可以帮助你避免这些错误。
地址空间的概念很重要,因为它清楚地区分了数据对象(字节)和它们的属性(地址)。一旦认识到了这种区别,那么我们就可以将其推广,允许每个数据对象有多个独立的地址,其中每个地址都选自一个不同的地址空间。这就是虚拟内存的基本思想。主存中的梅子姐都有一个选自虚拟地址空间的虚拟地址和一个选自物理地址空间的物理地址。
概念上而言,虚拟内存被组织为一个由放在磁盘上的 N 个连续的字节大小的单元组成的数组。梅子姐都有一个唯一的虚拟地址,作为到数组的索引。磁盘上数组的内容被缓存在主存中。和存储器层次结构中其他缓存一样,磁盘(较低层)上的数据被分隔成块,这些块作为磁盘和主存(较高层)之间的传输单元。VM 系统通过将虚拟内存分割为称为虚拟页的大小固定的块来处理这个问题。每个虚拟页的大小为 P=2^p 字节。类似地,物理内存被分割为物理页,大小也为 P 字节(物理页也成为页帧)。