Hi,MM !
刺猬@http://blog.youkuaiyun.com/littlehedgehog
在看有关Linux 2.4 kernel MM管理时一直对于内核中active_list、inactive_clean_list、inactive_dirty_list不甚理解,翻遍了有关书籍都未找到更为详细的介绍。今天无意中翻到国外有篇文章是专门介绍有关内容,比较精炼。
注: 为了简化,我们假定物理内存是UMA
先来看看这几个链表中页面的相互转化:
active list
1、包含age>0的页面
2、页面可能被映射入进程空间中了
3、这些页面都在"老化"
inactive_dirty list
1、包含的是脏的、并且age==0的页面
2、这些页面没有映射到任何进程中去
inactive_clean list
1、每个页面管理区都设置了一个inactive_clean_list
2、包含的是干净的、并且age==0的页面
3、可以被__alloc_page当作是free_page 回收使用
4、同样这些页面也没有映射到任何进程中去
free_list
1、每个管理区都设置了free_list链表
2、这些页面中的数据都是没用的 (也就是我们可以直接放心用这个页面,不用管页面swap_out之类的)
3、我们需要维持free_list中的页面数量,这样保证我们的分配不至于失败
1) 只有作为页高速缓存的物理页面才会存在于list中。(我想这里原作者是指除free_list的链表)
2) 如果一个页面是匿名(指匿名映射)页面,那么不会存在任何list中。
3) 如果一个被加入page cache和swap cache 的页面不来自于任何list,那么它将被添加到active_list中去。
4) 以下列举的函数都是把page添加到active_list:
age_page_up() add_to_page_cache()
swap_cache
1、swap_cache属于页高速缓存(page cache)的一部分
2、只有那些在swap_cache中脏的页面才会被交换出去(swap out)
kswapd()
refill_inactive() -
basic idea
do_try_to_free_pages() - basic idea