当前位置: 首页 > article >正文

Android 进程查杀机制 之ams lmkd kswapd

本篇针对android系统进程查杀机制做一个汇总和总结。主要涉及famework层ams通过adj进行进程查杀关键日志ActivityManager: Killingnative层lmkd通过内存阀值进行查杀关键日志lowmemorykiller: Killkernel层kswapd一、AMS查杀机制1、AMS查杀流程先附上AI生成的AMS查杀机制流程图┌─────────────────────────────────────────────────────────────────────────┐ │ 系统事件触发 │ │ (内存压力 / ANR / 强制停止 / 后台限制 / 应用清理) │ └──────────────────────────────┬────────────────────────────────────────────┘ ▼ ┌──────────────────────┐ │ 触发类型判断 │ └──────────┬───────────┘ ┌──────────────────────┼──────────────────────┐ ▼ ▼ ▼ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │ updateOomAdj │ │ trimApplications│ │ ANR/ForceStop │ │ (OOM调整) │ │ (内存清理) │ │ (异常处理) │ └───────┬───────┘ └───────┬─────────┘ └───────┬───────┘ └────────────────────┴──────────────────────┘ ▼ ┌──────────────────────┐ │ OomAdjuster │ │ updateOomAdjLSP │ │ (计算OOM优先级) │ └──────────┬───────────┘ ▼ ┌──────────────────────┐ │ 遍历LRU进程列表 │ │ (从低优先级到高优先级)│ └──────────┬───────────┘ ▼ ┌──────────────────────┐ │ 检查进程状态 │ └──────────┬───────────┘ ┌──────────────────────┼──────────────────────┐ ▼ ▼ ▼ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │ CACHED进程 │ │ CACHED_EMPTY │ │ Isolated进程 │ │ (缓存进程) │ │ (空进程) │ │ (隔离进程) │ └───────┬───────┘ └───────┬─────────┘ └───────┬───────┘ ▼ ▼ ▼ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │ 数量 限制? │ │ 数量 限制? │ │ 无服务运行? │ │ 或时间 阈值? │ │ 或时间 阈值? │ │ │ └───────┬───────┘ └───────┬─────────┘ └───────┬───────┘ │ 是 │ 是 │ 是 ▼ ▼ ▼ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │ 生成kill reason│ │ 生成kill reason│ │ 生成kill reason│ │ cached #N │ │ empty #N │ │ isolated │ └───────┬───────┘ └───────┬─────────┘ └───────┬───────┘ └────────────────────┴──────────────────────┘ ▼ ┌──────────────────────┐ │ app.killLocked() │ │ (调用kill方法) │ └──────────┬───────────┘ ▼ ┌──────────────────────┐ │ ProcessRecord │ │ killLocked() │ └──────────┬───────────┘ │ │ │ ▼ ┌──────────────────────┐ │ 检查是否已杀死 │ │ mKilledByAm │ └──────────┬───────────┘ ▼ ┌──────────────────────┐ │ 打印日志 │ │ Killing app... │ └──────────┬───────────┘ ▼ ┌──────────────────────┐ │ noteAppKill │ │ (记录kill信息) │ └──────────┬───────────┘ ▼ ┌──────────────────────┐ │ ⭐ EventLog.writeEvent│ │ AM_KILL │ │ (打印am_kill日志) │ └──────────┬───────────┘ ▼ ┌──────────────────────┐ │ Process.killProcess │ │ Quiet(mPid) │ │ (实际kill进程) │ └──────────┬───────────┘ ▼ ┌──────────────────────┐ │ killProcessGroup │ │ (kill进程组) │ └──────────┬───────────┘ ▼ ┌──────────────────────┐ │ 设置标志位 │ │ mKilled true │ │ mKilledByAm true │ └──────────┬───────────┘ ▼ [结束]1触发入口- OomAdjuster.java: updateOomAdjLSP()- ActivityManagerService.java: trimApplicationsLocked()- ProcessList.java: killAppIfBgRestrictedAndCachedIdleLocked()2决策逻辑- OomAdjuster.java: 遍历LRU列表根据进程状态决定是否kill- 检查条件进程数量、空闲时间、进程状态等3执行kill- ProcessRecord.java: killLocked()- 白名单检查isInLmkKillWhitelist() ⭐ 我们添加的- 打印日志EventLog.writeEvent(AM_KILL) ⭐ 这里打印am_kill日志- 实际killProcess.killProcessQuiet()4白名单检查位置- ProcessRecord.killLocked() 方法开始处- 在所有kill操作之前检查- 如果在白名单中直接返回不执行后续操作2、二、lowmemorykiller查杀机制lwkd进程属于native层启动的一个守护进程他的作用贯穿android世界的始终。他的另外一个大家都属于的名字lowmemorykiller。根据readme的介绍lmkd是用来对android系统内存检查的守护进程它通过终止不重要的进程来达到系统稳定运行的状态。在Linux Kernel 4.12之前是这项任务是放在了kernel进行管理在Linux Kernel 4.12之后移到了native层中因为在kernel进程管理中直接干掉某个应用进程太过暴力。后面介绍了我们可以通过一些属性的值来控制lmkd进程的效果如下ro.config.low_ram: choose between low-memory vs high-performance device. Default false.ro.lmk.use_minfree_levels: use free memory and file cache thresholds for making decisions when to kill. This mode works the same way kernel lowmemorykiller driver used to work. Default falsero.lmk.low: min oom_adj score for processes eligible to be killed at low vmpressure level. Default 1001 (disabled)ro.lmk.medium: min oom_adj score for processes eligible to be killed at medium vmpressure level. Default 800 (non-essential processes)ro.lmk.critical: min oom_adj score for processes eligible to be killed at critical vmpressure level. Default 0 (all processes)ro.lmk.critical_upgrade: enables upgrade to critical level. Default falsero.lmk.upgrade_pressure: max mem_pressure at which level will be upgraded because system is swapping too much. Default 100 (disabled)ro.lmk.downgrade_pressure: min mem_pressure at which vmpressure event will be ignored because enough free memory is still available. Default 100 (disabled)ro.lmk.kill_heaviest_task: kill heaviest eligible task (best decision) vs. any eligible task (fast decision). Default falsero.lmk.kill_timeout_ms: duration in ms after a kill when no additional kill will be done. Default 0 (disabled)ro.lmk.debug: enable lmkd debug logs, Default falsero.lmk.swap_free_low_percentage: level of free swap as a percentage of the total swap space used as a threshold to consider the system as swap space starved. Default for low-RAM devices 10, for high-end devices 20ro.lmk.thrashing_limit: number of workingset refaults as a percentage of the file-backed pagecache size used as a threshold to consider system thrashing its pagecache. Default for low-RAM devices 30, for high-end devices 100ro.lmk.thrashing_limit_decay: thrashing threshold decay expressed as a percentage of the original threshold used to lower the threshold when system does not recover even after a kill. Default for low-RAM devices 50, for high-end devices 10ro.lmk.psi_partial_stall_ms: partial PSI stall threshold in milliseconds for triggering low memory notification. Default for low-RAM devices 200, for high-end devices 70ro.lmk.psi_complete_stall_ms: complete PSI stall threshold in milliseconds for triggering critical memory notification. Default 700lmkd will set the following Android properties according to current system configurations:sys.lmk.minfree_levels: minfree:oom_adj_score pairs, delimited by commasys.lmk.reportkills: whether or not it supports reporting process kills to clients. Test app should check this property before testing low memory kill notification. Default will be unset.1、LMKD进程的启动1.1 三种启动方式同其他native进程一致他的启动还是通过init rc机制来启动。如下代码总结如下标记为core类的服务会在init.rc的on early-init或on init阶段被启动未显式设置disabled属性时core类服务会随init进程初始化自动启动。PS在core进行启动是为了防止核心服务没有启动导致系统异常监听sys.boot_completed开机属性然后传递--reinit参数进行完整启动。PS从后文可以了解到reinit会去读取一系列相关属性即这是完整启动最后监听属性变更传递--reinit参数应该是做成不需要重启系统就能够动态生效这些参数的效果1.2 主函数三部曲三、kswapd线程机制kernel_platform/msm-kernel/mm/page_alloc.c是 Linux 内核中负责‌物理页帧分配与管理‌的核心实现文件主要功能如下一、核心功能‌伙伴系统Buddy System‌实现alloc_pages()/free_pages()等接口通过2^n阶页块管理物理内存13处理内存碎片合并与拆分如__free_one_page()函数3‌页分配策略‌控制GFP标志GFP_KERNEL/GFP_ATOMIC等的分配行为14实现水位线WMARK_MIN/WMARK_LOW和内存回收触发逻辑3‌NUMA架构支持‌多节点内存分配__alloc_pages_nodemask()二、关键代码结构函数/宏功能说明__alloc_pages_nodemask分配页帧的核心逻辑含慢速路径/快速路径3get_page_from_freelist从空闲列表获取可用页帧3zone_watermark_ok检查内存水位是否满足分配需求3__free_pages_ok释放页帧到伙伴系统3三、与lmkd的关联当lmkd触发内存回收时最终会通过该文件中的分配器获取/释放物理页帧24。例如GFP_KERNEL分配可能触发直接内存回收__perform_reclaim低内存时通过__alloc_pages_slowpath进入回收流程3注该文件是内存管理子系统MM的核心组件代码路径通常为/mm/page_alloc.cMSM内核版本会包含高通平台的特定优化13。__setup_per_zone_wmarks这个函数是干什么的__setup_per_zone_wmarks是Linux内核中用于初始化内存管理区zone水位线watermark的关键函数其核心功能如下一、核心作用‌计算并设置三档水位值‌根据min_free_kbytes全局参数为每个zone动态计算WMARK_MIN最低警戒线、WMARK_LOWkswapd唤醒线、WMARK_HIGHkswapd休眠线14默认比例关系LOW MIN * 5/4HIGH MIN * 3/246‌NUMA架构适配‌针对不同内存节点node的zone独立计算水位考虑局部内存特性二、水位线的作用机制水位等级触发行为‌WMARK_HIGH‌内存充足kswapd线程进入休眠状态69‌WMARK_LOW‌空闲内存低于此值唤醒kswapd进行异步回收57‌WMARK_MIN‌触发直接内存回收direct reclaim可能阻塞进程分配请求三、典型调用流程系统启动时通过init_per_zone_wmark_min()调用该函数4根据公式计算每个zone的min_free_kbytes分摊值zoneminmin_free_kbytes×zonesizetotal_non_highmem_pageszonemin​total_non_highmem_pagesmin_free_kbytes×zonesize​​再基于此值推导其他水位四、相关代码逻辑// mm/page_alloc.c static void __setup_per_zone_wmarks(void) { // 计算各zone的min水位 for_each_zone(zone) { zone-watermark[WMARK_MIN] calc_min_watermark(zone); // 推导low/high水位 zone-watermark[WMARK_LOW] min_wmark_pages(zone) (tmp 2); zone-watermark[WMARK_HIGH] min_wmark_pages(zone) (tmp 1); } }该函数是内存分配器如get_page_from_freelist判断是否触发回收的核心依据

