본문 바로가기
운영체제&네트워크/운영체제

가상 메모리 구현과 최적화

by GangDev 2024. 5. 30.

가상 메모리를 구현하기 위해 필요한 기술

  • 페이지 교환(Paging): 가상 메모리에서 가장 기본적인 기술 중 하나로, 물리 메모리를 고정된 크기의 블록인 프레임으로 분할하고, 논리 메모리 역시 같은 크기의 페이지로 분할한다. 페이지와 프레임의 크기가 같아야 하며, 프로세스가 실행되는 동안 필요한 페이지만 물리 메모리의 프레임에 적재된다.
  • 요구 페이징(Demand Paging): 프로세스가 실행되는 동안 필요한 페이지만 물리 메모리에 적재하는 방식을 말한다. 이는 I/O 작업의 양과 RAM 메모리 사용량을 줄이고, 시스템의 응답 시간을 개선하며, 더 많은 사용자를 처리할 수 있게 한다.
  • 페이지 테이블(Page Table): 가상 주소를 실제 주소로 변환하는 데 사용되는 자료 구조다. 페이지 테이블은 각 페이지의 위치 정보를 저장하며, MMU(Memory Management Unit)가 페이지 테이블을 참조하여 가상 주소를 실제 주소로 변환한다.
  • 가상 메모리 압축(Virtual Memory Compression): 가상 메모리 공간을 효율적으로 사용하기 위해 사용되는 기술이다.이는 물리 메모리가 부족할 때 사용되며, 메모리 내의 데이터를 압축하여 더 많은 데이터를 저장할 수 있게 한다.

이러한 기술들을 통해 가상 메모리는 물리 메모리보다 더 큰 메모리 공간을 제공하면서도, 효율적인 메모리 관리와 높은 성능을 달성할 수 있다.

페이지 교환 과정

페이지 교환은 가상 메모리 시스템에서 물리 메모리(RAM)의 용량이 부족할 때 발생한다. 프로세스가 실행되면서 필요한 페이지가 물리 메모리에 없을 경우(page fault), 이 페이지를 하드 디스크에서 찾아 빈 프레임에 로딩한다. 하지만, 만약 빈 프레임이 없다면, 이미 메모리에 존재하는 페이지 중 일부를 선택하여 디스크로 내보내고(newly loaded page), 그 자리에 새로운 페이지를 로딩하는 과정이 필요하다.

 

이런 상황에서 어떤 페이지를 디스크로 내보낼지를 결정하는 것이 페이지 교체 알고리즘의 역할이다. 페이지 교체 알고리즘은 새로 올릴 페이지와 교체할 희생 프레임을 찾는 알고리즘으로, 다양한 방식이 존재한다.

 

계수-기반(Counting-Based) 페이지 교체 알고리즘은 페이지 참조 시마다 각 페이지가 현재까지 참조된 횟수를 카운팅하는 방법이다. 이 방법을 바탕으로 여러 알고리즘이 만들어질 수 있는데, 대표적으로 LFU(Least Frequently Used)와 MFU(Most Frequently Used) 등이 있다.

  • LFU(Least Frequently Used): 가장 적게 참조된 페이지를 교체하는 방식이다. 즉, 참조 횟수가 가장 낮은 페이지를 선택하여 디스크로 내보낸다.
  • MFU(Most Frequently Used): 가장 많이 참조된 페이지를 교체하는 방식이다. 이는 참조 횟수가 가장 높은 페이지를 선택하여 디스크로 내보낸다.

이러한 페이지 교체 알고리즘들은 시스템의 메모리 사용 패턴과 요구 사항에 따라 선택하여 사용된다. 페이지 교환 과정은 운영 체제의 메모리 관리자에 의해 자동으로 관리되며, 이는 시스템의 성능과 효율성을 유지하는 데 중요한 역할을 한다.

가상 메모리 압축이 필요한 상황

  • 물리 메모리 부족: 컴퓨터의 RAM이 부족하여 실행 중인 프로그램이나 프로세스가 필요한 메모리를 충분히 할당받지 못할 때 가상 메모리 압축이 필요하다. 이는 시스템의 성능 저하를 방지하고, 더 많은 프로그램을 동시에 실행할 수 있게 해준다.
  • 메모리 효율성 향상: 가상 메모리 압축은 메모리 사용 효율성을 높이는 데 도움을 준다. 메모리 내의 데이터를 압축하여 더 많은 데이터를 저장할 수 있게 하므로, 전체적인 메모리 사용률을 최적화할 수 있다.
  • 메모리 오류 해결: 메모리의 내부 오류를 점검하고 복구할 수 있는 도구를 사용할 때, 가상 메모리 압축은 문제 해결 과정에서 유용할 수 있다. 메모리 오류가 발생했을 때, 압축을 통해 메모리 사용 패턴을 분석하고 문제를 식별하는 데 도움을 줄 수 있다.
  • 백그라운드 프로세스 관리: 윈도우 운영 체제에서는 백그라운드 프로세스들이 상당량의 메모리를 사용할 수 있다. 이러한 프로세스들의 메모리 사용량을 관리하고 최적화하기 위해 가상 메모리 압축 기술을 활용할 수 있다.

