운영체제에서 메인 메모리는
프로세스가 실행되기 위해 반드시 필요한 공간
입니다. 우리가 어떤 프로그램을 실행하면 그 내용은 하드디스크에서 메인 메모리(RAM)로 올라오고, CPU는 이 메모리에 접근해 명령어를 처리합니다.
이번 글에서는 메인 메모리의 구조와 대표적인 메모리 할당 방식, 그리고 현대 CPU 아키텍처에 따른 메모리 구조까지 간단한 예시와 함께 알아보겠습니다.
메인 메모리(Main Memory) 또는 RAM(Random Access Memory)은
프로그램이 실행되기 위해 일시적으로 저장되는 공간
입니다. 속도는 빠르지만 전원이 꺼지면 내용이 사라지며, 운영체제는 메모리를 효율적으로 분배하고 관리하는 기능을 담당합니다.
초기의 운영체제는 연속된 공간에 프로그램을 적재하는
연속 할당(Contiguous Allocation)
방식을 사용했습니다.
이 방식에는 다음과 같은 세 가지 전략이 있습니다:
- 최초 적합(First Fit): 처음으로 맞는 빈 공간에 배치
- 최적 적합(Best Fit): 가장 크기가 가까운 공간에 배치
- 최악 적합(Worst Fit): 가장 큰 공간에 배치
가장 먼저 발견한 적절한 빈 공간
에 배치합니다.
- 장점: 탐색 속도가 빠릅니다.
- 단점: 앞부분에 조각화가 심하게 생길 수 있습니다.
빈 공간: [30, 100, 50]
요청: 40 → 100에 배치 (첫 번째 맞는 공간)
요청 크기보다 크면서 가장 크기가 근접한 공간
을 선택합니다.
- 장점: 공간 낭비를 줄일 수 있습니다.
- 단점: 작은 조각이 많이 생겨 나중에 사용이 어려울 수 있습니다.
빈 공간: [30, 100, 50]
요청: 40 → 50에 배치 (가장 근접)
가장 큰 공간
에 배치하여, 나머지 공간을 크게 남기려는 전략입니다.
- 장점: 큰 조각이 남아 다른 큰 작업에 재활용 가능
- 단점: 전체 공간 활용률은 떨어질 수 있습니다.
빈 공간: [30, 100, 50]
요청: 40 → 100에 배치 (가장 큼)
현대 운영체제는 대부분
페이징(Paging)
방식을 사용합니다. 프로그램을 일정한 크기(페이지)로 나누고, 메모리 공간도 같은 크기의 프레임으로 나눈 뒤 매핑하는 방식입니다.
장점은 메모리를 연속적으로 배치하지 않아도 된다는 점이며, 조각화 문제를 어느 정도 해소할 수 있습니다.

