源码基于:Linux5.4
0. 前言
在 页面回收简介和 kswpd(1) 一文中,我们得知Linux 内核中触发页面回收的机制大致分为 3 种:
- 直接页面回收机制:在内核态里调用页面分配接口函数 alloc_pages() 分配物理页面时,由于系统内存短缺,不能满足分配请求,因此内核会直接进入页面回收机制,尝试回收内存来解决当前的燃眉之急,这就是直接页面回收机制。
- 周期性回收内存机制:这是 kswapd 内核线程的工作职责。当内核路径调用 alloc_pages() 分配物理页面时,由于系统内存短缺,没法在低水位情况下分配出内存,因此会唤醒 kswapd 内核线程来异步回收内存。
- slab 收割机(slab shrinker)机制:这是用来回收 slab 对象。当内存短缺时,直接页面回收和周期性回收内存两种机制都会调用 slab 收割机来回收 slab 对象。slab 机制分配的内存主要用于 slab 对象和kmalloc 接口,也可用于内核空间的内存分配。
下面是内存回收的主要调用路径:
我们看到直接内存回收和异步kswapd 内存回收,最终触发的都是 shrink_node(