Home C# [C#]메모리 계층 구조

[C#]메모리 계층 구조

by DUBUKIMCH

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🐢 느림
MMUCPU 내 메모리 관리 유닛논리 → 물리 주소 변환📦 중간
TLBMMU 내부 캐시반복 주소 변환 최적화⚡ 빠름

🎯 C# 프로그래머가 주의할 점

  • 배열은 연속된 메모리로 캐시 친화적 → 성능에 유리
  • 클래스 객체는 힙, 구조체는 값형식으로 스택 → 메모리 구조 이해 필요
  • 비동기 파일/DB 접근은 느린 보조기억장치 접근이므로 async/await 적극 활용
  • 큰 배열 반복 시 캐시/인터리빙 고려 → 배열 크기 조절 또는 Chunking 고려

You may also like

Leave a Comment

error: Content is protected !!