天下网吧 >> 网吧天地 >> 网吧技术 >> 网吧软件 >> 正文

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

2009-1-19不详佚名

到的几乎全部的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运行在低内存系统中的程序的方法有很多种,但必须要小心应用,否则容易造成程序挂起或被关闭。   3. WinCE高效内存分配的策略

  众所周知,知道从哪里查找问题是找到并解决问题的第一步。因此,通过熟悉 WinCE 如何管理内存,开发人员就能更快地避免缺陷和潜在的问题,和诊断问题。

  (1)选择合适的内存类型
  WindowsCE是组件化的操作系统,它可根据目标设备或平台的不同特点进行定制。原始设备制造商(OEM)或嵌入系统开发者可以选择所需的系统模块和组件,定制出各种不同性能的版本,而所选择的模块和组件确定了它的内存需求情况。例如,文件系统模块包括RAM文件系统、ROM文件系统、注册表和数据库几个组件,OEM可以组合不同的文件系统组件使之满足目标系统的需要。

  因此,在各种组件的复杂整合中,在WinCE中比在桌面版本Windows可能有更多的机会导致内存分配失败。所以,为了更好的设计符合需求的紧凑型嵌入式系统,开发人员有必要知道所选择模块或组件要占用的内存情况,并选择合适的内存类型。

  (2)合理分配可用内存是核心的一步
  WinCE编程最重要的方面是需要管理一个程序可用的有限的内存。其它的Windows编程可以假定几乎无限的内存空间,而WinCE应用程序必须尽可能减少所占用的内存空间以便在更少的内存环境中生存。在设计程序时,必须要根据分配给Windows CE的不同类型的内存来最大限度地利用它们。因此,在Windows CE中最小化内存使用的关键是选择与内存块使用模型相匹配的内存分配策略。

  (3)根据系统定位设定内存分配策略和方案
  究竟应用使用静态分配还是动态分配,一直是嵌入式系统设计中一个争论不休的话题。当然,最合适的答案是对于不同的系统采用不同的方案,不同的嵌入式系统应根据其不同的定位采用不同的内存分配策略。

  程序运行时的内存分配有三种策略,分别是静态的、栈式的和堆式的。静态存储分配是指在编译时就能确定每个数据目标在运行时的内存需求。栈式存储分配也可称为动态存储分配,和静态存储分配相反,在栈式存储方案中程序对数据区的需求在编译时是完全未知的,只有到运行的时候才能够知道,一般是按照先进后出的原则进行分配。

  堆是应用程序在运行的时候主动请求操作系统分配给自己内存,优点在于程序不必知道要从堆里分配多少内存空间。因此,用堆保存数据时会得到更大的灵活性,但这种灵活性会付出代价,就是在堆分配存储空间时会花掉更长的时间。

  总的来说,采用静态分配会不可避免的使系统失去部分灵活性,故必须在设计阶段就预先知道所需要的内存并对之作出分配。如果出现没有预先考虑到的情况,系统就会无法处理,这样的分配方案必然会导致更大的内存浪费。因此,在WinCE系统设计时应采用静态分配与动态分配相结合的方法。

9 7 3 1 2 4 8 :

本文来源:不详 作者:佚名

声明
声明:本站所发表的文章、评论及图片仅代表作者本人观点,与本站立场无关。文章是出于传递更多信息之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与本网联系,我们将及时更正、删除,谢谢。 Email:support@txwb.com,系统开号,技术支持,服务联系微信:_WX_1_本站所有有注明来源为天下网吧或天下网吧论坛的原创作品,各位转载时请注明来源链接!
天下网吧·网吧天下
  • 本周热门
  • 本月热门
  • 阅读排行