函数分析-----page_check_references shrink_active_list mark_page_accessed
首先看看页面扫描回收大概过程, 然后分析三个函数如何进行页面状态变换
1.首先扫描非活跃链表中,然后当空闲页面不够时,扫描活动链表,并将相应页面状态变换。
2.然后回收非活跃链表,没有设置页描述符的字段 flags位PG_referenced页。
一.mark_page_accessed函数
mark_page_accessed函数设置页框访问状态,并进行页面状态装换,。(PG_active,PG_referenced)
(0,1)--->(1,0)
(1,0)--->(1,1)
(0,0)--->(0,1)
页面状态装换图如下:
第一个if语句:
将页面状态由 inactive,referenced 转换为 active,unreferenced 即:(0,1)--->(1,0)
将页面放入活动链表,并清空页描述符的字段 flags位PG_referenced值
第二个if语句:
将页面状态由 active,unreferenced 转换为 active,referenced 即:(1,0)--->(1,1)
仍旧保持在活动链表,并设置页描述符的字段 flags位PG_referenced值
将页面状态由 inactive,unreferenced 转换为 inactive,referenced 即:(0,0)--->(0,1)
仍旧保持在非活动链表,并设置页描述符的字段 flags位PG_referenced值
void mark_page_accessed(struct page *page)
{
if (!PageActive(page) && !PageUnevictable(page) &&
PageReferenced(page) && PageLRU(page)) {
activate_page(page);
ClearPageReferenced(page);
} else if (!
首先看看页面扫描回收大概过程, 然后分析三个函数如何进行页面状态变换
1.首先扫描非活跃链表中,然后当空闲页面不够时,扫描活动链表,并将相应页面状态变换。
2.然后回收非活跃链表,没有设置页描述符的字段 flags位PG_referenced页。
一.mark_page_accessed函数
mark_page_accessed函数设置页框访问状态,并进行页面状态装换,。(PG_active,PG_referenced)
(0,1)--->(1,0)
(1,0)--->(1,1)
(0,0)--->(0,1)
页面状态装换图如下:
第一个if语句:
将页面状态由 inactive,referenced 转换为 active,unreferenced 即:(0,1)--->(1,0)
将页面放入活动链表,并清空页描述符的字段 flags位PG_referenced值
第二个if语句:
将页面状态由 active,unreferenced 转换为 active,referenced 即:(1,0)--->(1,1)
仍旧保持在活动链表,并设置页描述符的字段 flags位PG_referenced值
将页面状态由 inactive,unreferenced 转换为 inactive,referenced 即:(0,0)--->(0,1)
仍旧保持在非活动链表,并设置页描述符的字段 flags位PG_referenced值
void mark_page_accessed(struct page *page)
{
if (!PageActive(page) && !PageUnevictable(page) &&
PageReferenced(page) && PageLRU(page)) {
activate_page(page);
ClearPageReferenced(page);
} else if (!