drivers/staging/android/lowmemorykiller.c

lowmemorykiller 在系统空闲内存不足时, 根据一定机制选择某个进程, 然后杀死它.

1. register_shrinker(&lowmem_shrinker); 向 shrinker 注册一个回调. 当内核线程尝试回收系统内存页时, 会逐个回调已注册的 shrinker. 调用时机涉及到内存管理一块, 暂不关心.

2. 有两个数组: int lowmem_adj[6] 和 int lowmem_minfree[6] .

lowmem_adj[6] 存储 oom_score_adj阀值.

lowmem_minfree[6] 存储 剩余空闲内存的阀值.

数组序号表示等级, 这两个数组中各等级值一一对应. 两个数组值都在 /sys/ 下导出了相应读写节点, 改写其中的值可以调整 lowmemkiller 的行为.

/sys/module/lowmemorykiller/parameters/adj

/sys/module/lowmemorykiller/parameters/minfree

注意一点, 向 /sys/module/lowmemorykiller/parameters/adj 文件写入时, 会调用 lowmem_autodetect_oom_adj_values() 把 oom_adj 值转化成 oom_score_adj 值, 存放到 lowmem_adj[6] 中.

task_struct -> signal_struct 中有 oom_adj, oom_score_adj, oom_score_adj_min 几个和 oom 相关的记录.

3. lowmem_shrinker() 被调用时, 才开始了真正的行为. 其中依次做了几件事:

1). 取得系统剩余内存放到 other_free, other_file 中. 然后再与 lowmem_minfree[] 数组中各等级比较, 如果lowmem_minfree[i] 刚好大于 other_free 和 other_file , 则 min_score_adj = lowmem_adj[i] 为此次遍历的最低 score.

2). 遍历所有进程, 把进程的 p->singal->oom_score_adj 与 min_score_adj 比较, 如果进程的 oom_score_adj < minscore_adj, 则此进程不满足条件, 不会被杀死. 继续处理下一个进程.

如果进程的 oom_score_adj >= min_score_adj, 还要取进程占用的内存大小 get_mm_rss(). 对于oom_score_adj 满足条件且 score 相同的两个进程, 取占用内存大的放入 selected 中.

3). 最后, 一次遍历选出一个进程 selected . 向该进程发送 SIGKILL 信号, 并且告诉进程是由于内存原因(TIF_MEMDIE)而杀死它.

init.rc 中有相关操作:

write /proc/1/oom_adj -16

令 init 的 oom_adj 为-16, 则其永远不会被 lowmemkiller 杀死.

Android lowmemorykiller的更多相关文章

  1. Android LowMemoryKiller原理分析

    copy from : http://gityuan.com/2016/09/17/android-lowmemorykiller/ frameworks/base/services/core/jav ...

  2. Android中基于CGroup的memory子系统HAL层分析-lmkd

    Android在内存管理上于Linux有些小的区别,其中一个就是引入了lowmemorykiller.从lowmemorykiller.c位于drivers/staging/android也可知道,属 ...

  3. Android 操作系统的内存回收机制(转载)

    Android 操作系统的内存回收机制(转载) Android APP 的运行环境 Android 是一款基于 Linux 内核,面向移动终端的操作系统.为适应其作为移动平台操作系统的特殊需要,谷歌对 ...

  4. 深入解读Linux与Android的相互关系(转-lining)

    大家都知道Android是基于Linux内核的操作系统,也曾经和Linux基金会因为内核问题产生过分歧,本文将开始对Android的内核进行剖析,主要介绍Android和Linux之间的关系,后续还会 ...

  5. Android 操作系统的内存回收机制[转]

    转自:http://www.ibm.com/developerworks/cn/opensource/os-cn-android-mmry-rcycl/ Android APP 的运行环境 Andro ...

  6. 【转】Android系统开篇

    版权声明:本站所有博文内容均为原创,转载请务必注明作者与原文链接,且不得篡改原文内容.另外,未经授权文章不得用于任何商业目的. 一.引言 Android系统非常庞大.错综复杂,其底层是采用Linux作 ...

  7. 八一八android与Linux的关系

    Linux与Androld的关系 虽然Android基于Linux内核,但是它与Linux之间还是有很大的差别,比如Android在Linux内核的基础上添加了自己所特有的驱动程序.下面我们就来分析一 ...

  8. Android内核和Linux内核的区别

    1.Android系统层面的底层是Linux,并且在中间加上了一个叫做Dalvik的Java虚拟机,从表面层看是Android运行库.每个Android应用都运行在自己的进程上,享有Dalvik虚拟机 ...

  9. [Android Memory] Android内存管理、监测剖析

    转载自:http://blog.csdn.net/anlegor/article/details/23398785 Android内存管理机制: Android内存管理主要有:LowMemory Ki ...

随机推荐

  1. luogu 1968 美元汇率

    https://www.luogu.org/problemnew/show/P1968 定义二维数组f[ ][ ],f[i][1]表示在第i天将马克变为美元,f[i][2]表示在第i天将美元变为马克. ...

  2. poj3537 Crosses ans Crosses

    题目描述 题解: 一道非常简单的$SG$函数应用. 对于一个长度求它的$SG$函数,然后判断是否为$0$即可. 代码: #include<cstdio> #include<cstri ...

  3. 制作iso镜像U盘自动化安装linux系统

    自制光盘引导自动化安装 首先我们要明白都需要哪些文件,我们列举下 ①需要一个文件夹来存放文件,将来把这个目录打包成iso ②准备kickstart文件(ks.cfg) ③准备启动文件启动菜单 差不多也 ...

  4. POJ 3258 River Hopscotch (二分法)

    Description Every year the cows hold an event featuring a peculiar version of hopscotch that involve ...

  5. string和数值之间的转换

    string和数值之间的转换 to_string(val) 一组重载函数,返回数值val的string表示val可以是任何算数类型. stoi(s,p,b),stol(s,p,b),stoul(s,p ...

  6. C++实现链队类——合肥工业大学数据结构实验5:链式队列

    实验5 5.1 实验目的 熟练掌握队列的顺序链式存储结构. 熟练掌握队列的有关算法设计,并在链队列上实现. 根据具体给定的需求,合理设计并实现相关结构和算法. 5.2 实验要求 5.2.1链队列实验要 ...

  7. 利用nginx设置浏览器协商缓存

    强缓存与协商缓存的区别 强缓存:浏览器不与服务端协商直接取浏览器缓存 协商缓存:浏览器会先向服务器确认资源的有效性后才决定是从缓存中取资源还是重新获取资源 协商缓存运作原理 现在有一个这样的业务情景: ...

  8. mysql语句查询:查询距离某个日期10天的数据

    select * from table  where state = '1' and DATE_SUB(CURDATE(), INTERVAL 10 DAY) <= begin_time

  9. JSP指令学习

    JSP 指令 JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言.语法格式: <%@ page attribute="value"%> 指令可以有很 ...

  10. 调用hcm接口同步员工数据更新员工信息没有同步到bdm

    原来是更新的时候,baseEmployeeEntity的id为空,这时候需要把原先的baseEmployeeEntity1的id赋值给baseEmployeeEntity,问题解决