LMK
分为三个进程
- AMS 中设置lmk的6个内存阈值,以及更新每个进程/线程的adj值applyOomAdjLocked
- lmkd是个单独的进程,socket监听,AMS发来的请求,更新内核的参数
- lowmemorykiller在内核中注册shrinker,利用内核的内存回收机制,根据lmkd中设置的参数执行lmk,先杀6个阈值中最大的(当内存低于80640个page时(320M),杀高于906的进程),依次递进
18432 | 23040 | 27648 | 32256 | 55296 | 80640 |
---|---|---|---|---|---|
0 | 100 | 200 | 300 | 900 | 906 |
shrinker
LMK驱动通过注册shrinker来实现的,shrinker是linux kernel标准的回收内存page的机制,由内核线程kswapd负责监控。
当内存不足时kswapd线程会遍历一张shrinker链表,并回调已注册的shrinker函数来回收内存page,kswapd还会周期性唤醒来执行内存操作。每个zone维护active_list和inactive_list链表,内核根据页面活动状态将page在这两个链表之间移动,最终通过shrink_slab和shrink_zone来回收内存页,有兴趣想进一步了解linux内存回收机制,可自行研究,这里再回到LowMemoryKiller的过程分析。
网友评论