Linux内核源代码情景分析-内存管理之恢复映射

    refill_inactive_scan和swap_out,把活跃的页面变成不活跃脏的页面。挑选的原则是最近没有被访问,且age小于0。

    page_launder,把不活跃脏的页面变成不活跃干净的页面。


    不活跃脏的页面,有如下特点:

    使用计数为1;

    page->list链入mapping->dirty_pages/clean_pages;

    page->next_hash和page->pprev_hash链入全局的Hash表;

    page->lru链入了全局的inactive_dirty_list;

    page->flags对应为设置为PG_dirty。


    不活跃干净的页面,有如下特点:

    使用计数为1;

    page->list链入mapping->dirty_pages/clean_pages(保持原样);

    page->next_hash和page->pprev_hash链入全局的Hash表;

    page->lru链入了page->zone->inactive_clean_list;


    如果发生缺页中断,再次访问到这个页面,那么会调用lookup_swap_cache,会在全局的Hash表找到对应的页面,并且引用计数加1,变成2,但还没有移到活跃队列中。什么时候转移到活跃队列中呢?

    答案在,page_launder和reclaim_page中。

    page_launder:

if (PageTestandClearReferenced(page) || page->age > 0 ||   //此时引用计数大于1 
                (!page->buffers && page_count(page) > 1) ||  
                page_ramdisk(page)) {  
            del_page_from_inactive_dirty_list(page);  
            add_page_to_active_list(page);  
            continue;  
} 
    

    reclaim_page:

if (PageTestandClearReferenced(page) || page->age > 0 ||  
                (!page->buffers && page_count(page) > 1)) {//此时引用计数大于1
            del_page_from_inactive_clean_list(page);  
            add_page_to_active_list(page);  
            continue;  
}  

你可能感兴趣的:(Linux内核源代码情景分析-内存管理之恢复映射)