Migration Types of page (=page type)
- 메모리를 연속적인 페이지 (페이지 블록) 단위로 나눔
- 첫 3bit로 각 페이지 블록의 migration type 표현
- 페이지 블록마다 4bit 비트맵으로 migration 속성 표현
- 같은 속성의 페이지를 가능한 그룹화하여 연속된 메모리의 단편화 억제
- free_area[order].free_list[migration type]
- 메모리가 migration type 별로 1개 이상의 페이지 블록을 확보하지 못하는 시스템은 모든 페이지를 unmovable로 구성한다.
- MIGRATE_UNMOVABLE
- 메모리 내에서 위치가 변경 X, migration X
- ⇒ 커널에서 할당한 페이지, 슬랩, IO 버퍼, 커널 스택, 페이지 테이블 등
- MIGRATE_MOVABLE
- 메모리 내에서 위치 변경 O, migration O
- 연속적인 큰 메모리 공간 필요한 경우, 현재 사용되는 movable page를 이동시켜 최대한 단편화를 줄인다.
- 페이지 테이블 내의 정보를 이용하여 위치 변경 가능
- ⇒ user application에 의해 할당된 페이지 테이블로 맵핑
- MIGRATE_RECLAIMABLE
- 메모리 내에서 이동은 불가능하지만 kswapd 등에 의해 reclaim 가능
- 메모리가 부족한 경우 메모리 회수가 가능한 경우
- ⇒> __GFP_RECLAIMABLE 플래그로 지정한 슬랩 캐시
- MIGRATE_PCPTYPES
- per-CPU cache가 가진 migrate type까지를 나타내기 위한 기준점
- MIGRATE_HIGHATOMIC = MIGRATE_PCPTYPES
- high order 페이지 atomic 할당 요청을 대비하여 1블럭씩 미리 예약해 둠 (최대 1%)
- MIGRATE_CMA
- 물리적으로 연속된 메모리를 할당하는 CMA 할당자에 의해 관리되는 페이지
- CMA 요청시 이 영역이 부족하면 movable 페이지를 다른 영역으로 이동시킨다.
- CMA 페이지로 할당되면 각 페이지들의 할당 및 관리는 별도로 수행
- ⇒ 커널이 DMA 등으로 사용시
- MIGRATE_ISOLATE
- 메모리 reclaim 등의 작업이 진행되는 동안 기존 페이지 리스트에서 일단 분리시켜 놓기 위한 virtual page
- ⇒ 버디 시스템에서 절대 사용하지 않음.
- struct zone은 각 page type 별로 free list를 가진다.
- 할당하려는 page block의 type을 만족시키는 page가 해당 zone의 free list에 부족한 경우 다른 type의 free list에서 page를 받아오는 fallback 발생
- gfpflags_to_migratetype(const gfp_t gfp_flags)
- gfp flag : 어떤 migrate type의 page가 필요한지 나타낸다.
- __GFP_MOVABLE ⇒ MIGRATE_MOVABLE type의 page 필요
- __GFP_RECLAMABLE ⇒ MIGRATE_RECLAMABLE type의 page 필요
- else: MIGRATE_UNMOVABLE가 default
- 페이지 블럭은 migration type이 서로 다른 페이지들을 섞어서 가지고 있을 수고 있는데, 이때 그 중 가장 많이 가지고 있는 migration type이 대표 migration type이 된다.
- 대표 migration type 3bit + 1 bit (skip bit) for compaction ⇒ usemap에 저장
- usemap
- 대표 migration type 3 bit : 할당 요청한 페이지의 migration type과 동일한 migration type을 가진 pageblock에서 최대한 할당하려 한다.
- skip bit (1 bit) : 메모리 부족으로 compaction을 수행할 때 compaction을 skip 시키는 비트