page
简述
page 分配器分配内存策略,以 low 水位线为中间值,分为 快速路径分配与慢速路径分配
快速路径分配, 当
目前系统内存 > low 水位线
,直接从 page 分配器中分配内存慢速路径分配, 当
min 水位线 < 目前系统内存 <= low 水位线
, 唤醒 kswapd 线程进行后台回收内存,然后从 page 分配器中分配内存慢速路径分配, 当
目前系统内存 <= min 水位线
,执行紧急直接内存回收, 当目前系统内存 > min 水位线
时,再从 page 分配器中分配内存
函数调用关系如下:
__alloc_pages()
get_page_from_freelist(alloc_flags = ALLOC_WMARK_LOW)
__alloc_pages_slowpath()
alloc_flags = gfp_to_alloc_flags(gfp_mask)
wake_all_kswapds()
get_page_from_freelist(alloc_flags = ALLOC_WMARK_MIN)
__alloc_pages_direct_reclaim()
详细解析
get_page_from_freelist()
零散知识点
get_page()/folio_get()
对 page/folio 的引用次数加一put_page()/folio_put()
对 page/folio 的引用次数减一,同时判断引用次数是否 已经达到0?如果是,将 page/folio 释放回 buddy 子系统中; 否则,什么都不做。 详细函数调用关系如下:
put_page()
folio_put()
folio_put_testzero()
__folio_put()
__folio_put()
__folio_put_large()
destroy_large_folio()
__folio_put_small()
__page_cache_release()
if is lru to call lruvec_del_folio()
free_unref_page()
每一个 zone 都有独立的 high、low、min 的水位线(watermark)
Last updated
Was this helpful?