본문 바로가기

기술/Linux

리눅스 Linux) Migration Types of page (page type)

Migration Types of page (=page type)


  • 메모리를 연속적인 페이지 (페이지 블록) 단위로 나눔
    • 첫 3bit로 각 페이지 블록의 migration type 표현
    • 페이지 블록마다 4bit 비트맵으로 migration 속성 표현
  •  같은 속성의 페이지를 가능한 그룹화하여 연속된 메모리의 단편화 억제
  • free_area[order].free_list[migration type]
  • 메모리가 migration type 별로 1개 이상의 페이지 블록을 확보하지 못하는 시스템은 모든 페이지를 unmovable로 구성한다.

  1. MIGRATE_UNMOVABLE
    • 메모리 내에서 위치가 변경 X, migration X
    • ⇒ 커널에서 할당한 페이지, 슬랩, IO 버퍼, 커널 스택, 페이지 테이블 등
  2. MIGRATE_MOVABLE
    • 메모리 내에서 위치 변경 O, migration O
    • 연속적인 큰 메모리 공간 필요한 경우, 현재 사용되는 movable page를 이동시켜 최대한 단편화를 줄인다.
    • 페이지 테이블 내의 정보를 이용하여 위치 변경 가능
    • ⇒ user application에 의해 할당된 페이지 테이블로 맵핑
  3. MIGRATE_RECLAIMABLE
    • 메모리 내에서 이동은 불가능하지만 kswapd 등에 의해 reclaim 가능
    • 메모리가 부족한 경우 메모리 회수가 가능한 경우
    • ⇒> __GFP_RECLAIMABLE 플래그로 지정한 슬랩 캐시
  4. MIGRATE_PCPTYPES
    • per-CPU cache가 가진 migrate type까지를 나타내기 위한 기준점
  5. MIGRATE_HIGHATOMIC = MIGRATE_PCPTYPES
    • high order 페이지 atomic 할당 요청을 대비하여 1블럭씩 미리 예약해 둠 (최대 1%)
  6. MIGRATE_CMA
    • 물리적으로 연속된 메모리를 할당하는 CMA 할당자에 의해 관리되는 페이지
    • CMA 요청시 이 영역이 부족하면 movable 페이지를 다른 영역으로 이동시킨다.
    • CMA 페이지로 할당되면 각 페이지들의 할당 및 관리는 별도로 수행
    • ⇒ 커널이 DMA 등으로 사용시
  7. 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 시키는 비트