相关文章:

Android 进程查杀机制 之ams lmkd kswapd

本篇针对android系统进程查杀机制做一个汇总和总结。主要涉及famework层:ams通过adj进行进程查杀,关键日志ActivityManager: Killing native层:lmkd通过内存阀值进行查杀,关键日志lowmemorykiller: Kill kernel层:kswa…...

docker相关(AI回答)

https://x.com/i/grok/share/a8bf720367dd444fa62947b5d6eb11e3 linux提供给docker什么底层机制,使docker可以虚拟化制作镜像启动容器 Linux 为 Docker 提供的底层核心机制主要包括以下三大关键技术(这也是容器技术的基石): 1.…...

RAG变轻了,Corpus2Skill:告别检索,直接导航企业知识库

传统 RAG(检索增强生成)的核心逻辑是——用户提问 → 向量检索 → 拼接上下文 → LLM 生成答案。这套流程存在一个结构性缺陷:LLM 从来看不到知识库的全貌。 打个比方,你问"怎么把个体户改成 LLC",这个问题…...

前端性能优化:网络优化策略详解

前端性能优化:网络优化策略详解 为什么网络优化如此重要? 在现代Web应用中,网络请求是影响页面加载速度的关键因素。不合理的网络请求会导致页面加载缓慢,影响用户体验。因此,网络优化是前端性能优化的重要环节。 网络…...