페이징 구조도
페이지 테이블은 페이징 시스템에서 가장 핵심이 되는 구조입니다.
가상 주소
를
물리 주소
로 변환하기 위한 일종의 주소책 같은 역할을 하죠.
쉽게 말해, 컴퓨터가 가상 주소라는 '별명'을 사용하면, 운영체제는 페이지 테이블을 참고해 진짜 물리 주소를 찾아주는 역할을 합니다.
우리가 어떤 프로그램을 실행하면, 그 프로그램은 실제 메모리 주소가 아닌
가상의 주소
를 사용합니다. 이 가상 주소를 실제 메모리 주소로 바꿔주는 역할을 하는 것이 바로 페이지 테이블입니다.
예를 들어, 책에서 '1장 5페이지'를 읽으라고 하면, 진짜 물리적인 책의 123페이지일 수도 있잖아요? 마찬가지로, 프로그램이 요청한 주소(예: 0x04FF)는 실제 메모리의 다른 위치에 있을 수 있습니다. 이 연결을 기록해둔 지도가 페이지 테이블입니다.
페이지 테이블의 한 줄에는 다음과 같은 정보들이 들어 있습니다
항목 | 설명 |
---|
페이지 번호 | 가상 주소의 몇 번째 페이지인지 표시합니다 |
---|
프레임 번호 | 실제 메모리의 어떤 블록(프레임)에 저장되었는지 |
---|
유효 비트 | 해당 페이지가 메모리에 있는지 (0이면 디스크에 있음) |
---|
접근 권한 | 읽기 전용인지, 쓰기도 되는지 등을 결정 |
---|
변경 비트 | 이 페이지가 변경되었는지 (디스크에 다시 써야 하는지 여부) |
---|
가상 주소는 두 부분으로 나뉘게 됩니다:
페이지 번호 (Page Number)
– 이 주소가 몇 번째 페이지에 있는지
오프셋 (Page Offset)
– 해당 페이지 안에서 몇 번째 위치인지
마치 책에서 "5장 13번째 줄"을 찾는 것과 같아요.
➡️
예시: 가상 주소 0x04FF을 풀어보면? 🔗
- 페이지 크기: 256바이트
- 가상 주소 0x04FF = 1279 (10진수)
그럼,
- 페이지 번호:
1279 ÷ 256 = 4
- 오프셋:
1279 % 256 = 255
즉, 0x04FF는 4번 페이지의 255번째 바이트
를 의미합니다.
| 가상 주소 (Hex) | 10진수 | 페이지 번호 | 오프셋 | 의미 |
|----------------|--------|--------------|--------|------|
| 0x04FF | 1279 | 4 | 255 | 4번 페이지의 255번째 바이트 |
| 0x030A | 778 | 3 | 10 | 3번 페이지의 10번째 바이트 |
| 0x0100 | 256 | 1 | 0 | 1번 페이지의 첫 번째 바이트 |
| 0x00F0 | 240 | 0 | 240 | 0번 페이지의 240번째 바이트 |
페이지 테이블이 다음과 같다고 가정합시다:
이 경우 0x04FF → 페이지 4 → 프레임 9 → 물리 주소 =
9 x 256 + 255 = 2559
👨💻
결론: 0x04FF는 실제 메모리의 2559번 주소를 의미합니다
운영체제는 큰 프로그램을 실행할 때, 너무 커서 한 번에 다 관리하기 어려운
페이지 테이블
을 나눠서 관리합니다. 이게 바로
다단계 페이지 테이블(Multi-level Page Table)
입니다.
단일 페이지 테이블은 주소 공간이 크면 너무 커져서 메모리를 많이 차지합니다. 예를 들어:
- 32비트 주소 공간 (4GB)
- 페이지 크기 4KB → 총 페이지 수:
2³² ÷ 2¹² = 2²⁰ = 1,048,576
- 즉, 항목이 100만 개 넘음
→ 이걸 통째로 메모리에 올려놓는 건 부담이 됩니다.
그래서 필요한 것만
계층적으로 나눠서 부분적으로
메모리에 유지합니다.
생각해보세요.
📮 "강남구 301동 2층 5호"라고 할 때,
→ 먼저 구, 다음에 동, 그 다음 층, 마지막에 호수를 찾죠.
다단계 페이지 테이블도 마찬가지입니다
상위 페이지 번호
→ 페이지 디렉터리에서 하위 테이블 찾기
하위 페이지 번호
→ 실제 페이지 테이블에서 프레임 정보 찾기
오프셋
→ 최종 주소 계산
- 주소 크기: 32비트 (가상 주소는 4바이트)
- 페이지 크기: 4KB (2¹²바이트)
- 한 테이블당 1024개 항목 (2¹⁰)
→ 32비트 주소 = 10비트 (상위) + 10비트 (하위) + 12비트 (오프셋)
필드 | 비트 수 | 의미 |
---|
상위 인덱스 | 10비트 | 페이지 디렉터리 인덱스 |
---|
하위 인덱스 | 10비트 | 실제 페이지 테이블 인덱스 |
---|
페이지 오프셋 | 12비트 | 해당 페이지 안의 위치 |
---|
- 가상 주소:
0x12345678
- 2진수로 변환:
0001 0010 0011 0100 0101 0110 0111 1000
- 상위 10비트:
0001001000
= 72 → 디렉터리 인덱스
- 중간 10비트:
1101000101
= 837 → 페이지 테이블 인덱스
- 하위 12비트:
011001111000
= 1656 → 오프셋
→ 페이지 디렉터리 72번 항목 → 페이지 테이블 837번 항목 → 프레임 번호 + 1656 → 최종 물리 주소
이번 글에서는 메인 메모리의 기본 개념과 할당 방식, 페이지 테이블 구조에 대해 살펴봤습니다. 다음 글에서는 페이지 테이블 최적화 기법인 TLB와 스와핑 기법에 대해 알아보겠습니다.