Chipset: MSM8X25Q
Codebase: Android4.1
Kernel: 3.4.0
概念:
Lowmemory killer是android基于oom killer做了改进。两者区别:
Oom killer: 当系统内存不足时,会根据当前进程的内存使用状况以及oom score来Kill掉某个进程。
Low memorykiller: 会周期性的检查系统内存状况,当系统内存小于其设定的返回时,根据 oom score和当前rss占用内存情况来杀掉进程。
两者大同小异,不过lowmemory killer概念更简单,直接看代码吧。
文件路径:android\kernel\drivers\staging\android\Lowmemorykiller.c
初始化:
static int __init lowmem_init(void)
{
/*通过此接口注册之后,系统在内存回收释放时,kswap内核线程会遍历
Shrinker链表,并调用通过此接口注册的shrink函数。*/
register_shrinker(&lowmem_shrinker);
return 0;
}
static struct shrinker lowmem_shrinker = {
.shrink = lowmem_shrink, //核心函数在此!
.seeks = DEFAULT_SEEKS * 16
};
核心调用:
在说核心函数之前,先了解下lowmemory killer的基础。
它利用lowmem_adj和lowmem_minfree这两个数组来作为评判当前内存不足的标准。如,当前系统空闲内存是63M时,比owmem_minfree[3]小,那么就会选择比lowmem_adj[3]的oom score adj大的进程中找到一个oom score adj最大的将其杀掉,当两个进程的oom score adj一样时,会选择内存占用最多杀掉!数组其他部分以此类推。
static int lowmem_adj[6] = {
0,
1,
6,
12,
};
static int lowmem_adj_size = 4;
static int lowmem_minfree[6] = {
3 * 512, /* 6MB */
2 * 1024, /* 8MB */
4 * 1024, /* 16MB */
16 * 1024, /* 64MB */
};
static int lowmem_minfree_size = 4;
lowmem_shrink():
static int lowmem_shrink(struct shrinker *s, struct shrink_control *sc)
{
struct task_struct *tsk;
struct task_struct *selected = NULL;
int rem = 0;
int tasksize;
int i;
i