메모리 계층 구조는 컴퓨터 시스템 내의 다양한 메모리 장치들이 계층적으로 조직된 구조를 말한다. 각 계층은 용량, 가격, 속도의 차이에 따라 구성되며, CPU가 데이터를 처리할 때 성능과 효율성을 극대화하기 위해 설계되었다.
구성 계층
CPU 레지스터: 가장 빠르지만 용량이 매우 적다. CPU가 명령을 즉시 실행하기 위해 데이터를 저장하는 메모리.
CPU 캐시 메모리 (L1/L2/L3): CPU와 메인 메모리 간의 속도 차이를 줄이기 위해 사용되며, 속도가 빠르고 용량이 적음.
메인 메모리 (RAM): 주 메모리로 데이터를 저장하고 처리 속도가 빠르지만 캐시보다 느림.
보조 기억 장치: 하드 디스크(HDD), SSD 등으로 대용량 데이터를 저장하는 데 사용되며, 속도는 상대적으로 느리다.
속도와 용량의 반비례 관계
계층의 역할

메모리 계층 구조는 CPU 레지스터부터 보조 기억 장치까지 다양한 메모리 유형을 포함하며, 각각의 계층은 성능, 용량, 속도, 가격에 따라 구분된다. 아래는 주요 메모리 계층의 특징을 표로 정리한 것이다.
| 메모리 계층 | 용도 | 용량 | 속도 | 가격 | 휘발성 |
|---|---|---|---|---|---|
| CPU 레지스터 | 명령어와 데이터 저장 | 8~30개, 1KB 미만 | <1ns | 높음 | 휘발성 |
| L1/L2 캐시 | 한 코어의 데이터 저장 | 32KB/256KB | <5ns | 높음 | 휘발성 |
| L3 캐시 | 멀티 코어 데이터 공유 저장 | 8MB | <5ns | 높음 | 휘발성 |
| 메인 메모리 | 전체 프로그램과 데이터 저장 | 최소 8GB 이상 | <50ns | 보통 | 휘발성 |
| 보조 기억 장치 | 파일, 데이터베이스 등 장기 저장 | TB 단위 | <20ms | 저렴 | 비휘발성 |
메모리 계층화는 CPU와 메모리 간의 데이터 전송 속도를 높이고, 시스템 비용을 절감하기 위한 중요한 설계 전략이다.
CPU 성능 향상
CPU가 점점 더 높은 성능을 요구함에 따라, 더 빠른 메모리가 필요해졌다.
컴퓨터 성능 및 데이터 대형화
컴퓨터가 더 많은 데이터를 처리하기 시작하면서 저장 장치의 요구사항도 커졌다.
결론
메모리 계층화는 성능과 비용의 균형을 맞추기 위한 과정의 산물이다.
액세스 시간 단축
CPU와 메모리 간 데이터 접근 시간을 최소화하여, CPU가 대기하지 않고 작업을 수행할 수 있도록 한다.
시스템 성능 극대화
각 메모리 계층은 속도와 용량의 차이를 활용하여 성능을 최적화하며, 필요한 데이터를 적시에 제공한다.