工作分解结构辅助生成(使用千问)

工作分解结构(Work Breakdown Structure, WBS)是项目任务管理的核心工具,通过将项目分解为可管理的子任务,明确任务层级、责任主体与依赖关系。传统手动绘制WBS需耗费1~2天,且易出现任务遗漏、层级混乱等问题。千问可基…...

Python 项目管理:工具与最佳实践

Python 项目管理:工具与最佳实践 1. 引言 Python 项目管理是确保项目成功的关键因素,尤其是在团队协作和大型项目中。良好的项目管理可以提高代码质量、减少开发时间、降低维护成本,并确保项目按时交付。本文将深入探讨 Python 项目管理的工具…...

语音修复终极指南:5分钟掌握VoiceFixer,让受损音频重获新生

语音修复终极指南:5分钟掌握VoiceFixer,让受损音频重获新生 【免费下载链接】voicefixer General Speech Restoration 项目地址: https://gitcode.com/gh_mirrors/vo/voicefixer 你是否曾遇到过这样的情况?珍贵的历史录音充满杂音&…...

ARM PMU架构与性能监控实战指南

1. ARM PMU架构概述性能监控单元(Performance Monitoring Unit, PMU)是现代处理器中用于硬件性能分析的关键模块。在ARM架构中,PMU通过事件计数器(Event Counter)机制实现对指令执行、缓存命中、分支预测等微架构事件的监测。这种硬件级的性能监控能力为系统调优、瓶…...

