理解Windows内存

王朝厨房·作者佚名  2007-01-05
宽屏版  字体: |||超大  

内存的三种主要类型

Windows内存分为三种主要类型:

物理内存

虚拟内存

线性内存

物理内存

物理内存,也叫RandomAccessMemory(RAM),是安装在小块SIMM或DIMM板上的所有RAM芯片的总量。RAM之所以叫随机存取,是因为下一位信息能用相同的时间来定位,而不管它在RAM的哪个地方。这意味着从RAM记忆中存取信息非常快。另一方面,RAM是易变的,这就是说,如果你关掉电脑或遇到电力中断,临时存储在RAM里面的信息就会丢失。

物理内存是电脑,软件和信息的快速的临时的活跃的工作场所。当你要保存信息时,RAM中的信息被拷贝到一个更长久储存形式(一个3.5英寸软盘,一个硬盘, 一个ZIP驱动器,一个磁带盒,等等)。

Windows怎样使用物理内存

物理内存是电脑的主要内存,电脑在那里临时放置信息的拷贝,因此你能地使用这些信息工作。当你启动Windows时,部分Windows软件被拷贝到内存, 因此Windows能在屏幕上显示信息,能对你在输入设备(如键盘和鼠标)上的活动作出反应。

Windows控制你的电脑的一部分物理内存,当你运行Windows应用程序时,Windows为其提供分配内存块的内存管理方案。当你使用应用程序时, 它们需要被拷贝到物理内存,你正在使用的文档部分(展开表,图象,声音,等等)也一样需要被拷贝到物理内存。例如,如果你打开一个展开表文档,Windows就拷贝展开表应用程序到RAM, 然后应用程序拷贝这个文档到RAM。如果你在展开表里重新计算数值,那么应用程序执行计算并把结果临时放在RAM里。如果你保存结果,那么应用程序从RAM拷贝信息到一个你指定的软盘或硬盘。

与内存不同,磁盘是一个更长久的存储介质,因为当驱动器的电力中断时它们包含的信息还保留着。

虚拟内存

当一个Windows应用程序需要内存时,Windows分配所谓的线性内存给应用程序。Windows依赖于有多少可用的物理内存而以物理内存或虚拟内存‘填充’一个应用程序的线性内存。虚拟内存实际上是Windows以交换文件的形式保留在你的系统硬盘上的硬盘存储空间。

在Windows3.1x中的虚拟内存

当你第一次安装Windows时,或当你在控制面板的虚拟内存对话框改变设置时,Windows就创建了虚拟内存。这部分硬盘空间之所以叫虚拟内存,是因为Windows使用这部分硬盘空间来存储没被使用的部分物理内存 (RAM)。这就允许Windows运行,存储的信息和应用程序比你的电脑的所有物理内存所能放进的更多。

这种让Windows临时和自动移动部分内存到磁盘的方法的好处是,应用程序能指望Windows供给它们所需要的内存。让Windows照顾内存管理问题, 包括虚拟内存,会给PC尽可能好的性能。

Windows95/98中的虚拟内存

在Windows95/98中,虚拟内存交换文件是动态的。这就是说,依赖于你用电脑干什么,交换文件会变大或变小。如果你使用Windows95/98, 你可能不需要如同在Windows3.1x那样选择虚拟内存设置。相反,你可以让Windows95/98的智能系统为你缺省配置虚拟内存。如果你技术先进, 在Windows95/98中你仍然可以自己配置虚拟内存,如果你喜欢的话。

线性内存

内存的三种类型中,线性内存是最难理解的。线性内存是人为的内存,它仅含糊地相关于另外两种内存类型(物理内存和虚拟内存)。

在Windows3.1x中的线性内存

当你启动Windows时,Windows通过它可用的自由物理内存(RAM)乘以4来决定线性内存(或乘以SYSTEM.INI文件的PageOverCommit设置定义的任意数值, 例如,如果这个设置是:PageOverCommit=5,那么就用5乘自由内存)。

