技术开发 频道

精心定制Win XPe系统 打破内存占用魔咒

【Windows嵌入式有奖征文系列】

  【IT168 专稿】
嵌入式系统的内存是宝贵的,内存是否高效率的使用往往意味着嵌入式设备是否高质量和高性能。在我所负责的一个基于Windows XPe平台的嵌入式项目开发中,经常发现当Windows XPe的内存占用超过一定范围时,系统就会出现莫名其妙的问题。例如会发现计算机速度慢了,还有就是鼠标不起作用,或很多程序打不开,或者打开时提示内存不足。如果不理会的话,过不了多久嵌入式设备就会无法操作,甚至出现系统关不了机,就象是死机一样。

  为什么会出现这种情况呢?经过几个晚上通宵达旦的加班分析和研究,原来主因是系统内存不足导致速度缓慢,但明明我的嵌入式设备已经配备足够多的内存。换句话说,就是系统发生了内存占用,而过多的内存占用使系统资源僧多粥少。这也是最让许多嵌入式设备开发者头痛的事情。本文与大家分享我在 Windows XP Embedded 设备上减小内存占用的做法和经验。


  1.什么是Windows XPe内存占用?

  (1)什么是Windows XP内存占用?

  现在我们已经进行了大内存时代,很多开发者把内存升级到了G级别后就以为能解决内存不足的问题。但实际上随着操作系统功能的加强,对内存资源的占有率也是越来越高。其中最常见的就是当我们在Windows XP中纵横驰骋时,却经常会遇到“内存不足”的错误提示信息,使到程序不能运行或完成所需操作。深究其根源,原因是Windows XP中加入了很多崭新的功能,这些功能也是内存里最大块头的“演员”,他们占据了大部分内存。

  正所谓:请神容易送神难,不幸的是当他们的表演结束后却经常会不肯主动退出舞台,结果就使到余下可使用的有效内存就变得很少了,程序运行自然就变得很慢很慢了。因此,Windows XP内存占用是系统的一个严重弊病,也是众多XP系统开发者心中的痛。

  (2)Windows XPe也会有内存占用情况吗?

  Windows XP Embedded 与 Windows XP基本上是一样的,都包含 10,000 多个独立的功能组件。但Windows XP Embedded 的优势是目标操作系统可以通过删除不必要的 Windows XP 组件来减少组件的内存占用。Windows XP Embedded 允许OEM制造商创建一个具有较小内存占用量和具有特定功能的目标操作系统。这样OEM制造商就可以通过删除操作系统中不必要的组件或驱动程序,一是降低安装和软件构建复杂性,二是减少组件的内存占用量,最终增加操作系统的坚固性。

  简而言之,Windows XP Embedded 是Windows XP的一种有着灵活定制能力的特殊版本。其核心同Windows XP 是相同的,组件上的差异也较少,主要区别在于其组件具有高度可定制性。XPe允许开发人员在自定义设备映像中根据不同性能与服务只选择需要的特性来构建定制、小内存体积占用的设备。

  因此,Windows XP Embedded组件所占用的内存空间会根据所选择的不同组件而有所不同,最小配置的内存占用体积可从5 MB开始。然后随着配置的特性和服务的增加,组件所占用的内存空间也随之增加。但由于嵌入式设备内存容量一般不大,所以基于Windows XPe的嵌入式设备的内存占用问题仍然不容忽视。

  2.Windows XPe内存占用的原因分析

  (1)启动过多无用的组件和驱动程序

  嵌入式系统在启动时一般需要三个基本元素:引导工具BootLoader,内核的内存管理和程序管理、初始化进程等。如果要它成为完整的操作系统,还得加上硬件驱动程序、硬件接口程序和应用程序组。因此,即使在一个简单的嵌入式系统里,当系统启动后内核和许多加载的组件或驱动程序都会在内存里,而这些暂时不需要使用到的组件或驱动程序就成了请神容易送神难的内存占用“神仙”了。这是大多数嵌入式系统的工作模式,它同样被XPE所支持。

  幸运的是XPE还有一种超强能力,就是有能力通过“加载”和“卸载”程序来大大节省内存。对嵌入式开发者而言,内核是通常要常驻在内存中,一般应用组件或驱动程序在启动结束后就应该要结束进程以释放内存。但如果这种动态的、根据需要才加载的组件程序在初始化系统引导后没有被释放的话,就会占用嵌入式系统宝贵的内存。因此,如果Windows在启动时过多加载无用的组件和驱动程序,或在启动后没有卸载暂时不用的组件和驱动程序,内存占用就不可避免了。

  (2)运行的程序太多,没有关闭不需用的程序

  运行的程序太多,耗用的内存当然也就越多,严重时就会引起内存资源的枯竭。这分为两种情况,一是在启动Windows XPe后,用户运行的并发程序太多,引发内存不足从而没有足够的内存运行其它程序或在程序中完成某一操作。另一种情况是在启动Windows时自动运行的程序太多,如果在启动Windows时自动运行的程序太多,那么即使重新启动计算机,也将没有足够的内存用于运行其它程序。

  (3)没有应用Windows虚拟内存

  内存在计算机中的作用很大,嵌入式设备中所有运行的程序都需要经过内存来执行。如果执行的程序很大或很多,就会导致内存消耗殆尽。为了解决这个问题,Windows中运用了虚拟内存技术,即拿出一部分硬盘空间来充当内存使用。当内存不够用时,系统就会自动调用硬盘空闲空间来充当内存,以缓解内存的紧张。

  因此,XPE这种神奇的能力能使应用程序有更多的内存可供使用。虚拟内存设置主要有两点,即虚拟内存大小和分页位置。内存大小就是设置虚拟内存最小和最大为多少,而分页位置则是设置虚拟内存应使用那个分区中的硬盘空间。因此,如果系统没有正确设置和应用Windows虚拟内存,或硬盘空闲空间容量不足够的话,则可能会使XPE系统无法正常工作,或可能经常收到“内存不足”的消息,或在运行某程序时出现假死机的错误消息。

  (4)临时文件占用太多的内存

  临时文件是内存中的一块临时区域,用以存放从程序复制来的对象(如文本、数据或图形)。倘若嵌入式开发者的设计思路和程序实现需要使用大量的临时文件,而无用的临时文件又保留过多的话,内存空间就会被大量占用,那么可供正常程序运行的内存容量将非常有限。因此,及时清除无用的临时文件是嵌入式开发很重要的设计行动之一。

  (5)内存碎片和内存丢失

  众所周知,在Windows中驻留内存中的数据越多,就会占用越多的内存资源。而且在长时间地使用计算机后,内存中的数据排列就可能因为混乱而导致系统性能下降。因此,在嵌入式系统中执行时间较长的程序时,尽管可分配的内存总量并未超出总的可用内存总数,但内存碎片也可能会导致系统的内存枯竭。

  另一方面,内存丢失也是一个不可忽视的问题。具体地说,内存丢失是因为应用程序的缺陷而导致一块已经分配但永远不会被释放的内存区。对于将会在某时刻能退出的桌面应用程序,较小的内存丢失是可以承受的,因为退出进程时将会把占用的内存空间返还给操作系统。但对于长时间运行的嵌入式系统来说,积少成多的内存丢失和内存碎片往往会成为其致命伤。

  3.Windows XPe内存占用最小化的策略

  在嵌入式系统中内存是如此的宝贵,因此在开发中许多工程师常常会受困于内存占用问题。在嵌入式设备开发中,如何使到内存占用最小化是每个开发者都梦寐以求的事情。一般有以下几个方法值得借鉴:

  (1)以最小化来定制每一个组件

  要尝试减小内存占用,就要竭力避免出现组件膨胀的情况,也就是要使组件体积尽可能的小。在Windows XP Embedded中,我们可以删除许多占用大量内存的组件所依赖的特定相关组件。幸运的是,根据设备不同的特性和服务需求,在通常情况下我们都可以找到一两个不需要的关联依赖项,而当我们着手删除组件中的关联依赖项后就会发现组件体积变得小多了。这些组件包括:Explore外壳程序、Internet Explorer、.NET框架等。因此,要定制占用内存最小化的系统,最好的方法是根据实际需求,定制每一个组件以减少组件体积。

  (2)以最小化组件配置来定制系统

  在启动Windows XP Embedded 时,我们会看到系统启动时非常慢。原因是内核在启动时会有许多静态和延迟加载依赖项,尤其是各种安全性 DLL,但无疑这些加载项会占用内存。因此,要想减小内存占用的首要规则是尽量以最小化组件配置来定制系统。但事实上,减小内存占用最复杂且最难成功是我们在定制内核的时候,为了内核系统的稳定性和壮健性常常会给内核添加一些没有什么用的组件和驱动。例如设备上的外壳程序或启动时的界面等。

  当我们着手删除许多对启动无关的组件配置项后,只根据需要的配置来生成和启动内核。我们就会发现实际上内核映像还是能够启动,并且最可贵的是这时运行的内核是以很小规模的内存占用来启动的。因此,使内存占用变得更小的一个重要窍门,是在设备能正常启动和应用的情况下,以最少数量的组件和驱动来定制系统。

  (3)以最小化来加载设备驱动负载

  从前面的内存占用原因分析可知,内存占用较小是因为着运行时加载较少的驱动程序、设备和服务,而内存占用较少就意味着我们的应用程序将可以使用更多的内存资源。因此,如果只需要加载一个而不是两个设备驱动负载的话,就尽可能的只加载一个设备负载。因为加载和初始化驱动程序是需要消耗更多的内存占用和系统资源。

0
相关文章