Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2531819
  • 博文数量: 401
  • 博客积分: 12926
  • 博客等级: 上将
  • 技术积分: 4578
  • 用 户 组: 普通用户
  • 注册时间: 2009-02-22 14:51
文章分类

全部博文(401)

文章存档

2015年(16)

2014年(4)

2013年(12)

2012年(82)

2011年(98)

2010年(112)

2009年(77)

分类: LINUX

2011-03-21 14:25:07

一.             基本原理

AndroidLow 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 Killermm/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越大越有可能被选中。

可见androidlow memory killer和标准的oom killer很多想法是一致的,只不过low memory killer作为一个shrinker实现;而oom killer则在分配内存时候被调用(如果内存资源很紧张)。Androidlow memory killer实现的较为简洁,这点从代码尺寸就能看到,但并不觉得比oom killer更为灵活。它只不过是另一种oom killer

 

四.             结论

很显然,low memory killer是内核的一种机制,与cpu架构没有什么关系;而且它也基本不与应用层有直接关系。因此,对于我们在自己的soc上实现该机制是很简单的,基本上就是照搬google现有代码即可。

阅读(1237) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~