컴퓨터 시스템의 메모리 계층에서는 CPU가 효율적으로 작업을 수행할 수 있도록 데이터를 단계적으로 이동시키는 과정이 이루어진다. 이를 통해 보조 기억 장치에 저장된 데이터가 CPU 레지스터까지 전달된다.
보조 기억 장치 → 메인 메모리 (RAM)
프로그램이 실행될 때, 보조 기억 장치(Hard Disk 또는 SSD)에 저장된 실행 파일이 메인 메모리로 복사된다.
이 과정은 파일 시스템에서 실행 코드와 데이터를 로드하여 메인 메모리에 적재하는 단계이다.
메인 메모리 → L3 캐시
실행 중인 프로그램의 일부 코드와 데이터가 L3 캐시로 복사된다.
L3 캐시는 다중 CPU 코어가 공유하는 캐시로, 메인 메모리와 CPU 간의 병목 현상을 줄이는 역할을 한다.
L3 캐시 → L1/L2 캐시
프로그램 실행에 필요한 데이터 일부가 CPU 코어 내의 L1/L2 캐시로 전달된다.
L1 캐시는 속도가 가장 빠르며, CPU가 자주 사용하는 데이터를 저장한다. L2 캐시는 L1 캐시의 용량 부족을 보완한다.
L1/L2 캐시 → CPU 레지스터
CPU가 명령어를 실행할 때 필요한 데이터를 L1/L2 캐시에서 레지스터로 전달한다.
레지스터는 CPU 내에서 가장 빠른 메모리로, 즉각적인 명령 처리에 사용된다.
점진적 최적화: 데이터는 느리고 용량이 큰 저장 장치에서 빠르고 용량이 작은 메모리로 단계적으로 이동하며, 이를 통해 데이터 액세스 시간을 줄인다.
계층 간 협력: 각 계층은 CPU의 데이터 요구를 예측하고 필요한 데이터를 미리 로드하여 CPU의 작업을 지원한다.
Q. 작은 캐시에 실행할 프로그램 코드와 데이터를 일부만 저장하는데, 이것이 효율적일까?
A. 효율적이다. "참조의 지역성" 원리 때문이다.
시간적 지역성 (Temporal Locality)
최근 사용된 데이터는 다시 참조될 가능성이 높다.
예를 들어, 반복문에서 같은 변수나 배열 요소를 반복적으로 사용하는 경우이다.
공간적 지역성 (Spatial Locality)
현재 참조된 데이터의 근처에 있는 메모리 영역이 곧 사용될 가능성이 높다.
예를 들어, 배열의 요소를 순차적으로 접근할 때 발생한다.
메모리 계층은 속도와 용량의 균형을 맞추기 위해 설계되었다.
캐시는 용량은 작지만, 참조의 지역성 덕분에 자주 사용되는 데이터만 효율적으로 저장해 CPU가 빠르게 접근할 수 있다.
이로 인해 캐시 히트율이 높아지고, 전체 시스템 성능이 크게 향상된다.
운영체제는 컴퓨터 시스템에서 메모리를 효율적으로 관리하는 핵심적인 역할을 한다. 메모리 관리가 필요한 이유는 다음과 같다.
메모리는 여러 프로세스가 동시에 접근하고 사용하는 공유 자원이다.
하나의 시스템에서 여러 프로그램이 실행되면서 자원 충돌이 발생할 가능성이 있다.
운영체제는 각 프로세스에 적절한 메모리를 분배하여 효율적인 동시 실행 환경을 제공한다.
현대의 많은 프로그램은 물리적 메모리보다 더 많은 메모리를 요구하는 경우가 많다.
가상 메모리 기술: 운영체제는 가상 메모리를 사용하여 물리적 메모리 용량을 초과하는 프로그램도 실행 가능하게 한다.
효율적인 자원 활용: 여러 프로세스의 메모리 요구량이 물리적 메모리를 초과하더라도 효율적으로 조율하여 실행할 수 있다.
운영체제는 제한된 메모리 자원을 최대한 활용하여 가능한 많은 프로세스를 동시에 실행할 수 있도록 한다.
다중 작업 환경 지원: 효율적인 메모리 관리를 통해 시스템 성능을 극대화한다.
프로세스 스케줄링과의 연계: 메모리 관리와 프로세스 스케줄링은 밀접하게 연결되어 있다. 운영체제는 CPU와 메모리 자원을 적절히 분배하여 전체 성능을 최적화한다.
컴퓨터에서 메모리는 오직 주소를 통해 접근하며, 이 주소는 물리 주소(Physical Address) 와 논리 주소(Logical Address) 로 나뉜다. 두 주소 체계는 메모리 접근의 효율성과 보안을 위해 구분되어 사용된다.
컴퓨터 시스템에서 프로그램은 논리 주소를 사용하여 메모리에 접근하며, 실제 메모리 작업은 물리 주소를 통해 이루어진다. 이 두 주소 간의 변환은 MMU(Memory Management Unit)에 의해 처리된다.

