티스토리 뷰

Page: 가상 메모리에서 사용되는 단위.
Page Frame: 물리 메모리에서 사용되는 단위.

PageDescriptor : PageFrame 의 상태 정보. memmap 으로 사용

페이지 지울때

 

static inline void rmv_page_order(struct page *page)
{
__ClearPageBuddy(page);
set_page_private(page, 0);
}

static inline void __ClearPageBuddy(struct page *page)
{
VM_BUG_ON_PAGE(!PageBuddy(page), page);
atomic_set(&page->_mapcount, -1);
}



page 의 private 변수는 여러 용도로 쓰이지만 버디에서는 이렇게 사용
- 버디 시스템에서 private 필드는 페이지가 free 상태일 때 페이지의 자유 목록에서의 연결 정보와 페이지 블록의 크기 등을 관리하는 데 사용됩니다.
- 이 필드는 페이지 할당 및 해제 시 메모리 관리의 효율성을 높이기 위한 필수적인 정보를 저장하는 멀티퍼포즈 필드로 활용됩니다.

 

그러니까 너무 작은 곳에서는 migrate 를 스틸하지 않길 원하는거구나
ChatGPT의 말:
ChatGPT
네, 맞습니다! 이 함수는 너무 작은 메모리 할당 요청에서는 다른 migrate type에서 페이지를 스틸(차용)하지 않기를 원하는 구조입니다. 이유는 **파편화(fragmentation)**를 최소화하기 위해서입니다.

작은 페이지 할당 요청이 여러 곳에서 발생하면, 여러 페이지 블록이 오염되어 메모리 파편화가 심해질 수 있습니다. 특히 MIGRATE_RECLAIMABLE(회수 가능한 페이지)나 MIGRATE_UNMOVABLE(움직일 수 없는 페이지) 같은 블록에 작은 크기의 할당이 들어오면, 이후에 그 블록이 효율적으로 사용되지 못할 가능성이 커집니다.

따라서, 이 함수는 할당 크기가 충분히 크거나, 특정 조건이 충족될 때에만 페이지 블록을 스틸하는 방식으로 동작하며, 작은 할당 요청은 다른 블록을 오염시키지 않고 처리하려고 합니다.

결론적으로, 작은 할당은 다른 블록을 스틸하는 것을 피하고, 큰 할당은 필요시 페이지 블록 전체를 차용하여 메모리 관리 효율을 높이려는 전략입니다.


버디에서 페이지 블록을 관리할때는 사실 `struct page` 하나가 대표해서 관리하는듯. 그러니 page 가 migrate 타입을 블록을 대표해서 갖지

페이지 블록 사이즈는 애초에 메모리를 처음 가져올때 쓰는 단위일지도 모르겠다. 예를들어 RAM 에 4kb 만 있는데 page order 가 4 면 애초에 버디에 안넣는다던지?

start_pfn = start_pfn & ~(pageblock_nr_pages-1);
move_freepages_block() <- page_alloc.c:1676

expand 때는 page 의 migrate type 을 바꾸지는 않고, free_list 만 migrate 타입에 맞춰서 넣는데, steal 을 하면 page 에 속성까지 바꿈

pageblock_order의 정의는 동일한 migratetype을 가지는 연속된 페이지 묶음입니다. order=10인 페이지 덩어리는 동일한 mt를 가지지않는게 맞는것 같습니다

page compound
https://hyeyoo.com/173

free_one_page 시 zone 의 NR_PAGES_SCANNED 를 지우는 이유
커널이 메모리 회수 시스템을 가동시킬 때, 페이지 블록들을 스캔하면서 각 페이지 블록을 isolation 진행함. 이때 MIGRATE_ISOLATE 타입을 사용

339: MAX_ORDER 랑 pageblock_order 다름. hugepage 사용하는 경우 pageblock_order = 9

--
버디에서 해제시 __free_one_page

 

combined_idx = buddy_idx & page_idx; // 더 작은거
page = page + (combined_idx - page_idx); // 빠질수도 있구나

 

댓글