欢迎来到天天文库
浏览记录
ID:36048614
大小:1.30 MB
页数:26页
时间:2019-05-01
《android内存管理了解》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Android内存管理认识目录LowMemoryKillerAshmemPmemdalvik虚拟机内存管理低内存管理器(LowMemoryKiller)低内存管理器(LowMemoryKiller),相对于Linux标准OOM(OutOfMemory)机制更加灵活,它可以根据需要杀死进程来释放需要的内存。源代码位于drivers/staging/Android/lowmemorykiller.c匿名共享内存(ashmem),为进程间提供大块共享内存,同时为内核提供回收和管理这个内存的机制。源代码位于mm/ashmem.c
2、AndroidPMEM(Physical),PMEM用于向用户空间提供连续的物理内存区域,DSP和某些设备只能工作在连续的物理内存上。源代码位于drivers/misc/pmem.cLowMemoryKiller的实现LowMemoryKiller的源代码在drivers/staging/android/lowmemorykiller.c中,它是通过注册CacheShrinker来实现的。CacheShrinker是标准linuxkernel回收内存页面的一种机制,它由内核线程kswapd监控,当空闲内存页面不足时,ks
3、wapd会调用注册的Shrinker回调函数,来回收内存页面。LowMemoryKiller是在模块初始化时注册CacheShrinker的,代码如下:staticint__initlowmem_init(void){register_shrinker(&lowmem_shrinker);//注册CacheShrinkerreturn0;}lowmem_shrinker的定义如下:staticstructshrinkerlowmem_shrinker={.shrink=lowmem_shrink,.seeks=DEFAU
4、LT_SEEKS*16};register_shrinker会将lowmem_shrink加入ShrinkerList中,被kswapd在遍历ShrinkerList时调用,而LowMemoryKiller的功能就是在lowmem_shrink中实现的。lowmem_shrink用两个数组作为选择Bad进程的依据,这两个数组的定义如下:staticintlowmem_adj[6]={0,1,6,12,};staticintlowmem_adj_size=4;staticsize_tlowmem_minfre
5、e[6]={3*512,//6MB2*1024,//8MB4*1024,//16MB16*1024,//64MB};lowmem_shrink首先计算当前空闲内存的大小,如果小于某个阈值,则以该阈值对应的优先级为基准,遍历各个进程,计算每个进程占用内存的大小,找出优先级大于基准优先级的进程,在这些进程中选择优先级最大的杀死,如果优先级相同,则选择占用内存最多的进程。lowmem_shrink杀死进程的方法是向进程发送一个不可以忽略或阻塞的SIGKILL信号:force_sig(SIGKILL,selected)
6、;用户接口设置空闲内存阈值的接口:/sys/module/lowmemorykiller/parameters/minfree,设置对应优先级的接口:/sys/module/lowmemorykiller/parameters/adj,设置各个进程优先级的接口:/proc/<进程pid>/oom_adj。Android启动时读取的配置文件/init.rc中定义了相应的属性供AP使用并有设置这些参数。将init进程oom_adj设置为-16,从而保证init进程永远不会被杀掉。Ashmem相关介绍基本原理Android的A
7、shmem是一种共享内存的机制,它基于mmap系统调用,不同进程可以将同一段物理内存映射到各自的虚拟地址控制,从而实现共享。Ashmem与mmap的区别mmap通过映射同一个普通文件实现进程间共享内存,普通文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问,不必再调用read,write等操作。进程在映射空间对共享内存的改变并不直接写回到磁盘文件中,在调用munmap后才执行此操作。可以通过调用msync实现磁盘上文件内存与共享内存区的内容一致。Ashmem与mmap的区别在于Ashmem与caches
8、hrinker关联起来,可以控制cacheshrinker在适当时机回收这些共享内存。Ashmem的实现Ashmem的源代码在mm/ashmem.c中,它通过注册CacheShrinker回收内存,通过注册misc设备提供open,mmap等接口,mmap则通过tmpfs创建文件来分配内存,tmpfs将一块内存虚拟为
此文档下载收益归作者所有