- 왼쪽: CPU가 생성한 논리 주소와 명령어 실행 과정.
- 중앙: MMU가 논리 주소를 물리 주소로 변환하는 과정.
- 오른쪽: 변환된 물리 주소를 통해 메모리(RAM)에서 데이터를 읽고 쓰는 모습.
사진의 왼쪽 부분은 CPU 내부 구조와 명령 실행 과정을 보여준다.
mov ax, [4]로, 이는 논리 주소 4번지의 데이터를 읽어와 레지스터에 저장하라는 의미이다.사진의 중앙 부분은 논리 주소를 물리 주소로 변환하는 과정을 나타낸다.
사진의 오른쪽 부분은 물리 메모리 구조를 보여준다.

이 그림은 80386 CPU에서 논리 주소가 물리 주소로 변환되는 과정이다. 특히, MMU(Memory Management Unit)와 각 구성 요소의 역할을 설명하고 있다.
CPU의 중앙 처리 장치(Central Processing Unit) 내부에서 논리 주소(Logical Address)가 생성된다.
주요 과정:
Segmentation Unit:
Paging Unit:
Central Processing Unit (CPU):
MMU (Memory Management Unit):
Bus Interface Unit (BIU):
CPU 내부에서 명령어를 해석하고, 실행을 위해 논리 주소를 생성한다.
MMU가 논리 주소를 선형 주소로 변환한 뒤, 페이지 기반 매핑을 통해 물리 주소로 변환한다.
변환된 물리 주소는 Physical Address Bus를 통해 메모리나 외부 장치로 전달된다.
컴파일러의 역할: 소스 코드를 분석하여 명령어와 변수들을 논리 주소로 변환한다.
운영체제는 응용프로그램(프로세스)을 메모리에 적재하면서 논리 주소를 물리 주소로 연결하는 과정을 수행한다.
운영체제의 역할:
매핑 테이블의 활용:
프로그램이 실행되면, CPU가 생성하는 논리 주소는 MMU에 의해 물리 주소로 변환된다.
MMU의 역할:
중요성:
#include <stdio.h>int n = 0; // 전역 변수
int main() {
printf("변수 n의 주소는 %p\n", &n); // 변수 n의 주소 출력
return 0;
}
위 코드는 전역 변수 n의 주소를 출력하는 C 프로그램이다. 여기서 출력된 주소는 변수 n의 논리 주소이다.
$ gcc -o logical logicaladdress.c
$ ./logical
변수 n의 주소는 0x60103c
동일한 프로그램을 여러 번 실행하면 출력되는 주소 값은 동일하다.
n의 주소는 논리 주소로, 프로그램이 실행될 때마다 논리 주소 공간에서 동일한 위치를 가지기 때문이다.전역 변수 n의 주소는 논리 주소이다.
PIE 및 ASLR과 같은 보안 기능이 활성화된 환경에서는 실행마다 논리 주소가 달라질 수 있지만, 기본적으로 이는 프로그램의 논리 주소 공간에서 결정된 값이다.
PIE를 비활성화하면, 실행 결과의 주소는 항상 동일하다.
ASLR은 메모리 공격을 방어하기 위해 도입된 기술로, 프로그램이 실행될 때마다 메모리의 주소 공간을 랜덤하게 배치하여 공격자가 메모리 구조를 예측하기 어렵게 만든다.

도입 배경:
작동 방식:
보안 강화:
메모리 레이아웃이 매 실행마다 변하므로, 공격자가 특정 메모리 주소를 겨냥하기 어렵다.
메모리 기반의 익스플로잇 공격(예: 리턴 투 리브(Return-to-libc))을 방어하는 데 효과적이다.
랜덤화 예시:
PIE(Position Independent Executable) 필요:
전역 변수 및 코드 영역:
프로세스 생성 시:
실행 중 메모리 요청 시:

