Q&A 게시판

리눅스 커널에 대한 Q&A 게시판 입니다. (비밀글 체크는 꼭 필요한 경우에만)

Zone의 필요성에 대하여.

작성자
Li린이
작성일
2018-04-05 10:54
조회
625
Linux Kernel공부를 막 시작한 초심자입니다.
블로그에 써주신글에 많은 도움 받고있습니다.
항상 감사드립니다.

Kernel memory management에 대해서 공부하는 도중,
ZONE과 BUDDY에 관련된 질문이 있어서 이렇게 글을 올립니다.

제가 가지고 있는 Target Board는 64bit ARM UMA machine입니다.
memory layout에 상당한 Hole이 있어서, SPARSE memory를 사용합니다.
Node 0번에 3G의 Physical memory가 있고 하나의 ZONE인 ZONE_DMA로 설정되어 있습니다.

64bit의 경우 NORMAL/ DMA/ MOVABLE/ DEVICE를 사용하는 걸로 학습하였습니다.
용도는
-NORMAL: default
-DMA ZONE: DMA 디바이스의 64bit address의 모든 공간에 접근이 한정되어, 접근가능한 주소를 지정해 줘야 되는 경우
-MOVABLE: Movable mobility를 가진 메모리와 Hot plugged memory 관리에 유리하여 사용
-DEVICE: persistent memory 디바이스 및 heterogeneous memory 디바이스 등에서 사용하기 위해서
입니다.

ZONE DMA의 필요성에 대해서는 이해하였습니다.
그러나 최근 똘똘해진 Buddy allocator가 각 ZONE마다 Free_list[MIGRATE_TYPE]을 통해 Movable memory가 관리되고 있는 상황에서 ZONE_Movable을 사용하면 구체적으로 어떤 효과가 있어서 별도의 ZONE을 선언해가면서 까지 사용하는지 궁금합니다. (ZONE_MOVABLE에서는 free_list에 entry가 하나만 존재한다던지....)
또한, persistent memory 디바이스 및 heterogeneous memory 디바이스 그리고 고속인터페이스를 사용하기 위해서는 반드시 ZONE_DEVICE가 필요한지 여쭙고 싶습니다.

질문을 정리하면..
ZONE_NORMAL과 ZONE_DMA : 2중하나는 반드시 존재해야함.
ZONE_MOVABLE / ZONE_DEVICE : Optional
이 맞는지 여쭙니다.

