- 论坛徽章:
- 0
|
本帖最后由 blake326 于 2012-05-24 17:20 编辑
回复 7# embeddedlwp
我说的buffer/cache 是指的cat 一个文件,通过系统调用read,而产生的page。并没有包括mmap的文件映射page。虽然这两种page都属于buffer/cache。
因为我说的直接read系统调用的buffer/cache page是最多的。比如说grep xxx . -rn 查找字符串什么的。通过free命令会发现cache会急速的增长。
所以我根据page的回收机制和重要性重新分了下,buffer/cache, annon, mmap三种。
read系统调用涉及到两种 buffer/cache, anon.
对于kernel来说,我说的buffer/cache, mmap 的page都是cache。但是,它们的重要性却不同。回收内存时有点区别。
-------------------------------------------------------------------------------------------------
int page_referenced(struct page *page,
int is_locked,
struct mem_cgroup *mem_cont,
unsigned long *vm_flags)
{
int referenced = 0;
int we_locked = 0;
*vm_flags = 0;
if (page_mapped(page) && page_rmapping(page)) { //下面都没用了。对于read系统调用产生的cache.buffer
if (!is_locked && (!PageAnon(page) || PageKsm(page))) {
we_locked = trylock_page(page);
if (!we_locked) {
referenced++;
goto out;
}
}
if (unlikely(PageKsm(page)))
referenced += page_referenced_ksm(page, mem_cont,
vm_flags);
else if (PageAnon(page))
referenced += page_referenced_anon(page, mem_cont,
vm_flags);
else if (page->mapping) //我说的read系统调用出来的buffer/cache, page_mapped(page)都没有成立,肯定不会走了。
referenced += page_referenced_file(page, mem_cont,
vm_flags);
if (we_locked)
unlock_page(page);
}
out:
if (page_test_and_clear_young(page))
referenced++;
return referenced;
} |
|