CPU와 물리 메모리:
프로세스 A, B, C:
하드 디스크의 역할:
공간 분배:
메모리 부족 문제:

정의: 프로세스별로 연속된 메모리 영역을 할당하는 방식.
특징:
세부 유형:
정의: 프로세스별로 메모리를 여러 블록(분할된 영역)으로 나누어 할당.
특징:
세부 유형:
| 기법 | 장점 | 단점 |
|---|---|---|
| 연속 메모리 할당 | 관리가 간단, 구현이 쉬움 | 외부 조각화 발생 가능 |
| 분할 메모리 할당 | 메모리 사용 효율성 증가 | 관리 복잡, 테이블 관리 필요 |
| 페이징 | 외부 조각화 없음 | 페이지 테이블 관리로 오버헤드 발생 |
| 세그먼테이션 | 논리 구조에 맞는 메모리 할당 가능 | 외부 조각화 발생 가능 |

설명: 메모리를 미리 정해진 고정 크기의 파티션으로 나눈 뒤, 각 프로세스에 하나의 파티션을 할당한다.
특징:
파티션 크기는 동일하거나, 다양한 크기로 고정될 수 있다.
각 파티션은 프로세스 크기와 상관없이 정해진 크기를 차지한다.
메모리 조각화 발생:
그림 (a):
설명: 프로세스가 요구하는 메모리 크기만큼 동적으로 할당한다.
특징:
그림 (b):
설명:
메모리를 가변 크기의 세그먼트로 나누고, 각 세그먼트는 프로세스의 논리적 단위(코드, 데이터, 스택 등)에 맞춰 할당된다.
각 세그먼트는 독립적으로 관리되며, 크기가 다를 수 있다.
특징:
논리적 분할: 프로세스의 구조를 반영하여 논리적인 메모리 관리가 가능.
외부 조각화 발생: 세그먼트 크기가 가변적이므로 외부 조각화(External Fragmentation)가 발생할 수 있다.
주소 구성: 세그먼트 번호(Segment Number)와 세그먼트 내 오프셋(Offset)으로 구성된 논리 주소를 사용한다.
그림 (c):
설명:
메모리를 고정 크기의 페이지로 나누고, 프로세스도 동일한 크기의 페이지로 분할하여 메모리에 할당한다.
프로세스의 페이지는 물리 메모리의 다양한 위치에 저장될 수 있다.
특징:
고정 크기 분할: 모든 페이지가 동일한 크기를 가지므로 관리가 단순.
내부 조각화 발생 가능: 마지막 페이지에 남는 공간이 낭비될 수 있음.
주소 구성: 페이지 번호(Page Number)와 페이지 내 오프셋(Offset)으로 구성된 논리 주소를 사용한다.
외부 조각화 없음: 고정 크기 페이지로 나뉘기 때문에 외부 조각화가 발생하지 않는다.
그림 (d):
연속 메모리 할당은 하나의 프로세스를 메모리의 연속된 공간에 배치하는 방식으로, 초기 운영체제에서 주로 사용된 메모리 관리 기법이다.
프로세스의 배치 방식:
초기 운영체제의 사용 사례:
고정 크기 할당 (Fixed Size Partition):
가변 크기 할당 (Variable Size Partition):
장점:
단점:
IBM OS/360 운영체제에서 사용된 연속 메모리 할당 기법의 두 가지 방식, 즉 고정 크기 할당(MFT)과 가변 크기 할당(MVT) 이 있다.

설명:메모리를 고정된 크기의 파티션으로 나누고, 각 파티션에 프로세스를 할당하는 방식.
그림 설명:

