认识Linux物理内存回收机制
Agenda 1. All channels for page freeing 2. Overview for page frame reclaiming 3. Sync. Reclaiming 4. Async. Reclaiming Introduction 本文所讲的物理页面回收是指动态的回收:即,空闲的内存不够用的时候,系统采取相应的方法将正在使用的内存释放,补充空闲内存,以满足内存的分配。 Text 1. All channels for page freeing 。首先先简单看一下系统中的内存释放的三种渠道。 1-1>. 在用户进程退出的时候,释放内存。当用户进程退出的时候,会调用 do_exit. do_exit 最终会调用 free_pagetables 函数。该函数的作用是:遍历 vma ,根据 vma 中的虚拟地址找到实际的物理页,将其释放。在之前讲过,对于用户进程的虚拟地址区间,是以红黑树组织的。 1-2>. 手动的释放。在驱动中,分配内存使用 alloc_pages() ,释放内存用 free_pages( 这一点,类似于 c 语言中的 malloc 和 free) 。必须配对使用。否则会造成内存泄漏。 1-3>. 按需求调用内存回收例程来释放内存。这个区别于前两种的最大不同:它是动态的,按需的。当内存不够的时候,系统会自动按照一定的方式,将某些正在使用的内存释放掉,放进 buddy system 中再利用。 2. Overview for page frame reclaiming 。 2-1>. 先来看一下内存将会回收哪些页面 用户进程的页面都是通过 page fault 进行分配的。通过 page fault 进行分配的页面都是可以进行回收的。 这些页面总体可以划分为两种,分别是文件页 (file cache) 和匿名页 (anonymous cache). 文件页,顾名思义,它是和外部存储设备上的某个文件相对应。匿名页,其内容不来自于外部存储设备,例如用户进程中的堆栈。这两...