물리 메모리 구성 및 커널 가상 주소 관리

sungho·2024년 12월 2일
0

가상 메모리

목록 보기
4/11

1. 물리 메모리 구성요소

페이지 프레임 디스크립터

  • 페이지 프레임 디스크립터는 물리 메모리의 페이지 프레임에 대한 정보를 저장하는 구조체
  • 페이지의 상태, 참조 카운트, 메모리 할당 정보 등을 포함
  • 커널이 메모리 할당 및 해제를 관리하는 역할

물리 메모리를 여러 개의 존으로 나누어 관리합니다. 서로 다른 메모리 요구 사항을 가진 프로세스에 맞춰 최적화되어 있습니다.

  • ZONE_DMA
    • DMA(Direct Memory Access) 장치가 접근할 수 있는 메모리 영역
    • 16MB 이하의 메모리로 제한
  • ZONE_NORMAL
    • 프로세스가 사용할 수 있는 메모리 영역
    • 물리 메모리의 대부분을 차지
  • ZONE_HIGHMEM
    • 32비트 시스템에서 사용되는 고메모리 영역(커널이 직접 접근할 수 없는 메모리)
    • 유저 프로세스에 의해 사용

노드

  • NUMA 아키텍처를 지원하기 위해 노드 개념을 도입
    • 노드는 프로세서와 물리 메모리의 집합으로 구성
    • 독립적으로 메모리에 접근
    • 메모리 접근 지연을 줄이고 성능을 향상

디스크립터 관계

  • 페이지 프레임 디스크립터는 페이지 프레임과 관련된 정보를 저장하고 메모리 관리

노드 데이터 구조

  • pg_data_t 배열
    • 노드의 메모리 관리를 위한 기본 구조
  • node_zones
    • DMA, NORMAL, HIGH-MEM 메모리 영역을 관리
  • free lists를 통해 스와핑 관리

페이지 상태 관리

  • UNEVICTABLE부터 ACTIVE-FILE까지 페이지 상태를 관리
  • ACTIVE/INACTIVE 통해 메모리 회수 정책을 결정
  • struct page 포인터를 통해 스와핑을 처리

Buddy 시스템과 페이지셋

  • Order 0-10까지의 free page lists로 메모리 할당을 관리
  • per migrate-type으로 페이지 이동 처리
  • CPU별 페이지셋으로 동시성을 관리

HIGHMEM

  • 32비트 시스템에서 896MB 이상의 물리 메모리를 관리하기 위한 특별한 메모리 영역
  • 커널이 직접 접근할 수 없는 메모리 영역을 효율적으로 관리하기 위해 설계
  • Reserved 영역(128MB)을 통해 임시적으로 매핑하여 접근
  • 커널은 ZONE_HIGHMEM 영역에 직접 접근 불가

  • 가상 메모리 구조
    • 전체 4GB 크기의 주소 공간
    • 최상단 Reserved 영역 (128MB)
    • 중간 Kernel 영역 (3GB~4GB)
    • 하단 User 영역 (0~3GB)
  • 물리적 메모리 구성
    • ZONE_HIGHMEM
      • 896MB 이상의 메모리 영역
    • ZONE_NORMAL
      • 0~896MB 영역
    • 점선으로 표시된 매핑 관계는 가상 메모리와 물리 메모리 간의 변환을 나타냄
  • 매핑 관계
    • User 영역은 ZONE_NORMAL과 ZONE_HIGHMEM 모두에 매핑 가능
    • Kernel 영역은 주로 ZONE_NORMAL에 직접 매핑
    • Reserved 영역은 ZONE_HIGHMEM 접근을 위한 임시 매핑 공간으로 활용

2. TLB(Translation Lookaside Buffer)

  • 주소 변환을 빠르게 수행하기 위한 캐시
  • 최근에 사용된 페이지 테이블 엔트리를 저장하여 페이지 테이블에 접근하는 시간 감소
  • TLB의 크기는 보통 16~256개의 엔트리를 가지며 LRU(Least Recently Used) 알고리즘을 사용하여 교체 정책을 결정

3. 페이지 테이블 구조

  • 페이지 테이블은 가상 주소를 물리 주소로 변환하는 데 사용되는 데이터 구조
  • 프로세스에 대해 독립적으로 유지
  • 페이지 테이블 엔트리는 해당 페이지의 물리 주소와 상태 정보를 포함
  • 메모리 사용을 최적화하고 페이지 테이블의 크기를 줄이는 데 기여

