5
C#을 기준으로 메모리 계층 구조(Memory Hierarchy)는 속도와 접근 비용에 따라 다단계로 구성된 저장 계층을 말합니다. 하드웨어 구조적 개념이지만, C#의 동작 방식과 어떻게 연결되는지도 함께 설명하겠습니다.
🧠 1. 메모리 계층 구조 (Memory Hierarchy)
🔺 빠르지만 비싸고 작음
🔻 느리지만 싸고 큼
레지스터 < 캐시 메모리 < 주기억 장치 (DRAM) < 보조기억 장치 (HDD, SSD)
계층 | 설명 | 속도 | 예시 (C# 관점) |
---|---|---|---|
레지스터 | CPU 내부에서 명령어 실행에 사용하는 초고속 저장소 | 🔥최고속도 | 로컬 변수, 스택 연산 (IL 수준) |
캐시 메모리 | CPU와 메모리 간 병목 완화를 위한 고속 메모리 (L1, L2, L3) | 🚀고속 | 자주 참조되는 값 (JIT 최적화 도움) |
주기억장치 | 일반 RAM. 실행 중인 프로그램, 힙/스택 데이터 저장 | ⏩중속 | new 객체, 참조형 변수 |
보조기억장치 | HDD/SSD. 프로그램 파일, DB, 로그 등 비휘발성 저장공간 | 🐢저속 | 파일 I/O, DB, 캐시 파일 |
🧩 관련 개념 설명
✅ 레지스터
- CPU 내부에서 연산에 직접 사용
- C#의 지역 변수는 컴파일러에 따라 레지스터로 최적화될 수 있음 (특히
int
등 값 형식)
int a = 10; // JIT 최적화 시 레지스터에 저장 가능
✅ 캐시 메모리 (L1, L2, L3)
- CPU는 메모리 접근보다 캐시 접근이 훨씬 빠름
- C#에서 반복적으로 접근하는 같은 데이터는 CPU 캐시에 남아 있을 확률이 높음
for (int i = 0; i < array.Length; i++)
{
total += array[i]; // 연속된 메모리 접근 → 캐시 적중률 ↑
}
✅ 주기억 장치 (DRAM, SRAM)
- 프로그램이 실행되면 코드, 데이터, 힙/스택 등이 RAM에 로드
- C#의
new
, 메서드 호출, 스택 프레임 등 대부분은 여기서 수행됨
string name = "홍길동"; // 힙에 저장
int age = 25; // 스택에 저장 (레지스터 최적화 가능)
✅ 보조 기억 장치
.exe
파일, 로그, DB, 파일 저장 등- 접근 속도가 느리므로 I/O 연산은 비동기 처리가 많음
string content = await File.ReadAllTextAsync("data.txt");
⚙️ 주소 체계와 변환
✅ 논리 주소 (Logical Address)
- 프로세스 관점 주소
- C# 실행 시 관리되는 메모리 주소 (ex:
0x004000
같은 가상 주소)
✅ 물리 주소 (Physical Address)
- 실제 RAM의 주소
- C#에서는 직접 접근 불가하지만, OS가 MMU를 통해 변환함
✅ MMU (Memory Management Unit)
- 논리 주소 → 물리 주소로 변환
- 메모리 보호 및 캐싱 제어도 담당
- C#은
OutOfMemoryException
,AccessViolationException
등 예외로 그 영향을 봄
✅ 메모리 인터리빙
- 여러 은행(bank)에 메모리를 나눠 배치하여 병렬 접근 속도 증가
- C# 수준에서는 보이지 않지만, 대규모 배열 접근시 성능 향상에 영향
✅ TLB (Translation Lookaside Buffer)
- MMU의 주소 변환을 캐시하는 구조
- 반복적으로 접근하는 주소는 빠르게 변환됨 → C# 반복문 성능 향상
for (int i = 0; i < 1000000; i++)
array[i]++; // 배열은 연속된 메모리, TLB 히트율 ↑
📌 정리표
구성 요소 | 하드웨어 위치 | C# 관점 예시 | 속도 |
---|---|---|---|
레지스터 | CPU 내부 | 지역 변수, 산술 연산 | 🔥 가장 빠름 |
캐시 메모리 | CPU ↔ 메모리 사이 | 반복 접근 배열, 최적화된 루프 | 🚀 매우 빠름 |
주기억 장치(RAM) | 메인 메모리 | new로 생성된 객체, 배열, 힙/스택 | ⏩ 보통 |
보조 기억 장치 | SSD, HDD | 파일, DB I/O | 🐢 느림 |
MMU | CPU 내 메모리 관리 유닛 | 논리 → 물리 주소 변환 | 📦 중간 |
TLB | MMU 내부 캐시 | 반복 주소 변환 최적화 | ⚡ 빠름 |
🎯 C# 프로그래머가 주의할 점
- 배열은 연속된 메모리로 캐시 친화적 → 성능에 유리
- 클래스 객체는 힙, 구조체는 값형식으로 스택 → 메모리 구조 이해 필요
- 비동기 파일/DB 접근은 느린 보조기억장치 접근이므로
async/await
적극 활용 - 큰 배열 반복 시 캐시/인터리빙 고려 → 배열 크기 조절 또는 Chunking 고려