技术开发 频道

如何避免WinCE 内存分配失败?

  2. WinCE与桌面WINDOWS在内存方面的区别

  (1)Win32 API 接口之间的区别
  WinCE实现了Windows XP中可用到的几乎全部的Win32内存管理API。WinCE支持虚拟内存(virtual memory)分配,本地(local)和分离(separate)的堆(heaps),甚至还有(memory-mapped files)内存映射文件。虽然 WinCE 支持几乎每个Win32 内存管理函数,但是开发人员应当永远不要忘记 WinCE 是与 Windows XP 完全不同的操作系统,这些内存管理API的实现WinCE 具有不同的要求和不同的实现方式。

  像Windows XP一样,WinCE支持一个带有应用程序间内存保护功能的32位地址空间,但是WinCE是被设计来应用于不同场合,所以它底层的内存结构不同于Windows XP。例如,WinCE不支持Win32 内存API的全局堆(global heap)。因此,开发人员应该熟悉 Win CE 与 Windows 桌面版本之间的细微差异,在设计应用程序或诊断问题时知道 WinCE 如何实现Win32 兼容性是一件非常重要的事情。

  (2)存储结构区别
  WinCE实现了一个和其他Win32操作系统类似的分页式虚拟内存系统。在WinCE中,一页的大小可以从1024字节到4096字节,基于微处理器的不同而不同。这和Windows XP不同,Windows 页面尺寸是Intel微处理器所支持的4096字节。

  WinCE 通过改变每页的保护来保护程序内存,而不是分配给每一程序不同地址空间。存储在ROM中的程序组在WinCE下当地执行,所以嵌入式系统的设计者能够只占用很少的RAM用于堆栈存储的需要。而且为了进一步的增加应用程序软件的性能,WinCE采用按需求将内存分页,操作系统仅仅需要解压缩并且装入基于RAM的一小部分程序准备执行。因此,ROM和基于RAM的程序的灵活性与速度意味着基于WinCE的设备能够被构造成多种内存结构形式。

  (3)低内存环境的区别
  WinCE定义了内存门槛(Memory thresholds),它有四种内存状态:Normal, Limited, Low和Critical,这些状态的划分主要取决于当前可用的内存大小。WinCE监视系统自由的RAM,并对越来越少的RAM作出响应。当很少内存可用时,WinCE发送WM_HIBERNATE消息,接下来会限制可能的内存分配。当系统运行需要更多的内存,而又不能满足的情况下,shell会自动关闭该应用程序。

  例如,OS首先向非活动状态的程序发送此消息,请求它们在不破坏各自内在状态情况下尽量释放多的内存,比如释放GDI对象;如果没有可用的物理RAM,需要栈空间的线程就会被挂起;如果在给定的一小段时间内,这个内存需求不能得到响应,就会弹出系统异常。简单说是:当系统运行在一个低RAM环境中,应用程序将调整并最小化它们的内存使用,如果当系统需要更多内存时,外壳(shell)会自动关闭这些程序。因此,管理WinCE运行在低内存系统中的程序的方法有很多种,但必须要小心应用,否则容易造成程序挂起或被关闭。

0
相关文章