2025-09-04 23:47

운영체제 메모리 관리의 핵심 페이징 기법 완벽 정복 핸드북

컴퓨터 과학, 특히 운영체제(OS)의 세계에서 ‘메모리 관리’는 가장 중요하고도 복잡한 주제 중 하나입니다. 컴퓨터가 여러 프로그램을 동시에 실행하는 멀티태스킹 환경을 원활하게 지원하려면, 한정된 메모리 자원을 효율적으로 나누고 보호해야 합니다. 이 거대한 과제를 해결하기 위해 탄생한 수많은 기법 중, 현대 운영체제의 근간을 이루는 가장 핵심적인 기술이 바로 **페이징(Paging)**입니다.

이 핸드북은 페이징이 왜 필요했는지부터 시작하여 그 구조와 동작 방식, 그리고 더 깊은 심화 내용까지, 페이징의 모든 것을 A부터 Z까지 상세하게 안내합니다.

1. 페이징은 왜 탄생했을까? (만들어진 이유)

페이징의 탄생 배경을 이해하려면 그 이전에 사용되던 메모리 관리 방식의 고질적인 문제점을 알아야 합니다. 초창기 컴퓨터 시스템은 메모리를 **연속적으로 할당(Contiguous Allocation)**하는 방식을 사용했습니다. 이는 마치 주차장에 차를 댈 때, 한 대의 차(프로세스)가 들어갈 수 있는 빈 공간을 통째로 찾아 할당하는 것과 같습니다.

이 방식은 간단했지만 두 가지 치명적인 문제를 낳았습니다.

가. 외부 단편화 (External Fragmentation)

상상해 봅시다. 주차장에 10칸의 주차 공간이 있습니다. 3칸짜리 차 A, 2칸짜리 차 B, 4칸짜리 차 C가 주차했습니다. 이제 남은 공간은 1칸입니다. 이때 차 B가 떠나면, A와 C 사이에 2칸의 빈 공간이 생깁니다. 총 빈 공간은 1칸 + 2칸 = 3칸이지만, 3칸짜리 새로운 차 D는 주차할 수 없습니다. 빈 공간들이 여기저기 흩어져 있어 연속된 3칸이 없기 때문입니다.

이처럼 메모리 공간이 충분히 있음에도 불구하고, 그 공간이 연속적이지 않아 프로세스를 할당하지 못하는 현상을 외부 단편화라고 합니다. 이는 심각한 메모리 낭비를 초래했습니다.

나. 내부 단편화 (Internal Fragmentation)

외부 단편화 문제를 일부 완화하기 위해 메모리를 고정된 크기의 블록으로 미리 나누는 고정 분할 방식이 등장했습니다. 예를 들어, 메모리를 100MB 크기의 블록들로 나누었다고 가정해 봅시다. 만약 20MB 크기의 프로세스가 들어오면 100MB 블록 하나를 할당받게 됩니다. 이 경우, 할당된 100MB 블록 내에서 80MB의 공간은 사용되지 않고 낭비됩니다.

이처럼 할당된 메모리 공간 안에서 사용되지 않고 남는 부분을 내부 단편화라고 합니다.

페이징은 바로 이 ‘외부 단편화’ 문제를 해결하고, 메모리 사용 효율을 극대화하기 위해 탄생했습니다. 페이징의 핵심 아이디어는 “프로세스를 굳이 연속된 공간에 올릴 필요가 있을까? 조각내서 아무 데나 두면 안 될까?”라는 발상의 전환에서 시작됩니다.

2. 페이징의 구조: 세상을 보는 두 개의 눈

페이징 시스템을 이해하기 위한 핵심 구성 요소는 가상 메모리, 물리 메모리, 페이지, 프레임, 그리고 이 둘을 연결하는 페이지 테이블입니다.

가. 가상 메모리와 물리 메모리

  • 물리 메모리(Physical Memory): 우리가 흔히 RAM이라고 부르는 실제 하드웨어 메모리입니다. 용량이 한정되어 있으며, CPU가 직접 접근하여 데이터를 읽고 씁니다.

  • 가상 메모리(Virtual Memory): 각 프로세스에게 부여되는 자신만의 독립적인 메모리 공간입니다. 프로세스는 실제 물리 메모리의 복잡한 주소 구조를 신경 쓸 필요 없이, 0번지부터 시작하는 크고 연속적인 메모리 공간을 가지고 있다고 착각하게 됩니다.

이 비유는 마치 우리가 책을 읽을 때, 실제 책이 도서관 서가 어디에 꽂혀있는지(물리적 위치) 신경 쓰지 않고 책의 ‘페이지 번호’(가상 주소)만 보고 내용을 찾아가는 것과 같습니다.

나. 페이지(Page)와 프레임(Frame)

페이징 시스템은 이 두 메모리 공간을 고정된 크기의 블록으로 잘게 나눕니다.

  • 페이지(Page): 가상 메모리를 나누는 고정 크기 블록입니다.

  • 프레임(Frame): 물리 메모리를 나누는 고정 크기 블록입니다.

