青岛开发网站,洛可可设计公司考察,百度收录网站怎么更改关键词,制作网页游戏html1 原理说明
LMKD 借助 Linux 内核的 OOM#xff08;Out of Memory#xff09;机制来管理内存。当系统内存不足时#xff0c;OOM 触发器会发送信号给LMKD#xff0c;通知其进行内存管理。LMKD根据预先定义的策略和优先级#xff0c;选择性地终止一些进程#xff0c;以释放…1 原理说明
LMKD 借助 Linux 内核的 OOMOut of Memory机制来管理内存。当系统内存不足时OOM 触发器会发送信号给LMKD通知其进行内存管理。LMKD根据预先定义的策略和优先级选择性地终止一些进程以释放内存。
LMKD运行流程如下
监测内存使用LMKD 定期检查系统内存使用情况包括各个进程的内存占用和系统总体内存压力。内存压力评估根据内存使用情况LMKD 会计算出当前的内存压力指数以判断是否需要进行内存管理。内存压力事件处理当内存压力指数超过一定阈值时LMKD 触发内存压力事件并根据预先配置的策略进行相应的处理。进程终止LMKD 根据策略和优先级选择性地终止一些进程。通常LMKD 会优先终止那些占用内存较多、优先级较低或者处于后台运行的进程。释放内存通过终止进程释放的内存会被回收从而使系统内存得到释放缓解内存压力。日志记录和统计LMKD 记录终止的进程信息和释放的内存量并将其记录到系统日志中以供后续分析和优化。
这里选择运行到第4步时进行进程终止过滤即使用包名进行过滤。
2 修改方案Android R S
修改文件为AOSP/system/memory/lmkd/lmkd.cpp不同可能lmkd.cpp的位置不同本质上都是修改kill_one_process的实现过滤掉包名,具体代码修改如下
static int kill_one_process(struct proc* procp, int min_oom_score, struct kill_info *ki,union meminfo *mi, struct wakeup_info *wi, struct timespec *tm,struct psi_data *pd) {int pid procp-pid;int pidfd procp-pidfd;uid_t uid procp-uid;char *taskname;int r;int result -1;struct memory_stat *mem_st;struct kill_stat kill_st;int64_t tgid;int64_t rss_kb;int64_t swap_kb;static char buf[PAGE_SIZE];//AGS add startchar packageName[128] {};//AGS add endif (!read_proc_status(pid, buf, sizeof(buf))) {goto out;}if (!parse_status_tag(buf, PROC_STATUS_TGID_FIELD, tgid)) {ALOGE(Unable to parse tgid from /proc/%d/status, pid);goto out;}if (tgid ! pid) {ALOGE(Possible pid reuse detected (pid %d, tgid % PRId64 )!, pid, tgid);goto out;}// Zombie processes will not have RSS / Swap fields.if (!parse_status_tag(buf, PROC_STATUS_RSS_FIELD, rss_kb)) {goto out;}if (!parse_status_tag(buf, PROC_STATUS_SWAP_FIELD, swap_kb)) {goto out;}taskname proc_get_name(pid, buf, sizeof(buf));// taskname will point inside buf, do not reuse buf onwards.if (!taskname) {goto out;} // AGS add start添加包名过滤strncpy(packageName, taskname,128);//ALOGE(AGS-lmkd:packageName%s,taskname%s,strcmp%d,packageName,taskname,strcmp(packageName,com.xxx.xxx));if(!strncmp(packageName,com.xxx.xxx,strlen(com.xxx.xxx))){ALOGE(AGS add lmkd-whitelist:pkgname%s,packageName);return -1000;}//AGS add endmem_st stats_read_memory_stat(per_app_memcg, pid, uid, rss_kb * 1024, swap_kb * 1024);//...
out:/** WARNING: After pid_remove() procp is freed and cant be used!* Therefore placed at the end of the function.*/pid_remove(pid);return result;
}
思考与扩展这里实际上也可以根据自己的需要做成白名单和黑名单来解决该问题但是其本质都是包名的过滤。