虚拟存储器

为了更加有效地管理存储器并且少出错,现在系统提供了一种对主存的出想概念,叫做虚拟存储器。虚拟存储器是硬件异常、硬件地址翻译、主存、磁盘文件和内核文件的完美交互。它为每个进程提供了一个大的、一致的、私有地址空间,通过一个很清晰的机制,虚拟存储器提供了三个重要的能力:它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,它高效地使用了主存;它为每个进程提供了一致的地址空间,从而简化了存储器管理理;;它保护了每个进程的地址空间不被其他进程破坏。


概念上而言,虚拟存储器被组织为一个由存放在磁盘上的N个连续的字节大小的单元组成的数组。每字节都有一个惟一的虚拟地址,这个惟一的虚拟地址是作为到数组的索引的。磁盘上数组的内容被存放在主存中。和存储器层次结构中其他缓存一样,磁盘(较低层)上的数据被分割成块,这些块作为磁盘和主存(较高层)之间的传输单元,VM系统通过将虚拟存储器分割为成为虚拟页(virtual page VP)的大小固定的块,来处理这个问题。每个虚拟页的到小为P字节,类似的,物理存储器也被分割为物理页,大小也为P字节。


虚拟页面的集合都分为三个不相交的子集:

1.未分配的:VM系统还未分配(或者创建)的页。未分配的块没有任何数据和它们相关联,因此也就不占用任何磁盘空间

2.缓存的:当前缓存在物理存储器中的已分配页

3.未缓存的:没有缓存在物理存储器中的已分配页

虚拟存储器_第1张图片



页表

同任何缓存一样,虚拟存储器系统必须有某种方法判断一个虚拟页是否存放在DRAM中的某个地方。如果是,系统还必须确定这个虚拟页存放在哪个物理页中。如果不命中,系统必须判断这个虚拟页存放在磁盘的哪个位置,在物理存储器中选择一个牺牲页,并将虚拟页从磁盘中拷贝到DRAM中,替换这个牺牲页

这些功能是由许多软硬件联合提供的,包括:操作系统软件,MMU(存储器管理单元)中的地址翻译硬件,和一个存放在物理存储器中叫做页表(page table)的数据结构。页表将虚拟页映射到物理页。每次地址翻译硬件将一个虚拟地址转换为物理地址时,都会读取页表,操作系统负责维护页表的内容。以及在磁盘与DRAM之间来回传送页

页命中

虚拟存储器_第2张图片

Linux系统为每个进程维持了一个单独的虚拟地址空间

简化链接       独立的地址空间允许每个进程为它的存储器映像使用相同的基本格式,而不管代码和数据实际存放在物理存储器的何处

简化共享       独立地址空间为操作系统提供了一个管理用户进程和操作系统自身之间共享的一致机制。

简化存储器分配      虚拟存储器为向用户进程提供一个简单的分配额外存储器的机制

简化加载       虚拟存储器也使加载可执行文件和已共享目标文件到存储器更容易

虚拟存储器_第3张图片


动态存储器分配

虽然可以使用mmap与munmap函数来创建和删除虚拟存储器的区域,但是大多数C程序还是会在运行时需要额外虚拟存储器时,使用一种动态存储器分配器

显式分配器:要求应用显式地释放任何已分配的块   malloc free

隐式分配器:要求分配器检测何时一个已分配块不再被程序使用,然后就释放这个块。隐式分配器也叫做垃圾收集器。例如Java等高级语言中的实现



你可能感兴趣的:(虚拟存储器)