매우 중요한 규칙은 페이지의 크기프레임의 크기는 항상 같다는 것입니다. 예를 들어 페이지 크기가 4KB라면, 프레임 크기도 4KB입니다. 이렇게 크기를 맞추면 어떤 페이지든 비어있는 아무 프레임에나 딱 맞게 들어갈 수 있습니다.

다. 페이지 테이블(Page Table): 가상과 현실의 연결고리

이제 프로세스의 가상 메모리를 구성하는 페이지들을 물리 메모리의 프레임에 비연속적으로 배치했습니다. 그렇다면 CPU가 “가상 주소 1000번지에 있는 데이터를 줘”라고 요청할 때, 이 가상 주소 1000번지가 실제 물리 메모리의 어디에 있는지 어떻게 알 수 있을까요?

이때 필요한 것이 바로 **페이지 테이블(Page Table)**입니다. 페이지 테이블은 가상 페이지 번호와 해당 페이지가 저장된 물리 프레임 번호를 짝지어 놓은 ‘주소 변환 지도’입니다. 각 프로세스는 자신만의 페이지 테이블을 가지고 있습니다.

가상 페이지 번호 (Index)물리 프레임 번호기타 정보 (Valid, Dirty bit 등)
03
17
21
34

위 테이블은 “가상 페이지 0번은 물리 프레임 3번에 있다”는 정보를 담고 있습니다.

라. MMU (Memory Management Unit)

페이지 테이블을 이용한 주소 변환은 소프트웨어(OS)가 매번 개입하기에는 너무 느립니다. 그래서 이 과정을 하드웨어가 전담하는데, 그 역할을 하는 것이 바로 **MMU(메모리 관리 장치)**입니다. MMU는 CPU 안에 내장되어 있으며, CPU가 가상 주소를 요청하면 페이지 테이블을 참조하여 물리 주소로 빠르게 변환해주는 역할을 합니다.

3. 페이징은 어떻게 동작하는가? (사용법)

이제 모든 조각이 모였습니다. CPU, MMU, 페이지 테이블, 물리 메모리가 협력하여 주소를 변환하는 과정을 단계별로 따라가 봅시다.

  1. CPU의 주소 요청: CPU가 특정 가상 주소(Virtual Address)에 접근하려고 합니다. 예를 들어, 가상 주소 10250에 접근한다고 가정합시다.

  2. 주소 분할: MMU는 CPU가 요청한 가상 주소를 두 부분으로 나눕니다.

    • 페이지 번호(p): 해당 주소가 어떤 페이지에 속하는지 나타냅니다.

    • 오프셋(d): 그 페이지 내에서 얼마나 떨어져 있는지를 나타냅니다.

    만약 페이지 크기가 4KB(4096 바이트)라면,

    • 페이지 번호(p) = 10250 / 4096 = 2 (몫)

    • 오프셋(d) = 10250 % 4096 = 2058 (나머지) 즉, 가상 주소 10250가상 페이지 2번의 2058번째 바이트를 의미합니다.

  3. 페이지 테이블 조회: MMU는 계산된 페이지 번호 p=2를 인덱스로 사용하여 현재 실행 중인 프로세스의 페이지 테이블을 조회합니다. 페이지 테이블에서 가상 페이지 2번이 물리 프레임 1번에 매핑되어 있다는 것을 알아냅니다. (위 예시 테이블 참고)

  4. 물리 주소 계산: MMU는 찾아낸 프레임 번호와 원래의 오프셋을 결합하여 최종 물리 주소를 계산합니다.

    • 물리 주소 = (프레임 번호 * 페이지 크기) + 오프셋

    • 물리 주소 = (1 * 4096) + 2058 = 6154

  5. 메모리 접근: MMU는 계산된 물리 주소 6154를 통해 실제 물리 메모리에 접근하여 데이터를 가져옵니다.

이 모든 과정이 하드웨어인 MMU에 의해 눈 깜짝할 사이에 이루어지기 때문에, 프로세스는 자신이 가상 메모리를 사용하고 있다는 사실조차 인지하지 못합니다.

4. 더 깊이 알아보기 (심화 내용)

기본적인 페이징 시스템도 효율적이지만, 몇 가지 개선점과 추가적인 개념들이 있습니다.

가. TLB (Translation Lookaside Buffer)

위 주소 변환 과정을 보면, 데이터에 한 번 접근하기 위해 메모리에 두 번 접근해야 하는 문제가 있습니다.

  1. 페이지 테이블을 보기 위해 메모리에 접근

  2. 계산된 물리 주소의 실제 데이터에 접근

메모리 접근은 상대적으로 느린 작업이라, 이러한 오버헤드는 시스템 성능에 영향을 미칩니다. 이 문제를 해결하기 위해 **TLB(Translation Lookaside Buffer)**라는 특수한 하드웨어 캐시를 사용합니다.

