您的位置:首页 > 其它

Windows CE内存管理

2003-05-19 21:31 190 查看
 
                 WinCE内存管理报告<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

1.     Windows CE支持虚拟内存动态分配(virtual memory allocation),局部和单独的堆空间(Local and separate heaps),甚至内存映射文件(memory_mapped files,memory mapping simplifies file access. Instead of using a system-maintained pointer to write to the file, you can write directly to memory.)

2.     Windows CE环境下ROM和RAM的使用和我们平时的PC机有所不同。RAM被分为 两个区域:程序区(proram memory),也叫系统堆(system heap),和对象存储(object store)。

l       对象存储可以被看作类似于一个永久的虚拟RAM磁盘。在Pocket PC上,当我们关闭显示屏后,系统实际上并没有真正断电,而是进入一个低功耗的睡眠状态(由主电池来供电)。当我们按下后面的Reset按钮后,Windows CE内核在RAM中寻找最近一次创建的对象存储,如果找到的话,就是用这个对象存储重新启动。

l       RAM的另一个区域是程序区。这个区域就像PC机的RAM一样。它存放所运行程序的堆和栈的空间。对象存储和程序区的界限是可移动的。在低内存的情况下,系统会请求用户把部分可用的存储对象空间提供给运行程序使用,以满足程序运行的RAM需要。

u     PC机上,ROM用来存储BIOS,通常是64-128K。在WindowCE系统中,ROM用来存储整个操作系统以及和OS绑定的应用程序,大小可以4-32M不等。因此,WinCE下的ROM就像一个很小的只读硬盘一样。

u     在WinCE OS中,ROM_based程序可以被指定位就地执行(Excute in Place)。也就是说,它们直接从ROM中执行而不是先载入RAM然后再执行。这样不仅可以节省宝贵的Ram资源,而且程序启动更快。不在ROM中的程序(在对象存储空间里的或者是在Flash内存中的)不能原地执行。

3.     虚拟内存。OS使用微处理的内存管理单元实时地把虚拟地址转换到物理地址。

u     分页内存(Paged Memory)。在WinCE OS下,一页是1K或者4K,取决于微处理芯片。Intel 的ARM,一页是4K。

u     虚拟页面有三种状态:未用的(free),保留的(reserved)和占用的(committed)。一个free的页面,顾名思义就是可以被分配的。一个reserved页面就是已经被预定的,所以他的虚拟地址空间不能再分配给操作系统和这个进程的另一个线程。它的地址还未映射到物理空间。一个committed页就是已经被一个程序保留了并且已经直接映射到了一个物理地址空间。

4.WinCE地址空间

u     为所有的应用程序实现单个的2GB的虚拟地址,但是每个应用程序的内存空间都是受保护的,以保证其他应用程序不能访问。从最低的虚拟地址空间开始分为33个slot,每个slot32M。每个slot被分配为当前运行的进程。Slot 0中存放的当前激活的进程。当winCE在进程间切换时,它就重新映射地址空间,把老进程移出,新进程移进slot 0。这个任务是通过操作微处理器的页转换表来迅速完成的。

u     33个slot以上地址区域是为OS和映射内存映射文件保留的。和windows XP一样,winCE也保留了最低的64K地址空间,任何进程都不能访问。

5.查询系统内存。

u     GetSystemInfo(LPSYSTEM_INFO)

u     GlobalMemoryStatus(LPMEMORYSTATUS)(paging files are not supported under windows CE)

6.各种内存分配方式

u     首先是Virtualxxxx函数,用来预留,提交和释放虚拟内存页。然后是堆API。堆使用该应用程序管理的保留内存空间区域。堆有两种:缺省的局部堆和独立堆。堆API下来是静态数据,这些数据块由编译器定义并且在载入时自动分配。最后是栈,它存放应用程序中每个函数的局部变量。

u     wince不支持全局堆。因此全局堆API,wince都不支持。

u     在wince中减少内存使用的关键是选择恰当的内存分配策略。

6.1 虚拟内存

   它是内存类型中最基本的。系统可以调用虚拟内存API来为其他内存类型分配空间,比如堆,栈。VirtualAlloc,VirtualFree,VirtualResize函数直接在这个应用程序的虚拟内存空间里操作虚拟内存页。可以使用这些函数预留,提交和是否物理内存。(以页为单位的,舍入到页的界限)

6.2 堆

   显然,以页为单位分配内存对于大多数程序是低效的。而堆就可以以字节为单位来申请和释放内存。粒度比虚拟内存函数要小(至少4字节)。系统会随着所运行程序的需求自动增长堆的大小。当堆中的一些块被释放后,系统检查看是否整个页都被释放了,如果是的话,这个页就被decommit。由于在一个堆上不断地allocate和free,这个堆很可能被分割为一些碎片,或者有可能这个堆几乎是空的,但是系统还是不能从这个堆中释放 a page,除非它全空。

u     Local Heap。每个应用程序在启动时都会创建一个缺省的堆。可以使用LocalAlloc,LocalFree和LocalRealloc函数操作这个堆。

u     Separate Heaps。为了避免把堆分割成很多碎片,如果在一段时间里需要一块连续的块空间的话,更好的方法是创建一个单独的堆。实际申请空间时才映射物理地址空间,并不才创建时就保留或者提交任何内存。Destroy这个堆时并不要求里面的数据块都释放了。

  6.3栈

缺省一个栈空间最大是58K。当栈空间逐渐变小时,系统将进入低内存状态。栈空间的最大值可以在链接时指定。可以指定到1M。注意:

u     缺省栈空间大小也是所有其他独立线程栈的大小。

u     如果没有可用的物理RAM,需要栈空间的线程就会被挂起。如果在给定的一小段时间内,这个内存需求不能得到响应,就会弹出系统异常。在低内存情况下不应该尝试使用大量的栈空间。

6.4 静态数据

  预定义内存块在程序载入时为它们自动分配空间。这些块中的数据包含了静态申请的字符串,缓冲区,和全局变量以及和这个应用程序静态链接的函数库。Wince为一个应用程序申请两个RAM块:一个用于存放Read/Write数据,一个用于存放只读数据。由于这些区域都是以页为单位来分配内存的,所以为了节省空间,尽量使静态数据段接近但不能超过页的范围。如果在静态数据段还有相当空间,可以把本来动态申请的一些缓冲区移到静态数据区。有时根据具体情况可以把只读数据区中的一些数据移到读写数据区。决定的方法是查看map文件。

7.在低内存情况下WinCE如何处理应用程序的内存请求。

当系统运行需要更多的内存,而又不能满足的情况下,shell会自动关闭该应用程序。因此wince提供了一些方法来在所有正在运行的程序间分配宝贵的内存资源。

u     WM_HIBERNATE消息。OS首先向非活动状态的程序发送此消息,请求它们在不破坏各自内在状态情况下尽量释放多的内存,比如释放GDI对象,缓冲数据等等。

u     内存门槛(memory thresholds)。WinCE定义了四种内存状态:normal, limited, low and critical。这些状态的划分主要取决于当前可用的内存大小。当可用内存很少时,系统首先发送WM_HIBERNATE消息,然后限制内存申请的请求。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息