注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
bluehacker的个人空间 https://home.eeworld.com.cn/space-uid-78817.html [收藏] [复制] [分享] [RSS]
日志

android内核分析---low memory killer

已有 3111 次阅读2010-6-23 17:59

一. 基本原理

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现有代码即可。

bluehacker

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章
    头条资讯