TLB는 최근에 사용된 페이지 번호와 프레임 번호의 매핑 정보를 소량 저장하는 고속 캐시입니다. MMU는 페이지 테이블을 조회하기 전에 먼저 TLB를 확인합니다.

  • TLB Hit: 찾으려는 페이지 정보가 TLB에 있으면, 페이지 테이블을 거치지 않고 바로 프레임 번호를 얻어 물리 주소를 계산합니다. (매우 빠름)

  • TLB Miss: 정보가 TLB에 없으면, 어쩔 수 없이 페이지 테이블을 조회하고, 그 결과를 TLB에 새로 저장한 뒤 주소 변환을 계속합니다.

대부분의 프로그램은 특정 시간 동안 특정 영역의 코드와 데이터만 집중적으로 사용하는 지역성(Locality) 특성을 가지므로, TLB는 매우 높은 적중률(Hit Ratio)을 보이며 페이징의 성능 저하를 크게 완화해 줍니다.

나. 다중 단계 페이징 (Multi-level Paging)

현대 64비트 시스템의 가상 주소 공간은 상상 이상으로 큽니다(2^64). 이 거대한 공간을 4KB 페이지로 나눈다면 페이지 테이블의 크기 자체가 너무 커져서 페이지 테이블을 위한 메모리 공간만 수 기가바이트에 달하게 됩니다. 이 문제를 해결하는 것이 다중 단계 페이징입니다.

핵심 아이디어는 **“페이지 테이블을 페이징하는 것”**입니다. 가장 바깥 단계의 페이지 테이블(페이지 디렉터리)은 그 다음 단계 페이지 테이블의 위치를 가리키고, 마지막 단계의 페이지 테이블만이 실제 데이터가 있는 프레임 번호를 가리킵니다. 사용하지 않는 페이지들에 대해서는 중간 단계의 페이지 테이블을 아예 생성하지 않음으로써 공간을 절약할 수 있습니다.

다. 요구 페이징 (Demand Paging)

프로세스가 시작될 때 모든 페이지를 메모리에 올리는 것은 비효율적입니다. 프로그램의 특정 기능(예: 오류 처리 루틴)은 거의 사용되지 않을 수 있기 때문입니다. 요구 페이징은 ‘페이지가 실제로 필요할 때(요구될 때) 메모리에 올리자’는 개념입니다.

  • 프로세스가 시작되면, 운영체제는 아무 페이지도 메모리에 올리지 않습니다.

  • CPU가 특정 페이지에 접근하려고 할 때, 해당 페이지가 메모리에 없으면(페이지 테이블의 valid bit가 0이면) **페이지 폴트(Page Fault)**라는 트랩이 발생합니다.

  • 페이지 폴트가 발생하면 CPU는 잠시 멈추고, 운영체제가 개입합니다.

  • 운영체제는 디스크(스왑 영역)에서 해당 페이지를 찾아 빈 프레임에 로드합니다.

  • 페이지 테이블을 업데이트하고(프레임 번호 기록, valid bit를 1로 변경), 멈췄던 명령을 다시 실행합니다.

이 요구 페이징 기법 덕분에 우리는 실제 RAM 크기보다 훨씬 큰 프로그램을 실행할 수 있게 됩니다. 이것이 바로 가상 메모리 시스템의 핵심 원리입니다.

5. 장점과 단점 요약

구분내용
장점1. 외부 단편화 해결: 프로세스를 비연속적인 프레임에 분산 배치하므로 외부 단편화가 발생하지 않습니다.
2. 효율적인 메모리 사용: 요구 페이징을 통해 실제 필요한 부분만 메모리에 올려 메모리를 효율적으로 사용합니다.
3. 가상 메모리 지원: 실제 물리 메모리보다 큰 가상 주소 공간을 제공하여 프로그래밍을 용이하게 합니다.
4. 프로세스 간 보호: 각 프로세스는 자신만의 페이지 테이블을 통해 격리되므로 다른 프로세스의 메모리 공간을 침범할 수 없습니다.
단점1. 내부 단편화 존재: 페이지의 마지막 부분에서 남는 공간은 내부 단편화가 발생할 수 있습니다. (페이지 크기가 작을수록 완화됨)
2. 주소 변환 오버헤드: 페이지 테이블 접근 및 주소 계산에 따른 시간적, 공간적 오버헤드가 발생합니다. (TLB로 완화)
3. 페이지 테이블 관리: 페이지 테이블을 저장하기 위한 추가적인 메모리 공간이 필요합니다. (다중 단계 페이징으로 완화)

6. 결론

페이징은 ‘메모리 조각들을 어떻게 잘 관리할까?‘라는 단순한 질문에서 시작하여, 외부 단편화 해결, 메모리 보호, 그리고 가상 메모리라는 현대 컴퓨팅의 핵심 개념을 실현한 위대한 기술입니다. 비록 주소 변환의 오버헤드라는 단점이 있지만, TLB와 다중 단계 페이징 같은 하드웨어 및 소프트웨어적 보완을 통해 이를 극복해왔습니다.

오늘날 우리가 사용하는 거의 모든 운영체제는 페이징 기법을 기반으로 동작하고 있습니다. 이 핸드북을 통해 페이징이 어떻게 우리의 디지털 세상을 지탱하는 보이지 않는 기반이 되는지 깊이 이해하는 계기가 되었기를 바랍니다.

레퍼런스(References)

페이징