内存管理

每个Smartphone设备包含一个闪存文件系统(也称为Intel Persistent Storage Manager [IPSM]内存空间),应用程序可以用来存储数据。SHGetSpecialFolderPath函数返回目录信息给应用程序,让应用程序保存数据到闪存文件系统中。没有保存到闪存文件系统或者存储卡上的数据在掉电之后会丢失。

如果你创建了一个在内部系统内存中保存数据的应用程序,SHCloseApps 函数可以帮助释放内存。
在存储卡上存储数据
Smartphone设备有其他区域存储数据。你可以以存取其他文件的方式存取存储在ROM中的文件(通过调用文件API)。然而,你不能修改存储在ROM中的文件。ROM中的文件被标记为FILE_ATTRIBUTE_INROM值,它表明它们是只读的。Microsoft Windows CE操作系统也使用FILE_ATTRIBUTE_ROMMODULE 值来指明一个文件是在ROM中执行的,而不是拷贝到RAM。你不能使用CreateFile函数来打开指明为FILE_ATTRIBUTE_ROMMODULE的文件。应该使用LoadLibrary和CreateProcess函数来获取对这些模块的访问。Windows CE不象桌面计算机给硬盘赋予一个盘符一样给一块存储卡赋予一个字母标签。文件驱动器在根目录下创建目录来表示每块存储卡上的每个分区。如果PC卡驱动器没有提供一个缺省的名字,Windows CE使用"Storage Card"作为名称。

你也可以通过文件属性区分一个对象存储目录和一个装载的卷目录。一个装载的文件系统上所有的目录都有FILE_ATTRIBUTE_TEMPORARY文件属性标记。

堆栈
当在一个Smartphone设备上创建一个进程的时候,会为属于该进程的线程创建一个堆栈。这个进程中创建的每个线程将会创建独立的堆栈。

此堆栈提供58 KB可用内存,用于存储传递给函数的参数值和函数中创建的变量。函数使用的堆栈内存在函数返回时被释放。

你不能象创建堆一样创建私有堆栈,也不能增加堆栈的大小。

超过58-KB堆栈限制会导致你的程序出错。

每个在一个Smartphone设备上启动的进程会创建一个缺省的堆。堆内存的分配和释放通过以下的方式:

C++中的new和delete操作符
C中的malloc, calloc, realloc和free函数
LocalAlloc, HeapAlloc, LocalFree和HeapFree API函数
反复地分配和释放内存,堆会变得有碎片,导致需要分配额外的内存和地址空间。特别是对于长时间运行的程序。

使用缺省的堆是很方便的,但是如果你的应用程序需要反复分配和释放堆内存,你应该考虑在你的程序中使用HeapCreate API函数创建一个私有堆。私有堆跟缺省堆工作方式一样,但是可以被删除来释放缺省堆中的所有内存。对于程序来说,删除私有堆是一个很好的方法来响应shell传来的WM_HIBERNATE消息。缺省堆不能被删除。当程序进程结束时它自动地释放。

注释:跟桌面计算机版本的Windows不同,使用HeapCreate创建一个堆不预留或者提交任何内存。因此,可能使用HeapCreate创建了一个堆,但是不能在这个堆上使用HeapAlloc分配到内存。
静态和全局变量
静态和全局变量在一个进程启动时候创建,在进程结束前不能被释放。所以,你应该限制使用静态或者全局变量,特别是大量分配内存和数组。
内存状态和信息
使用GetSystemInfo函数来返回关于处理器和设备内存的信息,这些信息保存在SYSTEM_INFO结构中。

所有Smartphone设备基于ARM4 CPU,wProcessorArchitecture结构成员将返回PROCESSOR_ARCHITECTURE_ARM。枚举器将返回PROCESSOR_ARCHITECTURE_INTEL的wProcessorLevel为5。

处理器的架构都是基于4-KB页大小和64-KB分配粒度。分配粒度意味着每个页分配必须在一个边界开始。

GlobalMemoryStatus函数通过MEMORYSTATUS结构返回当前设备内存状态的信息。该结构的dwTotalPhys和dwAvailPhys成员变量将包含程序总内存和当前可用内存的数量。
检查内存分配失败
当你分配内存的时候,你必须检查内存分配是否成功。如果你的内存分配失败,你可以通过调用SHCloseApps API函数,传递你的程序需要的内存数量来请求shell释放额外内存。
对于低内存状态的响应
因为Smartphone设备是设计为快速访问,当Smartphone设备上的一个程序需要更多内存的时候,shell会不通知用户关掉其他程序。Smartphone设备不能运行一个程序的多个实例,因为运行多个实例需要大量内存。
当收到一个WM_HIBERNATE消息后,一个程序必须采取以下措施:

  • 释放使用VirtualAlloc分配的大量内存块。
  • 释放尽可能多的内存,如图形、窗口、事件系统对象等……。
  • 保存堆状态来在以后恢复它,然后释放整个堆。

内存管理 - liujun - 博客园

posted on 2007-10-22 22:07  Joey Liang  阅读(261)  评论(0编辑  收藏  举报