이러한 상황에서 가상 메모리 압축은 시스템의 메모리 관리를 개선하고, 메모리 부족 문제를 해결하며, 전체적인 시스템 성능을 향상시키는 데 중요한 역할을 한다.

페이지와 프레임의 크기를 결정하는 기준

페이지와 프레임의 크기를 결정하는 것은 주로 하드웨어 아키텍처에 의해 이루어진다. 가상 메모리 시스템에서 페이지와 프레임은 서로 동일한 크기를 가지며, 이는 메모리 관리 단위를 정의하는 데 필수적이다. 예를 들어, Linux에서 x86-64 프로세서를 사용하는 경우, 일반적으로 페이지 크기는 4096 바이트(4KB)로 설정된다.

 

페이지 크기는 시스템의 메모리 관리에 영향을 미친다. 작은 페이지 크기는 더 세밀한 메모리 관리를 가능하게 하지만, 페이지 테이블의 크기를 증가시키고, 메모리 접근 시간을 늘릴 수 있다. 반대로 큰 페이지 크기는 페이지 테이블의 크기를 줄이고, 메모리 접근 시간을 줄일 수 있지만, 메모리 낭비를 초래할 수 있다.

 

현대 CPU는 여러 페이지 크기를 지원하며, 같은 주소 공간 내에서도 다른 페이지 크기를 사용할 수 있다. 예를 들어, Intel x86-64 아키텍처는 4KB, 2MB, 1GB 크기의 페이지를 지원한다. 이러한 페이지 크기들은 멀티레벨 멀티레벨 페이지 테이블의 다른 레벨에서 주소 공간을 다루는 데 사용된다.

 

따라서, 페이지와 프레임의 크기를 결정하는 것은 하드웨어 아키텍처와 운영 체제의 요구 사항에 따라 달라진다. 이는 시스템의 메모리 관리 효율성과 성능에 직접적인 영향을 미친다.

페이지 크기가 클 때 발생할 수 있는 메모리 낭비를 줄이는 방법

  • Copy-on-write(CoW) 기법 사용: CoW는 프로세스가 메모리를 수정하기 전까지 실제 메모리 복사를 지연시키는 기법이다. 이는 프로세스가 메모리를 읽기 전용으로 사용할 때 유용하며, 실제로 메모리를 수정할 때만 복사가 이루어지므로 메모리 낭비를 줄일 수 있다.
  • 대형 페이지(Large Pages) 사용: 대형 페이지는 일반적인 페이지 크기보다 훨씬 큰 페이지를 사용하여 TLB(Translation Lookaside Buffer) 캐시의 압력을 줄이는 기법이다. 이는 메모리 집약적인 워크로드에서 성능을 크게 향상시킬 수 있으며, 메모리 낭비를 줄이는 데 도움이 된다. 예를 들어, x86-64 아키텍처에서는 2MB와 1GB 크기의 페이지를 사용할 수 있다.
  • -transparent Huge Pages(THP) 활성화: THP는 런타임에 페이지 크기를 동적으로 조정하여 메모리 사용 효율성을 높이는 Linux의 기능이다. 이는 자동으로 큰 페이지를 사용하여 메모리 접근 시간을 줄이고, 메모리 낭비를 최소화할 수 있다.
  • HugeTLB 페이지 사용: HugeTLB 페이지는 OS에 의해 사전에 할당된 대형 페이지로, 애플리케이션이 mmap() 함수를 사용하여 이 풀에서 페이지를 예약할 수 있다. 이는 JVM에서 대형 페이지를 사용하는 기본 방법으로, "-XX:+UseLargePages" 또는 "-XX:+UseHugeTLBFS" 플래그를 설정하여 활성화할 수 있다.

이러한 방법들을 통해 페이지 크기가 큰 경우에도 메모리 낭비를 최소화하고, 시스템의 성능을 최적화할 수 있다.