lowmemorykiller内核回收机制注册、回调

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的过程分析。
- 代码见 :lowmemorykiller.c
- linux内核内存回收机制

猜你喜欢

转载自blog.csdn.net/xiabodan/article/details/80258732
今日推荐