lmkd进程

156 阅读4分钟

前言

init创建的第一个进程是logd进程,创建的第二个进程是lmkd进程。lmkd(low memory killer demon)低内存杀手进程

何时杀进程

lmkd进程无法知道何时内存紧张。内核空间可通过PSI vmpressure lowmemorykiller检测内存 io cpu等硬件的使用情况。 PSI在Android高版本采用监听方式,而vmpressure在高版本上已经不使用,lowmemorykiller内核杀进程的方式不再使用。 PSI(Pressure Stall Information)可见听CPU 内存 IO性能异常的内核功能。当资源紧张时,mp_event_api或mp_event_common方法被调用,被调用的时候开始杀进程的时机。

收集进程

PSI通知何时杀进程,具体杀哪些由lmkd收集的进程来决定。lmkd把有可能被杀的进程收集起来放到进程监狱

进程监狱

被放到进程监狱的进程都有一个分数oom_adj_score[-1000,1000]。oom_adj_score只能是整数,越高代表优先被杀。数据结构采用数组,查找效率最高。索引采用最小值oom_adj_score+1000,最大值om_adj_score+1000+1。索引从0开始。数组存储的是一个进程链表(双向循链表)更快 更方便去查找进程。[0,2001]

押送进程

从用户空间进程分类:系统native进程和运行java代码进程。系统native进程主要由init进程创建,比如:logd、lmkd进程,是系统级别的非常重要,万一死掉系统出现问题,不能运行在java代码的,基本上是不会被杀掉的;运行java代码的进程由zygote进程创建,例如:system_server、launcher进程,一个app进程一般就是一个应用(system_server进程除外),重要程度是有区别的,例如:zygote、system_server进程最重要的也是最不能杀掉的,一些推到后台的应用变得没那么重要,可以被杀掉的。 由java代码的进程创建的native进程(通过fork/clone创建的进程,在Android低版本来做保活),这类可以不关心,在Android高版本时候杀掉他们的父进程的时候会把他们杀掉。

押送进程的任务由init进程和system_server进程来完成。

通信渠道

init进程和system_server进程 押送 进程到进程监狱,分别属于不同进程。 进程通信方式:

  1. socket
  2. binder
  3. signal
  4. 共享内存

lmkd进程即可与init进程通信也可以和system_server通信。c/s模式,lmkd是server端,init进程和system_server是client端;在通信渠道传输数据简单(进程id、uid等);传输数据不频繁,传输速度要求不高;传输数据是排队传输。socket通信方式是非常合适的。虽然传输过程中有两次复制,但数据简单可忽略不计,socket就是c/s模式,传递数据是排队的。

数据协议

LMK_PROCPRIO和LMK_PROCREMOVE是和押送进程到进程监狱两个命令,LMK_PROCPRIO是押送进程到进程监狱的协议,参数pid(进程id)、uid(app安装时候分配的唯一id值)、oom_adj_score(分数);LMK_PROCREMOVE代表从进程监狱把对应进程移除的协议,参数只有一个pid。

打分

init和system_server负责给押送的进程打分。

system_server打分

AMS(ActivityManagerService)常驻于system_server进程的一个服务,主要负责四大组件的所有相关事情,负责用户空间所有运行的java代码进程打分。

对app进程分为非app进程和app进程

非app进程它没包含四大组件,用户感觉不到它的存在,默默在后台进程,system_server就是这种。

app进程包含了四大组件,比如:微信、设置等。app进程可以分为系统app进程和普通app进程,系统app进程如systemui进程等,系统app进程需要在AndroidManifest清单文件中配置android:persistent="true"并且需要安装在system区域,系统启动的时候会启动系统app进程,当系统app进程死掉时,AMS负责重新启动他们;普通app进程,例如:微信、抖音等。

不论时系统app进程还是普通app进程按前后台分为前台进程、后台失去焦点进程、后台进程;前台进程指app有一个Activity处于或即将处于resume状态,或包含一个前台Service或正在处理一个广播;后台失去焦点的进程时app有一个Actiity处于pause状态(可以看到界面但是不可以与用户交互);后台进程,app的所有activity处于stop状态(完全不可见)。