지난 시간에는 프로그램이 실행되는 공간인 메모리의 스택과 힙에 대해 알아보았습니다.
오늘은 그보다 더 근본적인, 운영체제가 메모리를 어떻게 관리하고 착각하게 만드는지에 대한 이야기, 바로
가상 메모리(Virtual Memory)
에 대해 알아보겠습니다.
가상 메모리는 현대 운영체제의 핵심 중의 핵심입니다.
이 기술 덕분에 우리는 실제 물리 메모리(RAM)의 크기보다 더 큰 프로그램을 실행할 수 있고, 여러 프로그램이 서로의 메모리를 침범하지 않고 안전하게 동작할 수 있습니다.
과거의 컴퓨터는 프로그램을 실행할 때, 프로그램 전체를 물리 메모리(RAM)에 한 번에 올려야 했습니다.
이 방식은 두 가지 큰 문제를 가집니다.
메모리 크기의 한계
만약 램이 4GB인데 8GB짜리 프로그램을 실행하려면, 아예 실행조차 할 수 없었습니다.
보안 및 안정성 문제
여러 프로그램을 동시에 실행할 때, 한 프로그램이 다른 프로그램의 메모리 영역을 실수로 침범하여 데이터를 손상시키거나 전체 시스템을 멈추게 할 수 있었습니다.
이 문제를 해결하기 위해, 운영체제는 개발자와 프로그램에게
거대한 가짜 메모리
를 제공하기로 합니다.
이것이 바로
가상 메모리
입니다.
가상 메모리는 각 프로세스에게
실제 물리 메모리와는 독립적인, 매우 크고 연속적인 자신만의 메모리 공간
이 있는 것처럼
보여주는
기술입니다.
이처럼, 가상 메모리 기술은 프로그램의 모든 부분을 메모리에 올리는 대신,
지금 당장 실행에 필요한 부분만 물리 메모리에 올리고, 나머지는 하드디스크와 같은 보조기억장치에 보관
합니다.
그리고 이 둘 사이의 주소를 서로 바꿔 줍니다.
이 덕분에, 각 프로세스는 다른 프로세스와 완전히 분리된
독립적인
메모리 공간을 갖는 것처럼 느끼게 되어 안정성이 크게 향상됩니다.
운영체제는 이것을 어떻게 구현할까요?
바로
페이징
이라는 기법을 사용합니다.
페이지(Page)와 프레임(Frame)
운영체제는 가상 주소 공간
을 페이지(Page)
라는 고정된 크기의 작은 조각으로 나눕니다.
그리고 물리 메모리
또한 페이지와 똑같은 크기의 프레임(Frame)
이라는 조각으로 나눕니다.
페이지 테이블(Page Table)
운영체제는 각 프로세스마다 페이지 테이블이라는 지도책을 가지고 있습니다.
이 지도책에는 어떤 페이지가 어떤 프레임에 저장되어 있는지
에 대한 정보가 기록되어 있습니다.
주소 변환
CPU가 특정 가상 주소에 접근하려고 하면, 하드웨어 장치인 MMU(Memory Management Unit)
가 페이지 테이블을 참조하여 실제 물리 주소로 순식간에 변환해 줍니다.