4. 가상/물리 메모리 맵

  • 가상 메모리와 물리 메모리 간의 매핑을 관리
  • 가상 메모리는 프로세스가 사용하는 논리적 주소 공간이며 물리 메모리는 실제 하드웨어 메모리
  • 페이지 테이블을 사용하여 가상 주소를 물리 주소로 변환
  • 매핑은 페이지 폴트가 발생할 때마다 업데이트

주소 공간 분할

  • 0-3GB
    • 프로세스 주소 공간
  • 3GB-4GB
    • 커널 주소 공간
  • PAGE_OFFSET을 기준으로 유저/커널 영역 구분

커널 영역 구성

  • ZONE_DMA
    • 16MB까지의 DMA 가능 영역
  • ZONE_NORMAL
    • 896MB 크기의 일반 메모리 영역
  • vmalloc area
    • 동적 메모리 할당 영역
  • kmap space
    • 임시 매핑 공간
  • Fixed addr mapping
    • 고정 주소 매핑 영역

메모리 매핑 방식

  • 유저 페이지 테이블
    • 프로세스의 가상-물리 주소 매핑
  • 커널 영역
    • 선형 매핑(linear addr - PAGE_OFFSET)
  • ZONE_NORMAL
    • PTE 매핑으로 관리
  • kmap/kmap_atomic
    • 고차 메모리 접근을 위한 동적 매핑

5. 메모리 압축 및 투명한 대형 페이지

메모리 압축

  • 메모리 압축은 사용 가능한 메모리 용량을 늘리기 위해 메모리 페이지를 압축하는 기술
    • 메모리 사용량을 줄이고 페이지 교체를 최소화하여 성능을 향상
    • zswap과 같은 메모리 압축 기능을 제공하여 페이지를 압축하여 스왑 공간에 저장

투명한 대형 페이지 (Transparent Huge Pages)

  • 일반 페이지 대신 큰 페이지를 사용하여 페이지 테이블의 크기를 줄이고 페이지 폴트 발생 빈도를 낮추어 성능을 향상시키는 기술
    • 일반적으로 2MB 또는 1GB 크기
    • 데이터베이스와 같은 메모리 집약적인 애플리케이션에서 유용하게 사용

6. 시스템 호출

  • mmap
    • 파일이나 장치를 메모리에 매핑하는 데 사용

    • 메모리 매핑을 통해 파일의 내용을 메모리에서 직접 접근

      #include <sys/mman.h>
      #include <fcntl.h>
      #include <unistd.h>
      
      int main() {
          int fd = open("example.txt", O_RDONLY);
          size_t length = 4096; // 매핑할 크기
          char *map = mmap(NULL, length, PROT_READ, MAP_PRIVATE, fd, 0);
          if (map == MAP_FAILED) {
              perror("mmap");
              return 1;
          }
          // 파일 내용 사용
          munmap(map, length);
          close(fd);
          return 0;
      }
      
  • brk 및 sbrk
    • 프로세스의 힙 영역을 확장하거나 축소하는 데 사용

    • brk는 힙의 끝 주소를 설정

    • sbrk는 힙의 크기를 증가시키거나 감소

      #include <unistd.h>
      
      int main() {
          void *old_brk = sbrk(0); // 현재 힙의 끝 주소를 가져옴
          sbrk(1024); // 힙을 1024바이트 증가
          return 0;
      }
      

7. 메모리 관리 방법

  • 메모리 누수

    • 할당된 메모리를 해제하지 않으면 메모리 누수가 발생
    • 모든 동적 메모리 할당 후에는 반드시 해제를 수행 필요
  • 페이지 폴트

    • 페이지 폴트가 자주 발생하면 성능이 저하
    • 메모리 접근 패턴을 최적화하거나 대규모 페이지를 사용하는 것이 좋음
  • 디버깅 팁

    • valgrind
      • 메모리 누수를 검사하고, 메모리 오류를 찾는 데 유용한 도구
    • /proc/PID/maps
      • 특정 프로세스의 메모리 맵을 확인하여 메모리 사용 현황을 파악

8. 결론

물리 메모리 구성 및 가상 주소 관리는 운영 체제의 성능과 안정성에 중요한 기능을 합니다. 페이지 프레임 디스크립터, 존, 노드, HIGHMEM, TLB, 페이지 테이블 구조, 메모리 압축, 투명한 대형 페이지, 메모리 관리 개선 사항 등 다양한 구성 요소를 통해 메모리 관리의 효율성을 높일 수 있습니다.

0개의 댓글