- 论坛徽章:
- 0
|
vmscan.c文件中,在shrink_page_list进行具体的页面回收过程中,有段代码的作用百思不得其解:
references = page_check_references(page, sc);
switch (references) {
case PAGEREF_ACTIVATE:
goto activate_locked;
case PAGEREF_KEEP:
goto keep_locked;
case PAGEREF_RECLAIM:
case PAGEREF_RECLAIM_CLEAN:
; /* try to reclaim the page below */
}
page_check_references内部为何要去调用page_referenced检查引用改页面的页表项数目呢?而且根据该函数的作用,如果有页表项引用该页,返回的不是PAGEREF_ACTIVATE就是PAGEREF_KEEP,从而不会对这个页进行回收,但是这样的思路好像不对啊;shrink_page_list在回收页面时,会通过page_check_references函数后面的try_to_unmap函数更新引用该页的页表项的啊,那么和page_check_references不是就矛盾了嘛。
try_to_unmap会更新引用该页的所有页表项,然后回收该页,而之前的 page_check_references会检查该页是否有页表项,有则不进行回收;前后矛盾了呢?
望高手解答,谢谢。 |
|