1. MMU (Memory Management Unit)
1.1. 개념과 역할
MMU(Memory Management Unit, 메모리 관리 장치)는 CPU 코어에 통합된 하드웨어 컴포넌트로, 가상 메모리 주소를 실제 물리 메모리 주소로 변환하는 역할을 수행합니다. 또한, 메모리 보호, 캐시 제어, 버스 중재 등 메모리 접근에 관련된 다양한 제어 기능을 담당합니다.
현대의 운영체제는 프로세스마다 독립적인 가상 주소 공간을 할당합니다. 덕분에 프로그래머는 실제 물리 메모리의 용량이나 주소에 구애받지 않고 프로그램을 작성할 수 있으며, 다른 프로세스의 메모리 공간에 직접 접근할 수 없어 시스템 안정성이 향상됩니다. MMU는 바로 이러한 가상 메모리 시스템을 하드웨어 수준에서 지원하는 핵심 장치입니다.
1.2. 내부 구조 및 구현 방식
MMU의 핵심 기능은 주소 변환과 메모리 보호입니다. 이 기능들은 주로 페이지 테이블(Page Table)과 TLB(Translation Lookaside Buffer)라는 두 가지 주요 구성 요소를 통해 구현됩니다.
1.2.1. 주소 변환 (Address Translation)
운영체제는 각 프로세스를 위해 가상 주소와 물리 주소 간의 매핑 정보를 담고 있는 페이지 테이블을 메모리(RAM)에 생성하여 관리합니다. CPU가 특정 가상 주소에 접근하려고 할 때, MMU는 다음의 과정을 거쳐 물리 주소로 변환합니다.
- 페이지 테이블 기준 레지스터(CR3 on x86): CPU는 현재 실행 중인 프로세스의 페이지 테이블이 메모리 어디에 있는지 가리키는 특별한 레지스터(x86 아키텍처에서는
CR3레지스터)를 가지고 있습니다. MMU는 이 레지스터 값을 참조하여 페이지 테이블 탐색을 시작합니다. - 페이지 테이블 워크(Page Table Walk): 가상 주소는 여러 필드(예: 페이지 디렉터리 인덱스, 페이지 테이블 인덱스, 오프셋)로 나뉩니다. MMU는 이 인덱스들을 사용하여 계층적인 페이지 테이블을 순차적으로 탐색(이를 '페이지 테이블 워크'라고 함)하여 최종적으로 해당 가상 주소에 매핑되는 물리 주소가 담긴 PTE(Page Table Entry)를 찾습니다.
- 물리 주소 계산: MMU는 PTE에서 얻은 물리 페이지 주소(Page Frame Number)와 가상 주소의 오프셋(Offset) 부분을 결합하여 최종 물리 주소를 계산합니다.
이러한 다단계 페이지 테이블 구조(Multi-Level Page Table)는 모든 주소 매핑 정보를 단일 테이블에 저장할 때 발생하는 막대한 메모리 낭비를 줄여줍니다.
1.2.2. TLB (Translation Lookaside Buffer)
페이지 테이블은 메인 메모리에 존재하기 때문에, 모든 메모리 접근마다 페이지 테이블 워크를 수행하는 것은 상당한 성능 저하를 유발합니다. (최소한 몇 번의 추가적인 메모리 접근이 필요함).
이 문제를 해결하기 위해 MMU 내부에 TLB라는 고속의 주소 변환 캐시가 존재합니다.
- TLB의 역할: TLB는 최근에 변환된 가상 주소와 물리 주소의 매핑 정보를 저장합니다. CPU가 가상 주소를 요청하면, MMU는 먼저 TLB를 확인합니다.
- TLB Hit: 만약 해당 가상 주소에 대한 매핑 정보가 TLB에 존재하면(TLB Hit), MMU는 즉시 물리 주소를 얻어 메모리 접근을 수행합니다. 이 과정은 매우 빠릅니다.
- TLB Miss: 만약 정보가 TLB에 없으면(TLB Miss), MMU는 메인 메모리에 있는 페이지 테이블을 탐색(페이지 테이블 워크)하여 주소 변환을 수행해야 합니다. 변환이 완료되면, 그 결과를 TLB에 새로 저장하여 다음 접근 시에는 빠르게 처리될 수 있도록 합니다. TLB Miss는 상당한 성능 페널티를 발생시킵니다.
1.2.3. 메모리 보호 (Memory Protection)
MMU는 페이지 테이블 엔트리(PTE)에 포함된 접근 권한 비트(Permission Bits)를 검사하여 메모리 보호 기능을 수행합니다.
- 접근 권한 비트: PTE에는 해당 메모리 페이지에 대한 접근 권한(예: 읽기(Read), 쓰기(Write), 실행(Execute))과 접근 가능한 프로세서 모드(예: 유저 모드/커널 모드)를 명시하는 플래그들이 있습니다.
- 권한 검사: CPU가 메모리에 접근할 때마다 MMU는 현재 프로세서의 모드와 수행하려는 연산(읽기/쓰기/실행)이 PTE에 명시된 권한과 일치하는지 검사합니다.
- 페이지 폴트 (Page Fault): 만약 권한이 없는 접근이 시도되면(예: 유저 모드가 커널 전용 페이지에 접근, 읽기 전용 페이지에 쓰기 시도), MMU는 CPU에 예외(Exception)를 발생시킵니다. 이 예외를 페이지 폴트라고 하며, 운영체제는 이 예외를 처리하는 루틴을 실행하여 해당 프로세스를 강제 종료하는 등의 조치를 취합니다.
1.3. MMU 기능의 장단점 및 활용
| 기능 | 장점 | 단점 | 활용 |
|---|---|---|---|
| 가상 메모리 | - 물리 메모리보다 큰 주소 공간 제공 - 프로세스별 격리된 메모리 공간 제공 - 메모리 단편화 문제 완화 |
- 주소 변환에 따른 오버헤드 발생 - 복잡한 자료구조(페이지 테이블) 관리 필요 |
- 현대 대부분의 운영체제(Windows, Linux, macOS)에서 표준 메모리 관리 기법으로 사용 |
| 메모리 보호 | - 악의적이거나 잘못된 메모리 접근 차단 - 시스템 안정성 대폭 향상 - 커널 영역 보호 |
- 모든 메모리 접근 시 권한 검사로 인한 미세한 성능 저하 | - 프로세스가 다른 프로세스나 OS 커널의 메모리를 침범하는 것을 방지 |
| 동적 메모리 할당 | - malloc, new 등 필요할 때 메모리 할당- 효율적인 메모리 사용 가능 |
- 페이지 폴트를 유발할 수 있음 | - Demand Paging: 실제 사용될 때까지 물리 메모리 할당을 지연시켜 메모리 효율 극대화 |
2. 계층별 동작 구조
MMU의 동작은 사용자 영역, 커널 영역, 하드웨어 계층이 상호작용하며 이루어집니다.
- 사용자 영역 (User Space)
- 사용자 프로세스는 가상 주소를 사용하여 메모리에 접근합니다. 예를 들어,
int* ptr = new int; *ptr = 10;과 같은 코드가 실행되면,ptr은 가상 주소를 가리킵니다. - 프로세스는 물리 메모리의 실제 구조를 전혀 알지 못하며, 자신만의 독립적인 32비트 또는 64비트 주소 공간을 사용하는 것처럼 동작합니다.
- 사용자 프로세스는 가상 주소를 사용하여 메모리에 접근합니다. 예를 들어,
- 커널 영역 (Kernel Space)
- 페이지 테이블 관리: 운영체제(커널)는 각 프로세스가 생성될 때마다 해당 프로세스를 위한 페이지 테이블을 생성하고 초기화합니다. 프로세스의 메모리 할당(
malloc), 해제(free) 요청이 있을 때마다 커널은 페이지 테이블을 업데이트합니다. - 페이지 폴트 처리: MMU가 페이지 폴트 예외를 발생시키면, CPU의 제어권이 커널의 페이지 폴트 핸들러로 넘어갑니다. 커널은 폴트의 원인을 분석합니다.
- 유효한 요청 (Demand Paging): 아직 물리 메모리에 할당되지 않은 페이지에 대한 최초 접근인 경우, 커널은 비어있는 물리 메모리 프레임을 찾아 할당하고, 디스크에서 해당 페이지 내용을 읽어온 후, 페이지 테이블을 업데이트합니다. 그 후 원래 명령을 다시 실행합니다.
- 권한 위반 (Segmentation Fault): 허용되지 않은 메모리 영역에 접근한 경우, 커널은 해당 프로세스에
SIGSEGV시그널을 보내고 프로세스를 강제 종료합니다.
- 컨텍스트 스위칭 (Context Switching): 한 프로세스에서 다른 프로세스로 CPU 제어권이 넘어갈 때, 커널은 CPU의 페이지 테이블 기준 레지스터(
CR3) 값을 새로 실행될 프로세스의 페이지 테이블 주소로 변경합니다. 이로써 MMU는 새로운 프로세스의 주소 공간을 참조하게 됩니다.
- 페이지 테이블 관리: 운영체제(커널)는 각 프로세스가 생성될 때마다 해당 프로세스를 위한 페이지 테이블을 생성하고 초기화합니다. 프로세스의 메모리 할당(
- 하드웨어 (CPU/MMU)
- CPU가 메모리 접근 명령(load, store, fetch)을 실행할 때마다, 생성된 가상 주소는 즉시 MMU로 전달됩니다.
- MMU는 먼저 TLB에서 해당 주소 변환 정보가 있는지 확인합니다.
- TLB Hit 시, 즉시 물리 주소를 CPU 버스로 보내 메모리 접근을 완료합니다.
- TLB Miss 시, 하드웨어(또는 OS의 도움을 받아)가 직접 페이지 테이블 워크를 수행하여 주소를 변환하고, 그 결과를 TLB에 캐싱한 후 메모리 접근을 재개합니다.
- 주소 변환 과정에서 PTE의 접근 권한 비트를 검사하여 위반 시 페이지 폴트 예외를 발생시켜 CPU 제어권을 커널로 넘깁니다.
3. 요약
MMU, 즉 메모리 관리 장치는 CPU 안에 들어있는 하드웨어 부품으로, 우리가 프로그램에서 사용하는 '가상 주소'를 실제 메모리 칩에 있는 '물리 주소'로 바꿔주는 번역기 같은 역할을 합니다.
운영체제는 각 프로그램마다 독립된 가상 공간을 주기 때문인데, MMU 덕분에 프로그램들은 서로 충돌하지 않고 안전하게 돌아갈 수 있고, 실제 램(RAM) 크기보다 더 큰 프로그램도 돌릴 수 있게 됩니다.
MMU는 주소 변환을 위해 '페이지 테이블'이라는 주소록을 사용하는데, 이 주소록은 메모리에 있어서 매번 찾기에는 느립니다. 그래서 MMU 안에 'TLB'라는 초고속 캐시를 둬서 자주 쓰는 주소 변환 결과를 저장해두고 빠르게 처리합니다.
그리고 메모리 보호 기능도 있어 어떤 프로그램이 허락되지 않은 메모리 영역, 예를 들어 다른 프로그램의 영역이나 운영체제 핵심 영역을 건드리려고 하면 즉시 막고 운영체제에 알려서 시스템을 보호하는 경비원 역할도 수행합니다.
4. 꼬리 질문과 답변
Q1: TLB는 왜 필요한가요? TLB가 없다면 어떤 일이 발생하나요?
A1: TLB(Translation Lookaside Buffer)는 주소 변환 속도를 높이기 위한 고속 캐시입니다. 주소 변환에 필요한 정보(페이지 테이블)는 메인 메모리에 저장되어 있는데, 메모리 접근 속도는 CPU의 연산 속도보다 훨씬 느립니다. 만약 TLB가 없다면, 모든 메모리 접근(코드 실행, 데이터 읽기/쓰기 등)을 할 때마다 MMU가 메인 메모리에 있는 페이지 테이블을 여러 번 읽어야 하는 '페이지 테이블 워크'를 수행해야 합니다. 이는 심각한 성능 저하를 유발하여 시스템 전체 속도를 크게 떨어뜨립니다. TLB는 최근 변환된 주소 정보를 저장해둠으로써, 대부분의 주소 변환을 페이지 테이블 접근 없이 매우 빠르게 처리할 수 있게 해주는 핵심적인 성능 최적화 장치입니다.
Q2: 페이지 폴트(Page Fault)는 항상 오류를 의미하나요?
A2: 그렇지 않습니다. 페이지 폴트는 두 가지 주요 경우로 나뉩니다. 첫째는 'Segmentation Fault'와 같이 허용되지 않은 메모리 주소에 접근하려는 명백한 오류 상황입니다. 이 경우 운영체제는 해당 프로세스를 강제 종료하여 시스템을 보호합니다. 하지만 둘째로, 'Demand Paging(요구 페이징)' 기법에서 발생하는 페이지 폴트는 오류가 아닌 정상적인 과정의 일부입니다. 요구 페이징은 메모리 효율을 위해 프로그램 실행에 필요한 페이지를 처음부터 모두 물리 메모리에 올리지 않고, 실제로 해당 페이지에 접근이 일어날 때(즉, 페이지 폴트가 발생했을 때) 비로소 물리 메모리를 할당하고 디스크에서 데이터를 읽어오는 방식입니다. 이 경우의 페이지 폴트는 운영체제에게 "이제 이 페이지를 메모리에 올려주세요"라고 요청하는 신호 역할을 합니다.
Q3: 컨텍스트 스위칭이 발생할 때 MMU와 TLB는 어떻게 동작하나요?
A3: 컨텍스트 스위칭은 CPU가 한 프로세스에서 다른 프로세스로 실행을 전환하는 과정입니다. 각 프로세스는 자신만의 독립적인 가상 주소 공간과 페이지 테이블을 가지고 있으므로, MMU가 올바른 주소 변환을 하려면 현재 어떤 프로세스의 주소 공간을 참조해야 하는지 알아야 합니다. 컨텍스트 스위칭이 일어나면, 운영체제는 CPU의 CR3 레지스터(페이지 테이블 기준 레지스터) 값을 새로 실행될 프로세스의 페이지 테이블 주소로 변경합니다. 이로써 MMU는 새로운 주소 변환 기준을 갖게 됩니다. 이때, TLB에 남아있는 이전 프로세스의 주소 변환 정보는 더 이상 유효하지 않으므로, TLB 전체를 비우는 작업(TLB Flush)이 일반적으로 수행됩니다. 만약 비우지 않으면 새 프로세스가 이전 프로세스의 주소로 잘못 접근할 수 있기 때문입니다. 이 TLB Flush 과정은 컨텍스트 스위칭 오버헤드의 주요 원인 중 하나입니다.
'Computer Science' 카테고리의 다른 글
| 오버로딩과 오버라이딩 (0) | 2026.01.19 |
|---|---|
| 커널 (Kernel) (0) | 2026.01.15 |
| 렌더링 파이프라인 (0) | 2026.01.08 |
| 페이지(Page)와 프레임(Frame)의 차이 (0) | 2026.01.07 |
| 다익스트라 (Dijkstra) 알고리즘 (1) | 2025.12.22 |
