Android lowmemorykiller
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的更多相关文章
- Android LowMemoryKiller原理分析
copy from : http://gityuan.com/2016/09/17/android-lowmemorykiller/ frameworks/base/services/core/jav ...
- Android中基于CGroup的memory子系统HAL层分析-lmkd
Android在内存管理上于Linux有些小的区别,其中一个就是引入了lowmemorykiller.从lowmemorykiller.c位于drivers/staging/android也可知道,属 ...
- Android 操作系统的内存回收机制(转载)
Android 操作系统的内存回收机制(转载) Android APP 的运行环境 Android 是一款基于 Linux 内核,面向移动终端的操作系统.为适应其作为移动平台操作系统的特殊需要,谷歌对 ...
- 深入解读Linux与Android的相互关系(转-lining)
大家都知道Android是基于Linux内核的操作系统,也曾经和Linux基金会因为内核问题产生过分歧,本文将开始对Android的内核进行剖析,主要介绍Android和Linux之间的关系,后续还会 ...
- Android 操作系统的内存回收机制[转]
转自:http://www.ibm.com/developerworks/cn/opensource/os-cn-android-mmry-rcycl/ Android APP 的运行环境 Andro ...
- 【转】Android系统开篇
版权声明:本站所有博文内容均为原创,转载请务必注明作者与原文链接,且不得篡改原文内容.另外,未经授权文章不得用于任何商业目的. 一.引言 Android系统非常庞大.错综复杂,其底层是采用Linux作 ...
- 八一八android与Linux的关系
Linux与Androld的关系 虽然Android基于Linux内核,但是它与Linux之间还是有很大的差别,比如Android在Linux内核的基础上添加了自己所特有的驱动程序.下面我们就来分析一 ...
- Android内核和Linux内核的区别
1.Android系统层面的底层是Linux,并且在中间加上了一个叫做Dalvik的Java虚拟机,从表面层看是Android运行库.每个Android应用都运行在自己的进程上,享有Dalvik虚拟机 ...
- [Android Memory] Android内存管理、监测剖析
转载自:http://blog.csdn.net/anlegor/article/details/23398785 Android内存管理机制: Android内存管理主要有:LowMemory Ki ...
随机推荐
- luogu P1008 三连击
题目背景 本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序. 题目描述 将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数构成1:2: ...
- luogu P3353 在你窗外闪耀的星星
问题:天空可以理解为一条数轴,在这条数轴上分布着许多颗星星,对于每颗星星都有它的位置Xi和自身的亮度Bi.而窗户所能看到的范围是一个给出的参数W,我们看到的星星也包括窗户边缘的星星.现在,要你求出调整 ...
- CF161D Distance in Tree 点分治
题目: 输入点数为N一棵树,求树上长度恰好为K的路径个数 分析: 题目的数据范围不是很紧,点分治也可以过,树形dp也可以过.这里采用点分治做法. 我们只需要单开一个类似于桶的数组,跑点分治套路,统计即 ...
- 如何用纯 CSS 创作一种有削铁如泥感觉的菜单导航特效
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/XqYroe 可交互视频教 ...
- Python之 七级字典查询
# -*- coding:utf- -*- # 作业要求: # 打印直辖市,省,市,县,区,街道五级菜单: # 可以一层一层地进入到所有层 # 可以退出到上一层 # 可随时退出程序 mapChina ...
- solr之windws下搭建solr服务
安装Solr 首先保证已经正确安装了Java 下载Solr,当前最新版6.1.0 Solr各个版本下载地址 Solr从6.0之后需要Java1.8所以如果使用Solr6.0及其以上版本,请确保Java ...
- LeetCode(81) Search in Rotated Array II
题目 Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would t ...
- unittest多线程生成报告(BeautifulReport)
前言 selenium多线程跑用例,这个前面一篇已经解决了,如何生成一个测试报告这个是难点,刚好在github上有个大神分享了BeautifulReport,完美的结合起来,就能生成报告了. 环境必备 ...
- zoj 2886 Look and Say
Look and Say Time Limit: 2 Seconds Memory Limit: 65536 KB The look and say sequence is defined ...
- CodeForces 606C--Sorting Railway Cars,思路题~~~
C - Sorting Railway Cars Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d &am ...