其实我不怎么喜欢应用,只是因为工作的需要,才会去接触应用的东西,不说这么多废话。说重点吧。
Android下的内存管理机制,是根据init.rc设置的相应adj值及所对应的内存阈值来进行管理的。
在 lowmemorykiller.c代码中,首先定义了两个数组:(复制代码)
static int lowmem_adj[6] = {
0,
1,
6,
12,
};
static int lowmem_adj_size = 4;
static size_t lowmem_minfree[6] = {
3 * 512, /* 6MB */
2 * 1024, /* 8MB */
4 * 1024, /* 16MB */
16 * 1024, /* 64MB */
};
static int lowmem_minfree_size = 4;
相应的数组大小是6,但只初始化了前四个元素,注意只初始化了前四个元素。
然后定义了一个使用默认的enents的工作队列的task_free_work:
static DECLARE_WORK(task_free_work, task_free_fn)
task_free_work调用 task_free_fn()函数,而 task_free_fn()却仅仅是注销了
struct notifier_block task_nb的task_nb结构并把struct task_struct *lowmem_deathpending
设置成了NULL,task_nb结构是个消息链表:(复制代码)
static struct notifier_block task_nb = {
.notifier_call = task_notify_func,
};
把notifier_call成员指向了task_notify_func函数,在task_notify_func函数中:(复制代码)
...
if (task == lowmem_deathpending) {
schedule_work(&task_free_work);
}
...
当task 等于lowmem_deathpending会执行task_free_work的task_free_fn函数,task_free_fn中
仅仅是注销task_nb和把lowmem_deathpending 赋为 NULL,以便下次调用,我们还没有注册消息task_nb,且看下面。
其实lowmemorykiller.c的内存处理过程是在 lowmem_shrink()。
static struct shrinker lowmem_shrinker = {
.shrink = lowmem_shrink,
.seeks = DEFAULT_SEEKS * 16
};
lowmem_shrinker通过register_shrinker(&lowmem_shrinker)注册的shrinker_list的,
shrinker_list在内存低时会处理。
lowmem_shrink()处理过程不是很复杂,主要使用for_each_process()遍历进程列表,
根据每个进程的oom_adj值和所占有的内存来决定的,当oom_adj值越大,越先被kill,
若oom_adj相同时,所占有的内存越大,越容易被kill。其实前面的框架起来了,而
lowmem_shrink()理解起来并不复杂。
在lowmem_shrink(),还有一处是重要的,那就是
...
task_free_register(&task_nb);
...
这一句,前面在task_free_fn是task_free_unregister(&task_nb)注销task_nb,原来是
在这里注册的,我弄了半天,我说这怎么一个静态变量,只有注销,没有注册的,怎么可能。
其实有一点我没有弄明白的是:
比如在手机VIVO中在/sys/module/lowmemorykiller/parameters/adj
为0,1,2,4,7,15
在/sys/module/lowmemorykiller/parameters/minfree为
2048,3072,4096,6144,7168,8192
对应着oom_adj和阈值内存,但是在lowmemorykiller.c有相应的数组和初始值,
而通过实现,证实在/sys/module/lowmemorykiller/parameters/adj和
/sys/module/lowmemorykiller/parameters/minfree参数才是有用的,我们也可以通过改变相应的参数来
设置手机,但lowmemorykiller模块是在什么地方以及在什么时候去读取这两个文件的值并修改它里面数
组的大小的呢?
阅读(4745) | 评论(0) | 转发(0) |