설명: 프로세스가 요청한 메모리 크기에 따라 동적으로 파티션을 생성하고 할당하는 방식.
그림 설명:
| 특징 | 고정 크기 할당 (MFT) | 가변 크기 할당 (MVT) |
|---|---|---|
| 파티션 크기 | 고정 | 가변 |
| 조각화 유형 | 내부 조각화 발생 | 외부 조각화 발생 |
| 메모리 활용 효율성 | 낮음 | 높음 |
| 관리 복잡도 | 단순 | 복잡 |
단편화는 프로세스에 메모리를 할당할 때, 사용할 수 없는 조각 메모리(홀, hole)가 발생하는 현상을 말한다. 이는 메모리 관리의 효율성을 저하시키며, 내부 단편화와 외부 단편화로 나뉜다.

설명:
특징:
그림 설명:

설명:
특징:
그림 설명:
| 특징 | 내부 단편화 (Internal) | 외부 단편화 (External) |
|---|---|---|
| 발생 원인 | 고정 크기 할당 | 가변 크기 할당 |
| 문제 위치 | 파티션 내부 | 파티션과 파티션 사이 |
| 영향 | 메모리 공간 낭비 | 메모리 공간 분산으로 인한 배치 불가 |
압축(Compaction):
페이징(Paging):
세그먼테이션(Segmentation):
연속 메모리 할당은 하드웨어와 운영체제의 협력을 통해 구현된다.
필요한 레지스터:
Base 레지스터:
Limit 레지스터:
주소 레지스터:
주소 변환 하드웨어 (MMU):
프로세스별 메모리 정보 관리:
비어 있는 메모리 영역 관리:
스케줄링과 레지스터 갱신:
운영체제가 새로운 프로세스를 메모리에 적재.
Base 레지스터와 Limit 레지스터에 프로세스의 메모리 시작 주소와 크기 정보를 설정.
MMU가 Base 레지스터와 논리 주소를 사용하여 물리 주소를 계산.
Limit 레지스터로 메모리 접근 범위를 확인, 초과 시 접근을 차단.

논리 주소 → 물리 주소 변환:
CPU가 명령어(mov ax, [300])를 실행하며 논리 주소 300을 참조.
MMU(Memory Management Unit)가 Base 레지스터 값을 더해 물리 주소 1300번지 계산.
Limit 레지스터를 확인하여 논리 주소가 범위를 초과하지 않는지 검증.
0에서 799 사이에 있는 경우, 메모리 접근이 허용.CPU 내부:
1000800300mov ax, [300]300은 Base 레지스터를 통해 물리 주소 1300으로 변환.메모리 구조:
1000~1799번지가 프로세스에 할당.1300번지에 접근해 데이터를 처리.간단한 주소 변환 과정:
운영체제의 부담 경감:
메모리 할당의 유연성 부족:
단편화 문제:
해결 방안:
운영체제의 역할:
목적:
동적 메모리 할당 요청에 대해, 운영체제는 비어 있는 메모리 공간(홀) 중 하나를 선택하여 할당한다. 대표적인 선택 알고리즘 세 가지는 다음과 같다:
| 전략 | 장점 | 단점 |
|---|---|---|
| First-Fit | 빠른 검색 및 간단한 구현 | 단편화 발생 가능 |
| Best-Fit | 메모리 낭비 최소화 | 검색 속도가 느림 |
| Worst-Fit | 큰 홀 유지로 대형 요청 처리 가능 | 단편화 증가 가능성 |