항상 가르침과 도움에 감사드립니다 🙂
전체 3
  • 2018-04-05 17:25
    먼저 제 글을 잘 읽어주셔서 감사합니다.

    각각의 존(zone) 영역에 대해 이미 완벽하게 이해가 된 상태로 보입니다.

    잘 이해하신 것처럼 arm64 커널에서 CONFIG_ZONE_DMA=y로 기본 설정되어 있는 경우가 많아 DMA 존이 활성화되어 있습니다. 또한 DMA 영역을 주메모리 영역의 일부로 제한하지 않으면 normal ZONE과 분리할 필요도 없이 DMA 존 또는 NORMAL 존만으로 모든 주 메모리의 커버가 가능합니다. 물론 MOVABLE 존이나 DEVICE 존을 사용하지 않는다는 전제입니다.


    질문하신 내용을 정리하자면,

    1) ZONE_NORMAL과 ZONE_DMA: 2중 하나는 반드시 존재해야 함 -> 예 맞습니다.

    2) ZONE_MOVABLE과 ZONE_DEVICE: Optional -> 예 맞습니다.

    3) ZONE_MOVABLE의 효용성
    - 버디 할당자에서 메모리 단편화가 많아지는 경우 compaction을 통해 페이지들을 이동시키는 방법으로 단편화를 줄일 수 있습니다. 그러나 페이지 블록 중간 특정 페이지들이 unmovable mobility 성격으로 할당된 메모리(주로 커널등에서 사용하는 slab 등)들은 이동이 불가능해 단편화를 피할 방법이 없습니다. 대부분의 유저 application에서 사용하는 메모리 할당은 movable 페이지들을 요청합니다. 커널에서 할당받는 unmovable 페이지들과 유저에서 할당받는 movable 페이지들의 할당과 해제가 엄청나게 많이 반복되면 단편화를 역시 피할수 없겠죠? 따라서 이러한 할당 해제가 많은 application들을 설계해야 하는 경우 커널 설정을 바꾸어 일부를 ZONE_NORMAL(또는 ZONE_DMA)로 하고 나머지를 ZONE_MOVABLE로 할당해두면 커널에서 할당 요청하는 unmovable 페이지 요청들이 ZONE_MOVABLE 영역을 피하게 됩니다. 조금 복잡하게 설명했는데 이해가 안가시면 다시 요청하시면 추가 설명하겠습니다.
    - 두 번째 용도로는 memory hot plug/remove를 구현하고자 할 때 커널에서 할당한 unmovable 페이지들이 제거하고자 하는 메모리 영역에 위치하면 해당 메모리를 절대 제거할 수 없습니다. 따라서 분리 가능한 메모리를 구현하기 위한 영역입니다. 주로 메모리 핫플러그/리무브의 하드웨어적인 구현보다 QEMU등의 가상화 프로그램에서 메모리의 추가 및 제거를 OS의 종료 없이 실시간으로 가능하게 하기 위함입니다.

    4) ZONE_DEVICE의 효용성
    - 기존에는 디바이스에서 사용하는 대용량의 특수 메모리에 대해서는 특정 벤더의 드라이버에서 접근이 가능했었습니다. 이러한 특수 디바이스 메모리들을 커널에서 쉽게 접근할 수 있도록 커널 메모리 관리자(페이지 할당자로 사용하는 버디 할당자)를 사용할 수 있게 하자는 것이 핵심입니다. 이렇게 해두면 사용자가 만드는 별도의 커널 디바이스 드라이버 등에서 ZONE_DEVICE의 메모리를 접근할 수 있는 장점이 있습니다. 예를 들어보겠습니다. 그래픽 프로세서 용도로 사용하고 있는 GPU가 8G의 메모리를 사용하는데 이 유저는 3D 그래픽도 잘 사용하지 않아서 2G 메모리만 GPU가 사용하고 나머지는 커널에서 사용할 수 있도록 6G의 메모리를 ZONE_DEVICE로 잡아 추가 메모리로 사용하는 설정을 구사할 수도 있습니다. (이 ZONE_DEVICE 영역은 주 메모리보다 접근 속도가 떨어집니다. 접근 속도가 같으면 별도로 나눌 필요 없겠죠?)

    조금이라도 도움이 되시길 바랍니다.

  • 2022-08-18 15:53
    안녕하세요?
    정말 유익한 질문과 답변 잘 봤습니다.

    저도 현업에서 비슷한 내용으로 고민중에 있습니다.
    "커널에서 할당 요청하는 unmovable 페이지 요청들을 ZONE_MOVABLE 영역을 피하게 됩니다."
    설명하신 이 문장이 커널 어디에 어떻게 구현되어 있는지 찾고 있는데 어디에 어떻게 구현되어 있는지 잘 보이지 않더라구요 ㅠㅠ
    혹시 괜찮으시다면 어떻게 ZONE_MOVABLE은 unmovable page 할당을 피하는지 컨셉이나 어느 코드 부분을 살펴봐야 한다고 조언 주실 수 있으신가요?
    새로 생성한 존에 unmovable 페이지가 들어가지 않게끔 하려고 하는 것이 목적입니다.
    감사합니다!

    • 2022-09-13 15:08
      안녕하세요?
      오래된 글에 댓글을 주셨는데, 제가 보질 못했습니다.
      그래서 아래 페이지에 다시 질문을 올려주셨더군요. ^^;
      http://jake.dothome.co.kr/kboard/?uid=104&mod=document

      감사합니다.

      문영일 드림.