别再只懂线性插值了!深入对比Bayer转RGB的几种算法:从速度到画质怎么选?

别再只懂线性插值了!深入对比Bayer转RGB的几种算法:从速度到画质怎么选? 当你从CMOS传感器获取原始图像数据时,那些看似杂乱的像素点其实隐藏着丰富的色彩信息。Bayer模式作为单传感器相机的核心技术,通过精巧的滤色阵…...

告别微信压缩!用群晖Synology Photos和cpolar,5分钟搞定户外照片无损分享

5分钟搭建私有云相册:户外高清照片分享终极方案 每次旅行归来,手机里塞满的4K照片总让人陷入两难——微信发送画质折损80%,而原图传输又受限于运营商文件大小限制。更糟的是,亲友们收到的照片永远带着恼人的"查看原图"按…...

告别D-PHY!用C-PHY三线制为你的摄像头模组提速2.28倍(附波形解析实战)

告别D-PHY!用C-PHY三线制为你的摄像头模组提速2.28倍(附波形解析实战) 当你在调试一款4K摄像头模组时,是否遇到过D-PHY接口的带宽瓶颈?去年我们团队在开发医疗内窥镜项目时,就曾因D-PHY的传输速率限制导致图…...

Oracle 12c R2连接报错ORA-28040?别急着重装客户端,试试这个sqlnet.ora配置

