티스토리 뷰
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); // 빠질수도 있구나
'개발 > 코드로 알아보는 ARM 리눅스 커널 TIL' 카테고리의 다른 글
20241019 4.6 페이지 할당자 (p356) (0) | 2024.11.20 |
---|---|
20241012 4.4.4 버디 시스템의 페이지 해제 (p336) ~ 4.5 pcp (355) (0) | 2024.11.20 |
20240928 4.4 버디 시스템 (p309) (0) | 2024.11.16 |
20240921 4.3.3 vmemmap 을 사용하는 sparse 메모리 모델 (p277) (1) | 2024.11.16 |
20240907 4.2.2 메모리 맵 (p249) & 4.3 존 (p.254) (0) | 2024.11.16 |
- Total
- Today
- Yesterday
- vr핏
- 영상 픽셀화 하기
- red underline
- Visual Studio
- C++
- boost
- Reciprocal n-body Collision Avoidance
- cockroach db
- vrpit
- 면접
- SuffixArray
- ad skip
- 봄날에 스케치
- 클래스 맴버 변수 출력하기
- 코어 남기기
- hole-punching
- Quest2
- 에러 위치 찾기
- mysql
- Golang
- print shared_ptr class member variable
- 우리는 vr핏이라고 부릅니다
- RVO
- set value
- it's called a vrpit
- chrome-extension
- Obstacle Avoidance
- 잘못된 빨간줄
- 카카오
- shared_from_this
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |