不妥之处还请高手指正 Symbian OS内存管理介绍

Symbian OS内存管理介绍


在Symbain OS中内存管理的主要任务是:如何为程序分配内存以及如何在程序的内部分配内存 。
Symbian OS 程序最根本和基础的东西就是内存 , 作为一个有限的资源 , 必须小心细致地处理 , 特别是当有错误或异常发生的时候 。正是由于这样的原因 , 在支持清理机制的API中 , 异常处理和内存管理几乎是绑在一起的 。
Uikon核心框架使用这些支持清理机制的API来管理内存 , 使GUI程序的基础架构具有良好的性能和表现 。GUI程序还支持异常情况下内存清理 , 以及调试模式下的内存泄露检测 。

一、Symbian OS的清理机制(cleanup)
清理机制是Symbain OS 程序对于程序异常处理的一种特有方式 。当异常发生时 , 清理机制将清理错误的内存区域 。Symbian OS的清理策略和它所有类的基类CBase类有着密切关系 。要了解Symbian OS清理机制就必须清楚以下三个概念:异常处理(exception handling)、清理栈(cleanup stack)以及通用清理项(general cleanup item) 。

1、异常处理 (Exception Handling)
Symbian OS没有使用C的try…catch异常处理方式 , 而是使用了它自己所特有的方式:leave 。在Symbian OS中 , 异常以 leave 的形式出现 , trap harness可以在程序中设置一个点 , 使程序发生leave时回跳到这个点上 , 宏TRAP和TRAPD 可以在程序中设置这个点 。调用系统API User 类的一些静态函数可以触发Leave , 例如 User::Leave()方法 , 这就相当于主动地抛出异常 , 当然某些系统函数或是用户代码 , 也有可能发生leave 。

2、清理栈(Cleanup Stack)
当 leave 发生时 , 任何分配了资源的heap内存 , 例如通过new()方法创建的对象 , 他们将被孤立 , 因为leave一旦发生已指向他们的指针就不存在了 , 这样就导致了内存泄漏 。为了防止内存泄漏发生 , 程序就有要记录那些已经被创建的对象 , 如果程序运行发生leave , 那么系统可以自动找到并清理他们所占用的内存 。这些工作可以通过清理栈来完成 。CleanupStack类是支持清理栈的一个类 。GUI应用程序拥有一个由应用程序框架所提供的清理栈 , 其他的应用程序必须用CTrapCleanup 类自己构建一个清理栈 。

3、通用清理项(General Cleanup Item)
在默认情况下 , 清理栈只处理那些 CBase-based 类(也就是它所处理的类必须是由 CBase类继承下来的)和那些untyped 类型对象(用一个简单的内存释放语句就可以释放的对象) 。通用清理项(General Cleanup Item)使其他类型的对象也可以放到清理栈中 。TCleanupItem类是支持通用清理项的一个类 。

二、Symbian OS的内存分配
内存分配管理的目的在于 能够使Symbian OS 进程通过底层函数访问和操纵内存区域 。绝大多数的客户端程序不需要直接使用这些函数 , 那些在进程间共享内存区域以及在一个进程的线程间共享内存区域的程序会使用这些底层函数来管理内存 。这里有两个概念需要了解 chunk(块) 和 heap(堆) 。
1、Chunk(块)
chunk 是一组线性相邻的内存地址在RAM 中的映射 。进程创建以后 , 它的地址空间包括1到3个chunk:
(1)stack/heap chunk:这里包括了进程的主线程所要使用的stack 和 heap 。所以这个chunk 通常是进程所必须的 。
(2)code chunk:这个chunk 只有当进程被加载到RAM时才出现 。
(3)data chunk:只有当进程拥有静态数据的时候才会有这个chunk 。

当然 , 程序可以还创建额外的chunk 。一个全局的chunk可以被其他进程访问 , 这样就实现了大量内存的共享 。RChunk 类提供了对chunk的支持 。TFindChunk 类可以用来查找其他进程创建的全局chunk 。

2、Heap(堆)
heap 通常用于显式的动态内存分配。Symbian OS定义了C中new操作符创建对象到当前线程的heap中 。Heap的功能可以是:

推荐阅读