메모리에는 비어 있는 공간(홀)과 사용 중인 메모리가 존재.
홀은 크기가 각각 다르며, 슬라이드에서는 홀4, 홀3, 홀2, 홀1로 구분됨.
비어 있는 홀 중 하나를 선택하여 메모리를 할당해야 한다.
설명:요청된 크기 이상인 첫 번째 홀을 선택하여 할당.
결과: 홀2가 선택됨.
설명:요청된 크기에 가장 근접한 크기의 홀을 선택하여 할당.
결과: 홀3이 선택됨.
설명:요청된 크기 이상인 가장 큰 홀을 선택하여 할당.
결과:홀4가 선택됨.
| 전략 | 선택된 홀 | 장점 | 단점 |
|---|---|---|---|
| First-Fit | 홀2 | 검색 속도가 빠름 | 단편화가 앞부분에 축적될 가능성 |
| Best-Fit | 홀3 | 메모리 낭비를 최소화 | 검색 시간이 오래 걸릴 수 있음 |
| Worst-Fit | 홀4 | 남은 공간을 큰 조각으로 유지 | 단편화가 심해질 가능성 |
세그먼테이션은 프로그램을 구성하는 논리적 단위(세그먼트)로 메모리를 분할하여 관리하는 기법이다. 각 세그먼트는 고유한 크기를 가지며, 프로세스의 논리적 구조를 반영한다.
정의:
일반적인 세그먼트 종류:
논리 세그먼트로 분리:
주소 공간:
논리 → 물리 주소 변환:
외부 단편화 발생:
논리적 구조 반영:
유연한 메모리 관리:
단점:
세그먼테이션(Segmentation) 기법에서 논리 세그먼트와 물리 세그먼트 간의 매핑 과정이다. 각 프로세스는 논리 세그먼트로 나뉘며, 세그먼트 테이블을 통해 물리 메모리의 적절한 위치에 매핑된다.

왼쪽: 프로세스1과 프로세스2의 논리 세그먼트.
가운데: 논리 세그먼트를 관리하는 세그먼트 테이블.
오른쪽: 물리 메모리로 매핑된 각 세그먼트.
코드, 스택, 힙, 데이터 세그먼트가 서로 다른 물리적 위치에 저장.구조:
코드 세그먼트 : Limit = 크기, Base = 물리 주소 시작 위치.데이터 세그먼트, 스택 세그먼트, 힙 세그먼트도 각각 저장.역할:
코드 세그먼트는 물리 메모리의 첫 번째 홀에 매핑.스택 세그먼트는 두 번째 물리 공간에 매핑.유연한 메모리 관리:
주소 변환:
물리 주소 = Base + Offset, Offset이 Limit을 초과하면 메모리 보호.외부 단편화 문제:
세그먼테이션(Segmentation) 기법은 하드웨어와 운영체제의 협력을 통해 구현된다.
논리 주소 구성:
[세그먼트 번호, 옵셋]의 형태로 구성.CPU 레지스터:
MMU (Memory Management Unit):
세그먼트 테이블:
세그먼트의 동적 관리:
컨텍스트 스위칭:
컴파일러:
링커:
로더:
주소 변환:
[세그먼트 번호, 옵셋]을 기반으로 논리 주소를 계산.물리 주소 = Base + Offset (Offset이 Limit을 초과하지 않을 경우).메모리 보호:
유연한 메모리 관리:
세그먼테이션(Segmentation) 기법에서 논리 주소를 물리 주소로 변환하는 과정이다. 각 논리 세그먼트는 세그먼트 테이블을 통해 물리 메모리에 매핑되며, MMU(Memory Management Unit)가 주소 변환과 보호 기능을 수행한다.

[s, offset]으로 구성.CPU의 논리 주소 생성:
[s, offset]를 생성.세그먼트 테이블 참조:
s를 기반으로 세그먼트 테이블에서 해당 세그먼트의 시작 주소(Base)와 크기(Limit)를 가져옴.주소 변환:
Base + OffsetMMU를 통한 검증:
물리 주소로 변환:
유효성 검증:
오류 처리:
주소 변환의 단순성:
Base + Offset)으로 물리 주소를 계산.메모리 보호:
유연한 메모리 관리:
단편화는 메모리를 효율적으로 관리하지 못하여 사용할 수 없는 메모리 공간(Hole)이 발생하는 현상을 말한다.
세그먼테이션에서는 외부 단편화가 발생할 수 있음.
내부 단편화는 발생하지 않음.