分类: LINUX
2011-03-21 14:25:07
一. 基本原理
Android的Low Memory Killer根据需要(当系统物理内存短缺时)杀死进程释放其内存,源代码在drivers/staging/android/lowmemorykiller.c。据说它提供了比标准linux内核的OOM机制更灵活的低内存状态下的管理。
二. 关键代码分析
Low memory killer的代码很简单,关键的一个函数是Lowmem_shrinker。作为一个模块在初始化时调用register_shrinke注册了个lowmem_shrinker,它会被vm在内存紧张的情况下调用。Lowmem_shrinker完成具体操作。简单说就是寻找一个最合适的进程杀死,从而释放它占用的内存。
所谓最合适的进程实际上就是基于两个标准来判断。其一是task_struct->signal_struct->oom_adj越大的越优先被kill;其二是占用物理内存最多的那个进程会被优先kill。进程描述符里面的signal_struct->oom_adj表示一个进程在内存短缺时候被选择kill的优先级,取值在-17~15,如果是-17则表示不会被选中kill,值越大越可能被选中。
一旦一个进程被选中,内核会发送SIGKILL信号将之杀死。
三. 与标准Linux内核OOM Killer的区别
标准Linux内核OOM Killer在mm/oom_kill.c中实现,在mm/page_alloc.cà __alloc_pages_may_oom被调用。Oom_kill.c最主要的一个函数是out_of_memory,它选择一个bad进程杀死,杀死的方法同样是通过发送SIGKILL信号。
在out_of_memory中通过调用select_bad_process选择一个进程杀死,选择的依据在badness函数中实现,基于多个标准来给每个进程算分,分最高的被选中杀死。基本上是占用内存越多,oom_adj越大越有可能被选中。
可见android的low memory killer和标准的oom killer很多想法是一致的,只不过low memory killer作为一个shrinker实现;而oom killer则在分配内存时候被调用(如果内存资源很紧张)。Android的low memory killer实现的较为简洁,这点从代码尺寸就能看到,但并不觉得比oom killer更为灵活。它只不过是另一种oom killer。
四. 结论
很显然,low memory killer是内核的一种机制,与cpu架构没有什么关系;而且它也基本不与应用层有直接关系。因此,对于我们在自己的soc上实现该机制是很简单的,基本上就是照搬google现有代码即可。