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


?监控内存泄漏:对于一个GUI程序来说 , 这个是经常发生的 。
?在同一进程的线程间进行共享 。
?在单元一级上进行访问和操作 。
RHeap类提供了对heap的支持 。如果heap 是当前线程的 heap , 那么使用等价系统静态方法API 的User 类 将更加方便 。这些系统静态方法API 同样也提供了宏来管理内存 , 以防止内存泄漏 。

三、进程和地址空间
Symbian OS 的程序可以包含若干进程 , 每个进程包含若干在概念上并发执行的线程 。每一个用户进程都有他自己私有的地址空间 。一个用户进程不可以直接访问另外一个用户进程的地址空间 。进程包括若干线程 , 他们运行在进程的特权级 。
Kernel 进程是一个比较特殊的进程 , 它的线程运行在超级访问者级别 , 这个进程通常包括两个线程 。
Kernel server 线程:是一个原始的进程 , 在系统启动时就已经存在 。它可以在heap执行核心函数请求的内存分配或重新分配 。
null 线程:当系统中没有其他可运行的线程时这个线程就开始运行 , null 线程使处理器处于空闲状态 , 减少耗电

线程的地址空间包括若干chunk , 在刚创建的时候 , 进程只有一个线程和1到3个chunk 。如果进程创建了新的线程 , 那么一个新的chunk将被创建被分配给这个线程 。每一个chunk都包括一个了stack , 如果线程没有共享当前heap , 那么在chunk中也将包括heap 。

四、Chunks(块)
Chunk 把RAM映射到一个连续的虚拟地址 。一个chunk中包括了一个保留区(reserved region)和和委托区(committed region) 。保留区是一个连续的虚地址区域 , 它的大小可能是整个chunk的大小 。在委托区中存放了真正映射到RAM的地址 。chunk的大小是可以被动态修改的 , 允许委托区也可以修改大小 , 他的范围是从0一直到保留区大小 , 是处理器页面大小的整数倍 。这样 , 就允许进程获得更多的内存空间 。通常 , 委托区起始地址位于保留区底部 。另外还可以创建 double-ended chunk , 那么委托区将是保留区的任意连续子集 , 他的大小也是处理器页面大小的整数倍 , 这种Chunk的委托区可以有两个顶端和底端 , 并且它们的大小也是可变的 。
在chunk创建时可以指定chunk的最大空间 , 保留区大小应该小于这个最大值 。.尽管这样 , 如果保留区请求比当前chunk更大的空间 , 那么chunk可以被重新分配空间 , 以允许保留区扩大 。保留区可以扩大到撑满整个chunk. 。

Local chunks(本地 chunk)
如果一个chunk对于创建它的进程是私有的 , 不允许被其他用户进程访问 , 那么那么这个chunk就是本地chunk , 本地chunk是没有名字的 。

Global chunks(全局chunk)
如果一个chunk可以被其他进程访问 , 那么这个chunk就是全局chunk 。全局chunk是有名字的 , 这样 , 进程可以根据chunk的名字来访问他们 。当进程打开一个全局chunk的时候 , 他把chunk映射到自己的地址空间 , 这样就可以对chunk进行直接访问和数据共享了 。如果已经知道了chunk的名称 , 那么使用 RChunk::OpenGlobal() 可以直接打开chunk. 。如果只知道了chunk的部分名字 , 那么可以使用带 TFindChunk 型参数的 RChunk::Open()方法来打开chunk. 。

五、Heaps(堆)

Each thread has a chunk which contains that thread’s program stack. For the main thread of a process, this chunk also contains the thread’s heap. A program’s request for memory is allocated from this heap. For example, a code fragment such as:

每一个线程都有一个包含了自身程序栈(program stack)的chunk 。.对于进程的主线程来说 , 这个chunk中同样也包含了线程heap 。程序对于内存的请求都是从这个heap的地址空间来分配的,例如有以下代码:

推荐阅读