虚拟内存与物理地址扩展(PAE)

 Windows的虚拟内存并非简单的指位于我们硬盘上的那个pagefile.sys文件,或者是在内存装不下的时候用于应急的“模拟内存”。事实上Windows的每一个进程都会同时用到物理内存和虚拟内存。


在Windows系统中,任何一个进程都会被赋予其自己的虚拟地址空间(虚拟内存),该虚拟地址空间可以覆盖了一个相当大的范围。对于一个32位进程,其可以拥有的地址空间为2^32=4GB,这使得一个指针可以使用从00000000h到FFFFFFFFh的4GB范围之内的任何一个值。虽然每一个32位进程可使用4GB的地址空间,但并不意味着每一个进程实际拥有4GB的物理地址空间,该地址空间仅仅是一个虚拟地址空间。此虚拟地址空间只是内存地址的一个范围,进程实际可以得到的物理内存要远小于其虚拟地址空间。进程的虚拟地址空间是为每个进程所私有的,在进程内运行的线程对内存空间的访问都被限制在调用进程之内,而不能访问属于其他进程的内存空间(比如声明这是A进程的4GB,那是B进程的4GB)。这样,在不同的进程中可以使用相同地址的指针来指向属于各自调用进程的内容而不会由此引起混乱。

  小贴士:简单说物理地址和虚拟地址是不同的两个级别的地址,尽管地址数值会重复(比如都有A0000000h),但处于不同的地址层,所以不会互相影响。

  当进程在地址空间中申请出一个“保留区域”后,并不能直接对其进行使用,必须先把物理存储器提交给该区域后,才可以访问区域中的内存地址。在提交过程中,物理存储器按页面边界和页面大小的块来进行提交。这里所说的物理存储器并不局限于计算机内存(优先使用),还包括在磁盘空间上创建的页文件(pagefile.sys),其存储空间大小为计算机内存和页文件存储容量之和(所以Windows自动管理时的pagefile.sys是很大的)。由于通常情况下磁盘存储空间要远大于内存的存储空间,因此页文件的使用对于应用程序而言相当于透明的增加了其所能使用的内存容量。在使用时,由操作系统和CPU负责对页文件进行维护和协调。只有在应用程序需要时才临时将页文件中的数据加载到内存供应用程序访问之用,在使用完毕后再从内存交换回页文件。

  进程中的线程在访问位于已提交物理存储器的保留区域的虚拟内存地址时,如果此地址指向的数据当前已存在于物理内存,CPU将直接将进程的虚拟地址映射为物理地址,并完成对数据的访问;如果此数据是存在于页文件中的,就要先将此数据从页文件加载到内存,然后在进行映射之后访问。

  说了这么多东东,无论你已经明白虚拟内存的基本知识,还是正在晕头转向,我们只需要明白内存比硬盘快,所以当一个进程的虚拟内存提交的物理存储器是物理内存时,我们就可以省去从磁盘的页文件加载数据到物理内存的时间,程序的工作效率自然就会提高。尽管我们的内存超出了32bit系统的地址结构范围,但我们只要将4GB地址以上的物理内存为虚拟内存所用就不会浪费内存了。

物理地址扩展(PAE)是早在Pentium Pro时代就有的东东,它可以提高IA32处理器应对4GB以上内存的能力。当启用 PAE之后,Windows操作系统将从两级线性地址转换变为三层地址转换,额外的一层转换用于访问超过4GB地址的物理内存,可以将超出4GB地址的物理内存映射为应用程序进程的虚拟地址空间以提升虚拟内存性能。通过PAE,我们可以完完整整的利用到被回收至4GB以上地址的那部分内存。
至于开启PAE的方法网上遍地都是,我想就不用在这里多费笔墨了。而且事实上,操作系统多数情况下会自动开启PAE,在使用多核心处理器时,无论安装多少物理内存,Windows都会因处理器需要而默认开启PAE功能。换句话说,在这个双核心处理器普及的时代我们基本上不用去考虑PAE的开启问题。


文章来自: 本站原创
Tags:
评论: 0 | 查看次数: 9386