技术开发 频道

软硬结合 巧妙平衡WinCE内存成本和效能

  (2)应用内存碎片整理技术

  在一个嵌入式系统中,连续的页面请求可能会带来性能的下降。这是由于在小对象(小于1 KB的数据类型)对内存的频繁的动态申请和释放过程中,由于释放后留下的空洞不够新对象分配,导致不连续的内存可用空间无法被应用程序获得,从而造成可用内存迅速耗尽。这种内存空洞也叫内存碎片。操作系统可能会对这种情况作一定程度的优化,但是由于将内存可用空间整理而导致的效率负担,并不是所有的操作系统都会对此优化。

  不同于Windows XP,WinCE只支持在堆中分配固定(fixed)的块。这简化了内存块在堆中的处理,但是这使得堆在分配和释放一段时间后会产生碎片。当堆里已经清空的时候,仍然会占用大量的虚拟内存页,因为系统不能在堆中内存页没有完全释放的时候回收这些页。一般来说,得益于WinCE操作系统本身优化的内存管理和高度受限的内存使用原则,内存碎片其实并不会对系统的性能和内存使用率造成明显影响。但随着嵌入式设备的内存容量变得越来越大,内存的能耗也是不容忽视的。在WinCE中,虽然不存在自动内存碎片处理,但是微软推荐使用VirtualAlloc、LocalAlloc、HeapAlloc等函数直接操作虚拟内存页,或对本地堆和分离堆进行内存分配操作,而不是使用如malloc、new这类会导致内存泄漏或异常的操作。因此,借助内存碎片整理技术可以关闭连续的空闲物理内存块以节约能耗,从而获得更高的内存访问效能和更大的可用内存。

  (3)应用按需页面调度技术

  一种节约物理内存使用的有效方法是:只加载当前运行程序使用的虚拟内存所对应的物理内存,这种方法称为按需页面调度。当一个进程试图访问一个不在当前内存中的虚拟内存地址时,系统这时会重新从磁盘上将该区域加载到内存中去。PC桌面操作系统一直以来都使用这一技术来加快系统启动速度和优化程序运行效率,WinCE也不例外。在WinCE中,可以通过使用Config.bib对整个系统的按需页面调度进行设置,或通过LoadDriver等函数对单个DLL的按需页面调度进行设置。这一调度技术优化了内存的使用效能,它只在需要加载时才去读代码,从而实现了对RAM的更高使用效率。

  (4)实时监控物理内存使用情况

  系统的内存不管有多大,总是会用完的。虽然有虚拟内存,但由于硬盘的读写速度无法与内存的速度相比,所以在使用内存时要时刻监视内存的使用情况。一般如果只有60%的内存资源可用,这时就要注意调整或释放内存了,不然就会严重影响电脑的运行速度和系统性能。所谓释放内存,就是将驻留在内存中的数据从内存中释放出来。在WinCE系统中,一般可通过轮询或中断法来查看物理内存的使用情况,并在物理内存耗尽前给出警告。WinCE定义了4种内存状态:Normal、Limited、Low、Critical。这些状态的划分主要取决于当前可用的内存大小。

  具体流程是:在WinCE中当出现内存不足时线程首先被挂起,这时系统如果没有可用的物理RAM,需要栈空间的线程就会被挂起。系统然后发送WM_HIBERNATE消息,该消息会向所有的进程发出请求。让它们在不破坏各自内在状态的情况下尽量释放内存,比如释放GDI对象、缓冲数据等,然后限制内存申请的请求。如果在给定的一小段时间内,这个内存需求不能得到响应,就会弹出系统异常。因此,一个经验是在低内存情况下不应该尝试使用大量的栈空间。在WinCE操作系统中,系统能运行的程序数量是由实际内存大小决定的,而不限于32个。当内存不足时,运行新程序将会收到内存不足的警告,并终止进程。因此,实时监控物理内存的使用情况,可以更有效的提升内存的使用效能。

  总之,要想提升内存使用效能就要尽可能地减少浪费。因为WinCE系统不可能为了保证满足所有的内存分配请求而将内存配置得很大。一方面,是因为嵌入式系统对成本的严格要求使得内存成为一种很有限的资源;另一方面,即使不考虑成本的因素,嵌入式系统硬件环境有限的空间和有限的板面积也决定了可配置的内存容量是有限的。因此,平衡内存成本和效能是WinCE系统开发的一个很重要的动作。

0
相关文章