
MMU(Memory Management Unit)는 컴퓨터 메모리를 훨씬 더 유연하게 만들어주는 마법 같은 장치입니다. 주기억장치관리의 핵심은 '메인 메모리를 어떻게 잘 관리할 수 있을까'에 있습니다.
1) 🚨 멀티태스킹의 시대, 안전은 필수다!
과거에는 컴퓨터가 한 번에 하나의 프로그램만 실행해도 충분했지만,
요즘은 백그라운드에서 여러 프로그램이 동시에 실행되는 멀티태스킹이 당연한 시대예요.
하지만 문제가 있습니다.
- 여러 프로그램이 한 메모리를 공유할 경우
- 버그가 난 프로그램이 다른 프로그램의 메모리를 침범할 수 있음
- 심하면 운영체제(OS) 자체의 메모리를 덮어쓸 수도 있음
🧨 보안 위협뿐만 아니라, 시스템 전체가 뻗을 수 있어요!
그래서 필요한 것이 바로 MMU (Memory Management Unit)입니다.
2) 🧰 MMU란 무엇인가요?
MMU는 컴퓨터에 들어 있는 하드웨어 장치로,
✅ 프로그램이 사용하는 "가상 주소"를 실제 "물리 주소"로 변환해주는 장치입니다.
출처 : https://velog.io/@tycode4/%EA%B0%80%EC%83%81-%EB%A9%94%EB%AA%A8%EB%A6%AC
우리가 보통 알고 있는 가상 메모리는:
"MMU가 프로그램이 사용하는 가상 주소를 물리 주소로 바꿔주는 시스템"
...이 정도로 알고 있지만, 사실 그 기능은 시작일 뿐이고, 진짜 강력한 기능은 훨씬 더 대담한 착각(!)을 만들어내요.
🧠 프로그램은 "메모리 부족"을 모른다?
운영체제는 이렇게 속입니다:
“그래, 네가 필요한 만큼 메모리가 있는 것처럼 써도 돼~ 내가 뒤에서 알아서 해줄게!”
실제로는 메모리가 부족해도 프로그램이 느끼지 않도록, 페이지 폴트(page fault)와 함께 요구불 페이징(demand paging) 기법이 작동합니다.
즉, 프로그램은 자신이 마치 독립적인 메모리를 갖고 있는 것처럼 느끼게 만들어 주는 장치죠.
용어 | 설명 |
---|---|
가상 주소 | 프로그램이 사용하는 주소. 겉보기용 |
물리 주소 | 실제 메모리(RAM) 상의 위치 |
MMU | 가상 주소 → 물리 주소로 바꿔주는 장치 |
📌 이 과정 덕분에 여러 프로그램이 서로 독립된 공간에서 실행되는 것처럼 동작할 수 있어요!
3) 🧭 가상 주소의 동작 원리: 페이지와 페이지 테이블
MMU는 가상 주소를 물리 주소로 단순히 1:1 매핑하지 않습니다.
대신, 페이지(Page)라는 단위로 메모리를 관리하죠.
📦 Demand Paging(요구불 페이징)이란?
프로그램이 진짜로 필요한 페이지만 물리 메모리에 올려요.
나머지는 아직 메모리에 없어요. 필요할 때 그때그때 불러옵니다.
마치 넷플릭스에서 보고 싶은 장면만 스트리밍하는 것과 같아요.
📦 페이지란?
- 메모리를 일정한 크기로 쪼갠 단위 (예: 256B, 4KB 등)
- 프로그램은 페이지 단위로 메모리를 할당받고 사용
🧠 가상 메모리의 동작 방식
가상 메모리는 "가상 주소(Virtual Address)"를 사용해서, 물리 주소(Physical Address)로 간접 접근하게 만드는 기술입니다.
- 프로세스는 오직 가상 주소만 사용합니다.
- 가상 주소는 실제 메모리 주소가 아니라, 중간에서 커널이 번역해주는 주소예요.
- 번역 작업은 페이지 테이블(Page Table)을 통해 이루어집니다.
📑 페이지 테이블(Page Table)
- 각 프로그램마다 자신의 가상 페이지가 어느 물리 페이지에 매핑되는지 저장하는 테이블
- . 페이지 테이블에는 각 페이지가 물리 메모리상에서 차지하는 실제 위치 정보가 들어 있어 있습니다.
- 프로그램마다 다르고, 운영체제가 관리함
🔁 MMU 주소 변환 흐름
CPU는 무조건 가상메모리만을 참조해달라고 요청하고, 그 가상메모리 주소가 실제 어느 물리 주소에 있는지 MMU가 변환 시켜주고, 그 해당 물리 메모리에 접근을 하여 그 해당 데이터를 CPU에 전달합니다.
- 프로그램은 가상 주소를 사용해 메모리에 접근
- MMU가 가상 주소의 페이지 번호를 읽고
- 해당 페이지 번호를 페이지 테이블에서 검색하여
- 매핑된 물리 페이지의 주소로 접근!
가상 주소는 연속적이지만, 물리 주소는 불연속일 수 있음 → 메모리 조각 문제 방지!
페이지 테이블은 그냥 메모리의 일부분
프로그램 입장에서는 가상 메모리가 연속적인 것처럼 보이지만, 실제 물리 메모리상의 위치는 굳이 연속적일 필요가 없습니다.
심지어 프로그램이 실행되는 도중에 프로그램이 위치한 물리적 메모리 주소가 바뀔 수도 있어요.
그리고 프로그램들이 서로 협력하는 경우에는 여러 프로그램의 가상 메모리 중 *일부가 같은 물리 메모리를 함께 사용하는 공유 메모리 기능을 제공할 수도 있어요. *
이제 페이지 테이블의 내용이 프로그램 문맥의 일부분이 된다는 사실에 유의하고 보면, 페이지 테이블은 그냥 메모리의 일부분이 됩니다.
4) 💡 예시: 16비트 주소와 페이지 테이블
가상 주소: A15~A0
(총 16비트)
- 상위 비트(
A15~A8
) → 페이지 번호 (256개 페이지) - 하위 비트(
A7~A0
) → 페이지 안의 오프셋
페이지 테이블:
가상 페이지 번호 | 매핑된 물리 페이지 번호 |
---|---|
0 | 8 |
1 | 5 |
... | ... |
→ 예를 들어, 가상 주소 0x01A2
는:
- 페이지 번호: 0x01
- 오프셋: 0xA2
- 페이지 테이블을 통해 → 물리 페이지 5번 →
0x05A2
로 변환됨
5) 🧷 프로그램 분리를 통한 보안성 강화
MMU가 없다면?
- 프로그램 1이 프로그램 2의 메모리를 침범할 수 있음
- 악성 코드가 운영체제를 덮어쓸 수 있음
MMU가 있다면?
- 각 프로그램은 자기만의 가상 메모리 공간을 가짐
- 서로의 메모리에 접근할 수 없음
- 운영체제의 메모리 영역도 보호됨 (커널 모드 전용)
6) 📛 예외 처리와 페이지 폴트와 스왑
📍 페이지 폴트(Page Fault)
- 프로그램이 존재하지 않는 가상 주소에 접근하면 발생하는 예외
- OS는 이 예외를 받아 새 메모리 페이지를 할당하거나, 프로그램을 중단함
📌 활용 예시: 스택 오버플로
- 스택이 범위를 초과하면 → 페이지 폴트 발생
- OS가 스택을 위한 메모리를 확장해줄 수 있음 (동적 증가)
💿 스왑 아웃(Swap Out) / 스왑 인(Swap In)
운영체제는 물리 메모리가 꽉 찼을 때 이렇게 처리해요:
동작 | 설명 |
---|---|
💤 스왑 아웃 | 사용하지 않는 페이지를 디스크로 옮김 (속도 느림) |
⚡ 스왑 인 | 프로그램이 그 페이지를 다시 필요로 할 때, 디스크에서 다시 불러옴 |
이 과정을 통해 물리 메모리가 실제보다 더 커 보이게 만들 수 있어요. 이것이 바로 가상 메모리의 핵심 마법입니다.
🔁 동작 흐름 예시
- 프로그램이
0x2000
주소에 접근하려 함 - 해당 페이지가 물리 메모리에 없음 → 페이지 폴트 발생
- OS는 필요 없는 다른 페이지를 스왑 아웃해서 공간 확보
- 디스크에서
0x2000
이 포함된 페이지를 스왑 인 - MMU가 가상 주소 → 물리 주소 매핑 다시 설정
- 프로그램은 아무 일도 없었던 것처럼 실행 계속
요구불 페이징은 “필요한 메모리만 즉시 가져오고, 안 쓰는 메모리는 디스크로 보내는” 스마트한 가상 메모리 운영 방식입니다.
이 과정을 '요구 페이징(Demand Paging)'이라고 합니다. OS는 페이지 접근 패턴을 추적해 어떤 페이지를 스왑할지 결정합니다. 대표적으로 LRU(Least Recently Used) 알고리즘이 사용됩니다.
"자주 쓰는 건 냉장고에, 덜 쓰는 건 창고에. 그런데 창고에서 꺼낼 땐 시간이 걸린다!"
9) 🔄 MMU vs 인덱스 레지스터
항목 | MMU | 인덱스 레지스터 |
---|---|---|
기능 | 가상 → 물리 주소 변환 | 동적 주소 계산 (오프셋 계산용) |
범위 | 모든 메모리 | 제한적 (일부 주소에만 적용) |
보호 기능 | 있음 (보안, 권한 등) | 없음 |
프로그램 분리 | 가능 | 불가능 |
MMU는 단순한 주소 계산기가 아니라, 보안·안정성·다중 프로그램 실행의 핵심 장치입니다.
10) 스와핑에 두 가지 의미
1. 교과서에서는 이렇게 말해요
"메모리가 부족한 상황에서는 스와핑을 통해서라도 프로그램을 실행시키는 게 낫다."
- 운영체제는 가상 메모리를 통해 메모리보다 많은 프로그램을 실행하게 도와줘요.
- 이때 물리 메모리가 부족하면 디스크에 데이터를 잠시 옮겨두는 스와핑을 사용합니다.
- 성능은 좀 떨어져도 시스템이 멈추지 않고 돌아가는 것이 더 중요하다고 보는 거예요.
- 그래서 OS는 LRU(Least Recently Used) 같은 페이지 교체 알고리즘을 써서 덜 쓰는 페이지부터 스왑 아웃해요.
요약: 성능보다 가용성(Availability)이 중요한 상황에서는 스와핑이 합리적이에요.
2. 실무에서는 왜 다르게 말할까요?
"Kafka 같은 고처리량 시스템에서는 (거의) 무조건 스와핑을 막아야 한다."
– 카프카 핵심 가이드 p.40
고성능 시스템에서는 상황이 완전히 달라요. 성능이 떨어지면 비즈니스 자체가 타격을 입을 수 있기 때문이에요.
실무에서 스와핑이 문제 되는 이유
이유 | 설명 |
---|---|
💥 성능 저하 | 스왑은 디스크 I/O를 유발해요. RAM보다 수천 배 느려요. |
🌀 레이턴시 증가 | Kafka, DB, 게임 서버처럼 실시간성이 중요한 시스템에선 치명적이에요. |
🧠 예측 불가 | 커널이 어떤 페이지를 스왑할지 결정하기 때문에, 예측이 어려워요. |
📉 처리량 감소 | CPU는 한가한데 메모리 I/O 때문에 전체 속도가 늦춰져요. |
3. ✋ 예를 들면 이런 상황이 생겨요
- Kafka의 Page Cache가 스왑되면 디스크 접근 속도가 심각하게 느려져요.
- JVM 기반 시스템은 GC 타이밍이 중요한데, 스왑이 끼면 GC가 언제 작동할지 예측 불가해져요.
4. 📌 그래서 실무에서는 이렇게 막아요
vm.swappiness
값을 10 이하로 줄이거나 아예 0으로 설정sudo sysctl -w vm.swappiness=10
Kafka, Elasticsearch, Redis 등은 스왑 비활성화가 권장
컨테이너에서는
--memory-swappiness=0
옵션 사용
🧩 쉽게 비교하면?
항목 | 일반 PC (교과서 관점) | Kafka 같은 고성능 서버 (실무 관점) |
---|---|---|
목표 | 실행 가능한 시스템 유지 | 지연 최소화, 처리량 극대화 |
스와핑 허용 | 허용 (필요악) | ❌ 최대한 방지 |
페이지 교체 | LRU 등 사용 | 스와핑 자체를 안 하도록 세팅 |
리소스 부족 시 | 느려져도 동작 유지 | 성능 저하는 SLA 위반으로 치명적 |
💡 한 줄 정리
교과서에서 말하는 스와핑은 ‘최후의 안전장치’지만, 실무에서는 ‘절대 피해야 할 성능 지옥’입니다.
✅ 마무리 요약
키워드 | 설명 |
---|---|
MMU | 가상 주소 ↔ 물리 주소 변환 하드웨어 |
페이지 | 일정 단위로 쪼갠 메모리 블록 |
페이지 테이블 | 가상 → 물리 주소 매핑 정보 저장 테이블 |
페이지 폴트 | 없는 가상 주소 접근 시 발생하는 예외 |
제어 비트 | 실행불가, 읽기전용 등 접근 권한 제어 |
프로그램 분리 | 가상 메모리 공간으로 서로 격리 |
"현대 컴퓨터에서 MMU 없는 시스템은 상상할 수 없습니다.
프로그램이 안전하게, 그리고 서로 간섭 없이 실행될 수 있도록 돕는 조력자.
그게 바로 MMU입니다!"
"가상 메모리는 마치 각 가정이 자기 집 주소 체계를 쓰는 것처럼, 다른 집 주소와 겹치지 않게 만들어주는 장치입니다."
안녕하세요. si 회사 소속 sm LMS 팀에 소속중인 1년차 백엔드 개발자입니다😀 함께 나누고 성장하는 것을 좋아해요. 언제든 디스코드나 구글 메일로 질문해도 됩니다!
⭐ 잘못된 내용은 댓글 적어주세요 :)