WEB开发网
开发学院手机开发Symbian 开发 Symbian 中程序和线程对内存的占用 阅读

Symbian 中程序和线程对内存的占用

 2010-06-22 02:57:00 来源:WEB开发网   
核心提示:程序和线程的占用的内存在symbian里,一个程序占用的地址空间包括:System-wide 被ROM和RAM导入的DLL占用内存Process-wide 代码和数据块的占用的内存Thread-wide stack和 heap (不总是)占用的内存在一个线程被创建的时候,Symbian 中程序和线程对内存的占用,默认情

程序和线程的占用的内存在symbian里,一个程序占用的地址空间包括:

System-wide 被ROM和RAM导入的DLL占用内存

Process-wide 代码和数据块的占用的内存

Thread-wide stack和 heap (不总是)占用的内存

在一个线程被创建的时候,默认情况下每个线程将会有自己的8KB的stack。我们可以在创建线程的修改stack大小来改变这个。我们也可以在MMP文件里用epocstaksize来设置线程大小。一旦线程开始的话它的stack不能被增大。如果全部的stack都是变数的话将不能被适应为特定线程的 stack,这样将会是个混乱。当一个线程被创建以后,这个可以拥有自己的heap,或共享上层线程的heap。默认情况一个线程能会有至少4KB的 heap,至多1M的heap空间。我们可以通过MMP文件用epocheapsize来修改这个。我们也可以在创建线程的指定这两个参数。一个线程的默认heap可以被增大,前提是当前的heap不能适应全部的heap资源。如果系统空闲目录没有足够的空间的话,将会出现内存溢出。

代表性的,在symbian里,可执行文件可以是EXE或DLL。所有基于ROM的可执行文件都在in-place执行,看起来想这些可执行文件不是在ROM里,一定要先导入到RAM里才可以。

每个基于RAM的EXE为了代码将会有自己的空间,只读数据和可写数据。当这个是基于ROM的EXE的时候会有一些优化;每个基于ROM的EXE会有自己的RAM空间为了读/写数据。代码和只读数据将被共享,然后可以直接可以从ROM读取。

基于ROM的DLL一个都不会都被导入。他们只是的用着ROM的in-place,基于RAM的DLL会被从新定义到一个特别的地址。当第二个程序需要同样的DLL,这将被附上现存的代码。Symbian OS将有一个参考数,所以当没有线程连接DLL的时候DLL不会被导入。所以DLL被全部的程序共享。

DLL 被共享以后,当访问可写共用数据的DLL会有些问题。这些数据我们叫WSD(Write-able Static Data).每个有WSD的DLL需要分配给每个程序来一个分开的内存空间(4KB)来连接这个DLL.假定一个DLL有一个WSD的共用非恒量的字符,而且有50个应用程序连接它,这样的话就有50 * 4 = 200 KB的RAM空间将被分配给这个WSD,这样将会占用50Bytes的内存!如果有上百个的这样的DLL连接到上百个的应用程序,那样的话将会有很大的内存空间(100*100*4KB)会为WSD而浪费掉。

因为这个问题,我在上面也提过,Symbian不鼓励在DLL上用WSD。事实上 symbian

1 2 3  下一页

Tags:Symbian 程序 线程

编辑录入:coldstar [复制链接] [打 印]
赞助商链接