Paging
책상(물리 메모리)이 가득 찼는데, 도서관(디스크)에서 새로운 책(페이지)을 가져와야 한다면 어떻게 해야 할까요?
당연히, 책상 위에 있는 책 중 하나를 치우고 그 자리에 새 책을 놓아야 합니다.
이처럼, 물리 메모리의 프레임이 모두 사용 중일 때 새로운 페이지를 가져와야 하는 상황을
페이지 폴트(Page Fault)
라고 합니다.
페이지 폴트가 발생하면, 운영체제는 물리 메모리에 있는 기존 페이지 중 하나를 디스크로 내보내고(Swap-out), 새로운 페이지를 그 자리에 가져와야(Swap-in) 합니다.
이때,
어떤 페이지를 내보낼 것인가
를 결정하는 규칙이 바로
페이지 교체 알고리즘
입니다.
가장 좋은 알고리즘은
앞으로 가장 오랫동안 사용되지 않을
페이지를 예측하여 내보내는 것입니다.
✅
LRU (Least Recently Used) 🔗
LRU
는
가장 오랫동안 사용되지 않은 페이지를 교체
하는, 가장 유명하고 직관적인 알고리즘입니다.
최근에 사용된 페이지는 앞으로도 다시 사용될 가능성이 높다는
시간 지역성(Temporal Locality)
원리에 기반합니다.
이 외에도 가장 먼저 들어온 페이지를 교체하는 FIFO(First-In, First-Out) 등 여러 알고리즘이 있지만, LRU가 가장 널리 알려지고 효과적인 방식 중 하나입니다.
가상 메모리는 운영체제 지식의 핵심이므로, 그 원리를 깊이 있게 묻는 질문이 반드시 나옵니다.
✅
1. 가상 메모리가 왜 필요한가요? 그 장점을 설명해주세요. 🔗
가상 메모리가 해결하는 근본적인 문제들을 설명해야 합니다.
가상 메모리는
물리 메모리의 크기 제약을 극복
하고,
프로세스를 안전하게 격리
하기 위해 필요합니다.
첫째, 프로그램의 일부만 물리 메모리에 올려놓고 나머지는 디스크에 두어, 실제 램 크기보다
더 큰
프로그램을 실행할 수 있게 해줍니다.
둘째, 각 프로세스에게 독립적인 가상 주소 공간을 제공하여, 다른 프로세스의 메모리 영역을 침범할 수 없도록 만들어 시스템 전체의
안정성
을 크게 높여줍니다.
✅
2. 페이징 시스템에서 페이지 폴트(Page Fault)란 무엇이며, 어떤 과정으로 처리되나요? 🔗
내부 동작 원리를 순서대로 설명하는 것이 중요합니다.
페이지 폴트는 CPU가 접근하려는 페이지가 현재 물리 메모리에 없는 경우 발생하는
일종의 인터럽트
입니다.
처리 과정은 다음과 같습니다.
- CPU는 MMU를 통해 주소 변환을 시도하지만, 페이지 테이블에 해당 페이지가 없음을 확인하고 운영체제에 트랩(Trap)을 겁니다.
- 운영체제는 해당 페이지가 디스크 어디에 있는지 찾습니다.
- 물리 메모리에 빈 프레임이 없다면, 페이지 교체 알고리즘(예:
LRU
)에 따라 기존 페이지 하나를 디스크로 내보냅니다.
- 비워진 프레임에 디스크에서 가져온 새 페이지를 로드하고, 페이지 테이블을 최신 정보로 업데이트합니다.
- 마지막으로, 중단되었던 명령을 다시 실행합니다.
✅
3. 페이징과 세그멘테이션 기법을 비교 설명해주세요. 🔗
두 기법의 핵심적인 차이를 여러 관점에서 설명하는 것이 중요합니다.
페이징과 세그멘테이션은 가상 메모리를 관리하는 두 가지 대표적인 기법입니다.
가장 큰 차이는
메모리를 나누는 단위
에 있습니다.
세그멘테이션
은 코드, 데이터, 스택처럼
의미 있는 논리적 단위
로,
서로 다른 크기
의 세그먼트로 나눕니다.
이는 보호와 공유에 유리하지만,
외부 단편화
문제가 발생할 수 있습니다.
반면,
페이징
은 논리적 의미와 상관없이
모두 동일한 고정 크기
의 페이지로 나눕니다.
이는 메모리 관리가 용이하고 외부 단편화가 없다는 장점이 있지만,
내부 단편화
가 발생할 수 있습니다.
현대 운영체제는 보통 이 두 가지를 결합한
페이지드 세그멘테이션
방식을 사용합니다.
오늘은 가상 메모리에 대해 알아보았습니다.
가상 메모리
는 물리 메모리의 한계를 넘어, 각 프로세스에게 크고 독립적인
작업 공간이 있는 것처럼 보여주는 기술입니다.
- 이 마법은
페이징
이라는 기법과, 주소 변환을 위한 페이지 테이블
을 통해 구현됩니다.
- 물리 메모리가 부족할 때 발생하는
페이지 폴트
는, 페이지 교체 알고리즘
(예: LRU)을 통해 해결합니다.