Oracle 12c R2连接报错ORA-28040的精准解决方案 当数据库从Oracle 12c R1升级到R2后,许多运维团队都会遇到一个棘手问题:原本运行良好的老程序突然无法连接,报错"ORA-28040: 没有匹配的验证协议"。这个看似简单的错误背后&#xff…...

随着AI引发全球存储器供需紧张,Omdia将2026年半导体行业预测上调至增长62.7%

Omdia将2026年半导体市场的收入增长预测上调至62.7%,再次反映出DRAM和NAND市场前所未有的增长势头,这主要得益于持续的需求和预计将持续到年底的供应短缺。DRAM市场规模预计将增长近一倍,而体量更小的NAND市场规模较2025年或将增长三倍。 行…...

1秒编译+零依赖!V语言如何重新定义系统级开发效率?

1秒编译零依赖&#xff01;V语言如何重新定义系统级开发效率&#xff1f; 【免费下载链接】v Simple, fast, safe, compiled language for developing maintainable software. Compiles itself in <1s with zero library dependencies. Supports automatic C > V transla…...

从CTFshow-PWN40实战出发:深入理解64位Linux下的ROP攻击链构建(含工具使用技巧)

64位Linux下ROP攻击链构建的艺术&#xff1a;从CTFshow-PWN40到实战进阶 在CTF竞赛和二进制安全研究领域&#xff0c;ROP&#xff08;Return-Oriented Programming&#xff09;技术一直是绕过现代防护机制&#xff08;如NX/DEP&#xff09;的利器。不同于32位环境下相对简单的栈…...

VolumetricLights社区贡献指南:参与开源项目的最佳实践

VolumetricLights社区贡献指南&#xff1a;参与开源项目的最佳实践 【免费下载链接】VolumetricLights Volumetric Lights for Unity 项目地址: https://gitcode.com/gh_mirrors/vo/VolumetricLights VolumetricLights是一款为Unity引擎开发的开源体积光效果扩展&#x…...

保姆级教程:用UPF搞定芯片低功耗设计,从电源域划分到状态表实战

芯片低功耗设计实战&#xff1a;从UPF入门到电源状态表精解 低功耗设计已成为现代芯片开发的核心竞争力之一。想象一下&#xff0c;你刚接手一个需要支持动态电压调节和电源关断的处理器子系统设计&#xff0c;面对EDA工具里密密麻麻的电源网络和状态控制需求&#xff0c;是否感…...

AI伦理与治理:一个被忽视却至关重要的职业发展方向

在人工智能&#xff08;AI&#xff09;技术飞速发展的今天&#xff0c;AI系统已渗透到金融、医疗、交通等各个领域&#xff0c;带来效率革命的同时也引发深刻伦理挑战。偏见算法导致歧视性决策、数据滥用侵犯隐私、自主系统失控酿成事故——这些问题凸显了AI伦理与治理的紧迫性…...

GodSVG元素属性系统详解:掌握每个SVG标签的完整配置

GodSVG元素属性系统详解&#xff1a;掌握每个SVG标签的完整配置 【免费下载链接】GodSVG A vector graphics application for structured SVG editing, available on all major desktop platforms and on web. Currently in late alpha. 项目地址: https://gitcode.com/gh_mi…...

零信任时代的数据合规终极指南:Electric SQL实现GDPR与本地化同步的完整解决方案

零信任时代的数据合规终极指南&#xff1a;Electric SQL实现GDPR与本地化同步的完整解决方案 【免费下载链接】electric Read-path sync engine for Postgres that handles partial replication, data delivery and fan-out. 项目地址: https://gitcode.com/GitHub_Trending/…...

MoltGrid:基于3D网格与深度学习的分子性质预测框架实战指南

1. 项目概述&#xff1a;当分子动力学遇上机器学习最近在分子模拟和药物发现社区里&#xff0c;一个名为 MoltGrid 的项目引起了我的注意。这个由 D0NMEGA 团队开源的框架&#xff0c;本质上是在解决一个困扰计算化学领域多年的老问题&#xff1a;如何高效、准确地预测分子在特…...

