- 论坛徽章:
- 0
|
本帖最后由 blake326 于 2012-04-26 11:13 编辑
回复 1# embeddedlwp
说一下我的理解把。
首先:每个管理区都知道自己有哪几种页框,都在哪里,怎么管理。具体来说有:伙伴系统的free_area,每cpu页框高速缓存per_cpu_pageset,还有几个lru链表分别存放了inactive、active的匿名页框和文件映射页框以及一个不可以回收的lru链表。
ps:我觉得保留页框其实也是free_area的一部分,只有在特殊的情况下,才能使用到。
内存管理就是管理页框在这些区域中流动。分配页框直接从free_area或者per_cpu_pageset获取,一般用户态进程获取到的页框都会加入到lru链表,当free_area不足时,就要从lru释放页框回来,具体的就是转移一部分active的lru页框到inactive页框,释放一部分inactive的lru页框直接到per_cpu_pageset。per_cpu_pageset在适当的时机释放给free_area。
内存不足时:
do_try_to_free_pages
->shrink_zones
->shrink_zone
->对for_each_evictable_lru执行shrink_list
->对于active的lru执行shrink_active_list,对于inactive的lru执行shrink_inactive_list
->shrink_inactive_list
isolate_pages_global取出一定数量的可以释放的页框调用shrink_page_list来释放他们.
->shrink_page_list
对每个page分别进行释放:
如果正在写回,则等待它写回完成。
如果页框是referenced的则不能释放,SetPageActive从而回到上面的shrink_inactive_list会将该页框添加到active lru(inactive lru里面的page本身都是referenced清除的,但是如果又被访问的话则重新设置),则继续下一个page。
如果页框有一个或者多个页表项映射它_mapcount>=0,通过反向映射解除关系。
如果page是dirty的,写出去。
如果page是块缓冲的,释放相关buffer_head。
如果page映射到文件,解除该page和rbtree cache的关系。(你讲得地方,该页已经要呗释放了,不能再通过rbtree cache找到它来访问了)
所有可以被释放的page将会通过free_page_list来释放到per_cpu_pageset,从而释放到free_area。
|
|