线性内存=自由RAM′4(或PageOverCommit=#)

在这个计算中Windows使用的自由物理内存很可能少于你的RAM的总量,因为有使用常规内存和扩展内存的DOS应用程序。在Windows的运行期间, 这个数目(4乘自由RAM)就是所有Windows下运行的应用程序,甚至Windows下运行的DOS应用程序(在一个MS-DOS命令窗口)所能用的最大线性内存。

每当一个应用程序向Windows申请内存时,Windows就给它一部分线性内存范围。当Windows分配线性内存给一个应用程序时,没有物理内存被初始关联到这个线性内存范围.当应用程序实际需要使用物理内存时, Windows才智能地分配物理内存给它。

如果RAM在一个应用程序需要使用它时是可用的话,Windows就用RAM填充应用程序的线性内存范围。如果没有RAM是可用的话,Windows就搜索所有其他有RAM关联的应用程序的线性内存范围。Windows取出最长时间没使用的且分配有RAM的线性内存范围, 把RAM的内容写到虚拟内存交换文件(以备后用),然后重新分配此RAM给新的范围,把旧的较少使用的范围标记为空。如果那些放置到虚拟内存交换文件里的旧信息又被需要的话, Windows就重做这整个过程,重新分配线性内存范围到磁盘。

这个过程甚至施行到你的DOS应用程序。每次当你打开一个Windows里的DOS提示符窗口时,一个(大约)640K的线性内存块就被分配给它。然而如果你运行一个只需要使用这640K中的250K的DOS应用程序, 那么Windows只需要分配250KRAM给DOS提示符窗口。

因此物理内存是RAM,线性内存可以想象成房间。线性内存是放置Windows应用程序使用的RAM的空间。

线性内存概括

线性内存是应用程序运行的空间(或房间),而物理内存是需要时分配到此空间的能使用的建筑材料。

或者考虑另外一个比喻。当你出去度假时,你或许向旅店预订房间。当你这样做时,旅店用你的名字保留一个房间,但是只有你到达他们的前台时,房间的钥匙才会给你。如果你实际上没来的话, 旅店或许会把为你保留的房间给另一个到来的顾客用。因此旅店房间的预订的就像Windows—两者都负责分配‘房间’。当你向旅店预订房间时,这就像Windows应用程序在实际需要使用RAM前就申请RAM一样。当你在旅店的前台登记时, 这就像Windows应用程序试图访问分配给它的线性内存范围。当你登记时,旅店就从可用的房间之中选一间给你住。当Windows应用程序想访问其线性内存时, Windows就意识到并试图提供物理内存给应用程序(即给它RAM房间的钥匙)去处理眼前的任务。

Windows95/98中的线性内存

在Windows95/98中的线性内存模式由三部分组成而不是一部分。原来在Widows3.1x中的线性内存区域现在叫做系统区域。另外加入两个内存区域:

私有内存区域,Windows32位应用程序就在这里运行

共享内存区域,内存映射文件驻留在这里,Windows32位应用程序相互之间在这里共享信息,Windows32位应用程序与Windows 16位应用程序也在这里共享信息。

不必担心Windows95/98提供三个线性内存范围而不是一个。线性内存仍然只是房间—在Windows95/98中只是有更多的房间,并且没有必要设置PageOverCommit, 因为Windows95/98能动态地生成它的线性内存地址范围,几乎高达386处理器结构的完全4GB(gigabyte)容量。这意味着Windows 95/98不会用完线性内存。因此如果你使用Windows95/98,你不必担心线性内存的使用。它仍然只是房间,只有当Windows分配物理内存(RAM) 给线性内存的一段范围时它才能使用。如果你用完了RAM,你仍然需要保存某些RAM中的东西到磁盘(即你应该保存自你最后一次保存后做过改动的文档)。一当你保存了这些改动, Windows就能使用RAM去填充某些另外的房间。

内存映射文件

内存映射文件的概念简单而优美。一个内存映射文件只是一个文件,它的整个长度已经被分配了线性内存(房间)。当一个应用程序访问分配到此文件的任意一部分线性内存时, 此文件的相应部分被读入内存,而RAM被放在这个应用程序访问的线性内存地址。

如果需要RAM的话,Windows能分辨这个文件区域是否被改动,如果没改动的话,它能完全扔掉RAM的内容,它知道信息仍然存储在磁盘上。如果文件区域已经被改动的话, 那么在RAM被重新使用之前RAM的内容被写到这个文件。对于应用程序文件,这使得事情简单了。Windows仅仅分配线性内存给整个应用程序,然后开始执行它。当应用程序的各个部分被需要时, 它们就被装进RAM。当应用程序的一个部分一段时间不曾被用到时,这个部分能被丢弃,而需要到时候能被重新装载。

什么是自由内存

Windows3.1x程序管理器显示一个叫做自由内存的数值。要看这个数值,你可以从程序管理器中的帮助菜单选择AboutWindows。不幸的是, 自由内存的数量与我们前面讨论的东西并不直接相关。自由内存大约是以下内存的和:

可使用的物理内存

虚拟内存交换文件的没使用部分

可弃内存

一些Windows应用程序需要它们分配(或预订)的线性内存(或房间)即时与物理内存关联。它们或许还需要给它们的物理内存永远不被交换到虚拟内存交换文件。这通常是为了性能的原因,有时是因为内存的内容被即时用于处理一些外部事件。例如,如果你通过modem连接到一个在线服务,例如你的因特网服务提供商(ISP),你不会希望这部分处理通信的程序交换到磁盘。如果这发生了,把磁盘读回物理内存或许会用很长时间,在这期间一些信息或许会丢失。

锁定内存

为了防止类似上述的问题,例如时间敏感的信息被意外地丢失或延迟,Windows允许应用程序锁定线性内存的范围。这迫使物理内存(RAM)即时关联到线性内存范围,并防止线性内存范围被交换到虚拟内存交换文件(房间被锁住了,所以RAM不能走出),即使物理内存没被使用一些时间。当你退出一个锁定了一段线性内存范围的应用程序时,或者当应用程序认为它合适的任何时候,应用程序能释放线性内存。

可弃内存

Windows3.1x和Windows95/98应用程序被分为多个叫做段的小部分。组成一个Windows应用程序的各个段的大小和内容是不同的,它们主要被开发这个程序的程序员指定了。

为了给286系统提供内存管理,也为了处理没有足够磁盘空间给虚拟内存交换文件的情况,Windows使用下面辅助的内存管理方案:

当Windows应用程序开发时,作为开发过程的一部分,程序员必须指出,是否组成Windows应用程序的每一个段是可弃的。当Windows用完了物理内存和交换文件中可用的虚拟内存时, Windows就搜索标记为可弃的应用程序段。然后被这些可弃段占用的线性内存范围就被完全释放,而线性内存段的内容就被丢弃了。

当Windows决定丢弃什么段时,它不考虑一个段是不是‘最长时间没使用’。而且即使Windows仅仅需要附加4K内存,它也丢弃整个段(这个段或者有64K大)。当可弃段的内容又被需要时, 它们被从包含整个应用程序的.EXE或.DLL文件中重新装载。因为Windows不考虑可弃段被重新需要的可能性,可弃段不久又被需要的可能性增加了。

不管你使用哪个版本的Windows,你都想避免这种情况。这就是说,如果Windows不必通过丢弃段且重新分配内存来得到物理内存或虚拟内存的话,这是最好的。例如,我们假定一个应用程序处理About对话框的那个部分(段)在应用程序文件中被标记为可弃。当Windows用完了其他类型的内存,它就完全丢弃这个段。如果你又想访问About对话框, Windows就通过分配一些新的线性内存来重建这个段,并且从磁盘上的应用程序文件中把这个段读回线性内存。当然,读回这个段需要物理内存关联到容纳这个段的线性内存范围。如果没有足够可用的物理内存,一些别的段首先要被丢弃。

因此,粗略地说,程序管理器的自由内存的数值是以下的总和:

可使用的物理内存

可用的虚拟内存交换文件空间

装载在内存中的所有可弃段的总和

远在你运行自由内存到一个危险的低水平前,Windows系统就将变得不稳定。系统被装载和释放段,交换和不交换虚拟内存弄得如此之慢,以致它要用所有处理时间去访问磁盘, 改写内存。

Windows3.1x中的可弃内存

如果你使用Windows3.1x,线性内存更多可能性被用完,导致Windows丢弃段并重新分配内存。如果这发生了,你可以增加虚拟内存交换文件的大小, 增加SYSTEM.INI文件中PageOverCommit=#的设置。

Windows95/98中的可弃内存

如果你使用Windows95/98,线性内存不会被用完,因此你或许永远不会遭遇这种情况。如果Windows95/98真地开始丢弃段,你应该释放Windows分区的空间。

整体DOS内存

Windows内存的最后一个方面是被称为‘整体DOS内存’的区域。它的正式叫法是常规内存,实际上它就是你系统的第一兆内存。

这个内存十分重要,因为Windows设计了向后兼容性(运行旧DOS程序和驱动程序的能力)。为了保持与DOS和DOS程序的兼容性,Windows使用第一兆内存作为DOS通信区域, 在第一兆内存放置DOS需要的关键结构,以及与DOS驱动程序和系统BIOS(基本输入/输出系统)通信需要的各种缓存。

不幸的是,整体DOS内存(第一兆内存)变得相当拥挤,部分原因是Windows倾向于把实际上不需要放在第一兆内存的东西放在那里。

整体堆和局部堆

Windows由三部分组成:

核心是负责Windows程序多任务的程序

用户是负责管理窗口,按钮,控制和菜单的程序

GDI是负责在你的屏幕或打印机上画图的程序

己经被核心分配的所有线性内存叫做整体堆。堆只是意味着线性内存的一个堆,即一个大房间。简单地说,整体堆是被Windows核心管理着的线性内存区域。应用程序为了自身的使用而叫核心分配部分线性内存。

当Windows3.1x或Windows95/98中的16位应用程序启动时,它们都自动地被分配整体堆的64K段。这些段之所以是64K,是因为这就是一个16位应用程序能常规访问的最大量内存。小于64K的段 和其他Windows应用程序分配的相似于64K的内存段,叫做局部堆。

概括起来,就Windows应用程序而言,整体堆是所有线性内存。局部堆是整体堆的小于64K的段,它们分配给各个Windows应用程序使用。

资源

资源只是你能使用的对象。为了管理出现在你屏幕上的各种对象,用户和GDI程序维持关于那些对象的各种信息。例如,对于在你屏幕上的每个按钮,Windows用户程序必须知道:

按钮应该定位在屏幕上的什么地方

什么应用程序拥有这个按钮

当你点击这个按钮时应用程序的哪个部分必须被通知

关于用户和GDI程序管理的各种对象的信息被保存在六个称为资源堆的64K段里。这些区域实际上是64K局部堆。这些区域之所以是64K,是因为这是16位应用程序能有效处理的最大数量。用户和GDI是16位程序, 因为Windows原本被设计来运行在Intel8088和80286,16位处理器上的。

用户资源堆

用户资源堆分为:

包含关于窗口和控制信息的窗口堆

包含关于下拉菜单信息的菜单堆

包含出现在菜单中的文本信息的菜单字符串堆

包含大多数窗口题目的用户原子堆

GDI资源堆

GDI资源堆分为:

包含笔,刷,字体和各种其他关于显示图形的信息的主要GDI资源堆

包含一些有关字体信息,包括字体名称的GDI原子堆。

自由系统资源

当你从Windows程序管理器的帮助菜单选择About命令时,它显示一个自由系统资源数目。这个数目显示资源堆(不包括原子堆)的最低自由百分数。这个自由百分数是用特定堆的可用空间除以64K计算出来的。

显示用户和GDI数目的应用程序实际上是显示在主要GDI资源堆中自由空间的百分数,以及三个主要用户资源堆的最低自由百分数。

应用程序资源

最后还有应用程序资源。这些完全与系统资源无关。应用程序资源只是静态的,不变的数据项,它们作为应用程序的.EXE象的一部分保存。图标,位图,字符串和字体被作为应用程序资源保存, 并当需要时被装入内存。

如果一个应用程序资源必须被系统使用,那么当它被装入内存时,它就从应用程序资源转变为系统资源。例如一个应用程序图标是一个应用程序资源当它没被装入内存时, 当它需要被显示在桌面上时,这个图标成为一个系统资源。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有