Windows虚拟内存简介

Windows系统中,系统内存本身的空间可能非常有限,但是通过虚拟内存(Virtual Memory),可以让程序可以拥有超过系统物理内存大小的可用内存空间。

 

顾名思义,虚拟内存是逻辑层面的划分。操作系统通过内存管理器(Memory Manager)将虚拟内存地址与物理地址进行对应。通常在系统中,虚拟内存的大小都要大于系统的实际内存大小,因此内存管理器会将一部分虚拟内存中的内容映射到磁盘中。

 

当应用访问虚拟内存地址的时候,如果内存管理器发现对应的物理地址在磁盘中时,内存管理器会将这部分信息从磁盘中加载回内存中以供应用程序访问。

 

对于32位操作系统来说,地址总线的宽度也是32位,因此内存寻址的最大寻址空间数量为232次方,即4G个地址空间,每个地址空间对应1个字节的存储单元,所以理论上32位的系统支持的虚拟内存大小最大为4GB。在这4G个虚拟内存地址中,默认情况下,Windows会将低位地址(0x00000000-0x7FFFFFFF)的这一半分配给用户进程进行使用,而将高位地址(0x80000000-0xFFFFFFFF)这一半分配给操作系统进程来使用。这个比例可以在计算机启动设置中修改,最多可以为用户进程分配3G个虚拟内存地址。

 

Windows内存分页的机制:

Windows内存地址转换主要通过一个称为页表目录的表来进行映射,在Intel x86 CPU中,页表目录的入口指针存储在寄存器CR3中,指针指向一个长度为1024×32位大小的数组(每32位对应一个虚拟地址),也就是下图中的页目录:

Windows虚拟内存简介_第1张图片

在页目录中每个虚拟地址的组成:

22 《 21 12 《 11 《 页 目 求 萦 引 0 个 可 能 值 凵 页 表 萦 引 0 个 可 能 值 凵 页 中 的 位 置 ( “ 96 个 可 能 值 凵

其中前10位用于定义页目录的索引(210次方恰好为1024),中间10位对应这一页对应的物理内存的首地址,最后12位对应数据相对于首地址的偏移量,所以上图中一个页中可以对应4096个地址,即一个页的大小为4KB

 

对于很多内存使用量很大的应用来说,2GB的可用内存空间远远不能满足需要,因此Windows提供了地址窗口扩展(AWEAddress Windowing Extension)的接口来满足更大内存分配需求的应用程序,通过AWE,应用程序可以在自己的地址空间中保存一个视图(View)或者窗口(Window),然后将物理内存与这个视图或窗口进行映射,对2GB的用户进程可占用的内存来说,最多可以为其映射64GB的物理内存。虽然AWE为程序开发者增加了负担,同时也在映射上增加了开销,但是确实为32位系统下的很多需要大内存的应用程序提供了一个可用方案。为了提高映射的效率以及增加硬件层面的支持,AWE规定了很多限制,具体可以参考https://msdn.microsoft.com/en-us/library/windows/desktop/aa366527(v=vs.85).aspx

 

相比而言,64bit的操作系统提供了更大的寻址空间,理论上64位总线应该支持264次方个地址空间,即16EB1EB=2^60B)内存,但是由于实际物理架构的限制,当前对于IA-64 CPU来说,最多可以支持7TB的虚拟内存大小,而x64可支持8TB的虚拟内存,Windows系统当前将这个值限制为8TB

 

虚拟内存的大小可以在操作系统下面的位置进行修改:

在计算机属性中找到高级设置(Advancedsystem settings),在高级选项卡中找到性能的设置,在打开的窗口中找到高级选项卡,下边就是虚拟内存的设置了:

Windows虚拟内存简介_第2张图片

 

点击修改,调整虚拟内存的值:

Windows虚拟内存简介_第3张图片

 

参考链接:

https://bbs.pediy.com/thread-135274.htm

http://blog.csdn.net/lanuage/article/details/52003700

http://book.51cto.com/art/200910/159944.htm

http://blog.csdn.net/tttt418/article/details/6113860

http://www.cnblogs.com/VIPler/p/4282584.html

https://msdn.microsoft.com/en-us/library/windows/desktop/aa366527(v=vs.85).aspx

你可能感兴趣的:(Windows,Hardware,Software)