什么是虚拟内存
虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。与没有使用虚拟内存技术的系统相比,使用这种技术的系统使得大型程序的编写变得更容易,对真正的物理内存(例如RAM)的使用也更有效率。
注意:虚拟内存不只是“用磁盘空间来扩展物理内存”的意思——这只是扩充内存级别以使其包含硬盘驱动器而已。把内存扩展到磁盘只是使用虚拟内存技术的一个结果,它的作用也可以通过覆盖或者把处于不活动状态的程序以及它们的数据全部交换到磁盘上等方式来实现。对虚拟内存的定义是基于对地址空间的重定义的,即把地址空间定义为“连续的虚拟内存地址”,以借此“欺骗”程序,使它们以为自己正在使用一大块的“连续”地址。
现代所有用于一般应用的操作系统都对普通的应用程序使用虚拟内存技术,例如字处理软件,电子制表软件,多媒体播放器等等。老一些的操作系统,如DOS和1980年代的Windows,或者那些1960年代的大型机,一般都没有虚拟内存的功能——但是Atlas,B5000和苹果公司的Lisa都是很值得注意的例外。
那些需要快速访问或者反应时间非常一致的嵌入式系统,和其他的特殊应用的计算机系统,可能会为了避免让运算结果的可预测性降低,而选择不使用虚拟内存。
Windows操作系统下虚拟内存的实现
在Windows 9x时代,例如Windows 98,用于实现虚拟内存的文件存放在系统分区的根目录下。通常是系统分区根目录下的win386.swp(具有隐藏、系统属性)。有关虚拟内存设置则存放在系统目录中的system.ini中,其中形似“PagingDrive=C:\Win386.swp”的一行就是虚拟内存文件路径、文件名的设置。
在Windows NT系列中,例如Windows XP,用于实现虚拟内存的文件则以系统分区根目录下的页面文件 pagefile.sys(具有隐藏、系统属性)形式来保存。这些文件的大小——即pagefile.sys文件大小的默认值是物理内存的1.5倍。同时,页面文件可以设置一个比平常值大的最大值,当物理内存与页面文件皆不够用时,系统会自动生成temppf.sys(意为temporary pagefile,临时页面文件)进行补足,temppf.sys的大小在页面文件的大小和最大值之间。
Linux操作系统下虚拟内存实现
在Linux操作系统支持两种形式的交换空间:交换分区和交换文件。 交换分区:在磁盘中专门分出一个磁盘分区用于交换 交换文件:创建一个文件用于交换 交换空间大小没有规定特定的值,如果物理内存较小(小于512M字节)时,一般设置为物理内存的1.5倍到2倍。
Linux支持同时使用多个交换设备,还能为它们分配给不同的优先级。当需要交换出物理内存中页时,操作系统根据优先级顺序选择可用的交换设备。如果有多个交换设备优先级相同,那么它们是按照类似level 0 RAID的方式分配使用的。如果能够并行地访问这些交换设备的话,给他们分配相同的优先级就能够使系统性能得到提供。因此,分配优先级的时候还应该特别注意一些问题。例如,在同一物理磁盘上的多个交换分区就不应该被并行地使用,而应该以访问速度从高到底的顺序使用。所以在只有一块物理磁盘的时候,设置多个交换分区,并不能提高性能,反而可能会使性能下降。
页面文件与磁盘碎片
由于虚拟内存使用了硬盘,硬盘上非连续写入的文件会产生磁盘碎片,因此一旦用于实现虚拟内存的文件或分区过于零碎,会加长硬盘的寻道时间,影响系统性能。有观点误认为Windows系统频繁读写pagefile.sys就会产生磁盘碎片,实则不然。因为pagefile.sys文件一旦创立,在分区中的分布连续形式就固定下来,文件内部读写并不增加或减少pagefile.sys的文件大小。仅当页面文件告罄后系统创建的temppf.sys会带来磁盘碎片。 而在Linux系统中,将用于虚拟内存的部分置于单独的分区中,不影响其他的分区或文件,则基本杜绝了磁盘碎片带来的影响。