invoice2data 高级技巧:使用插件系统解析复杂表格和行项目

invoice2data 高级技巧&#xff1a;使用插件系统解析复杂表格和行项目 【免费下载链接】invoice2data Extract structured data from PDF invoices 项目地址: https://gitcode.com/gh_mirrors/in/invoice2data invoice2data 是一款强大的开源工具&#xff0c;能够从 PDF…...

PTP协议精讲(3.12):单播协商实现——PTP的“专线服务“

3.12 单播协商实现&#xff1a;PTP的"专线服务" 为什么需要单播 默认PTP使用组播&#xff0c;但有些场景需要单播&#xff1a; 组播的局限性&#xff1a;1. 跨网段问题- 组播可能被路由器阻止- TTL限制传播范围- 需要组播路由支持2. 网络负载- 所有设备都收到所有…...

SMHasher问题排查:常见错误及其解决方案

SMHasher问题排查&#xff1a;常见错误及其解决方案 【免费下载链接】smhasher Hash function quality and speed tests 项目地址: https://gitcode.com/gh_mirrors/smha/smhasher SMHasher是一款用于测试哈希函数质量和速度的开源工具&#xff0c;广泛应用于哈希算法的…...

机器学习赋能软件质量保障:从Bug自动分类到智能缺陷管理实战

1. 项目概述&#xff1a;当机器学习遇见软件质量保障在软件开发的日常里&#xff0c;Bug&#xff08;缺陷&#xff09;的识别、分类和处理&#xff0c;是每个工程师和测试人员绕不开的“日常任务”。想象一下&#xff0c;一个大型开源项目&#xff0c;每天有成百上千个新的Bug报…...

解锁QuickCut视频处理黑科技:从光流法补帧到视频倒放的完整指南

解锁QuickCut视频处理黑科技&#xff1a;从光流法补帧到视频倒放的完整指南 【免费下载链接】QuickCut Your most handy video processing software 项目地址: https://gitcode.com/gh_mirrors/qu/QuickCut QuickCut作为一款便捷的视频处理软件&#xff0c;不仅提供基础…...

DeepLake:AI数据管理的瑞士军刀,从原理到实战全解析

1. 项目概述&#xff1a;为什么说DeepLake是AI数据管理的“瑞士军刀”&#xff1f;如果你正在构建一个AI应用&#xff0c;无论是图像识别、自然语言处理还是多模态模型&#xff0c;数据管理绝对是你绕不开的“拦路虎”。数据格式五花八门&#xff0c;从图片、文本到视频、点云&…...

Docker GitHub Actions Runner 多环境部署:开发、测试与生产环境配置

Docker GitHub Actions Runner 多环境部署&#xff1a;开发、测试与生产环境配置 【免费下载链接】docker-github-actions-runner This will run the new self-hosted github actions runners with docker-in-docker 项目地址: https://gitcode.com/gh_mirrors/do/docker-git…...

如何为Runtime Mobile Security (RMS)扩展新功能并贡献到开源社区:完整指南

如何为Runtime Mobile Security (RMS)扩展新功能并贡献到开源社区&#xff1a;完整指南 【免费下载链接】RMS-Runtime-Mobile-Security Runtime Mobile Security (RMS) &#x1f4f1;&#x1f525; - is a powerful web interface that helps you to manipulate Android and iO…...

终极PDF OCR工具指南:如何用OCRmyPDF快速实现文档扫描识别与智能PDF处理 [特殊字符]✨

终极PDF OCR工具指南&#xff1a;如何用OCRmyPDF快速实现文档扫描识别与智能PDF处理 &#x1f4c4;✨ 【免费下载链接】OCRmyPDF OCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched 项目地址: https://gitcode.com/GitHub_Trending/oc/OC…...