학습 자료 글/컴퓨터시스템

컴퓨터시스템 기초 14. 메모리 계층은 왜 프로그램 속도를 바꿀까

cedis 2026. 3. 31. 16:24

[컴퓨터 시스템] 14. 메모리 계층은 왜 프로그램 속도를 바꿀까

13편까지가 값과 명령이 어떻게 표현되고 실행되는지에 가까웠다면, 이제는 같은 코드라도 왜 어떤 경우는 빠르고 어떤 경우는 느린지로 시선을 옮겨야 합니다. 그 중심에는 메모리 계층과 cache가 있습니다.

이번 글은 저장장치, RAM, cache, register를 속도 계층으로 보고, locality와 cache line이 왜 성능 이야기의 핵심 단어인지 정리합니다.

먼저 짚고 갈 용어
memory hierarchy: 속도와 용량이 다른 저장 계층이 층을 이루는 구조
cache line: cache가 한 번에 가져오는 연속 데이터 묶음
locality: 최근 값이나 가까운 주소를 반복해 쓰는 경향
이번 글에서 다루는 것
  • 왜 메모리 계층이 여러 층으로 나뉘는지
  • cache line이 값 하나보다 데이터 묶음으로 이해돼야 하는 이유
  • 시간적/공간적 locality가 왜 중요한지
  • 접근 패턴이 성능을 어떻게 바꾸는지
  • 실제 적용 문제로 locality를 판단하는 연습
한눈에 보는 흐름
1
왜 메모리 계층이 여러 층으로 나뉘는지
2
cache line이 값 하나보다 데이터 묶음으로 이해돼야 하는 이유
3
시간적/공간적 locality가 왜 중요한지
4
접근 패턴이 성능을 어떻게 바꾸는지

1. 메모리 계층은 속도와 용량의 타협 구조다

모든 데이터를 가장 빠른 저장장치에 둘 수 있다면 좋겠지만, 현실에서는 속도, 용량, 비용이 충돌합니다. 그래서 아주 빠르지만 작은 계층과, 느리지만 큰 계층이 층을 이루게 됩니다.

그림으로 먼저 보기
register
속도 감각: 가장 빠름
용량 감각: 매우 작음
cache
속도 감각: 매우 빠름
용량 감각: 작음
RAM
속도 감각: 중간
용량 감각: 상대적으로 큼
storage
속도 감각: 가장 느림
용량 감각: 가장 큼

시스템 관점에서는 이 계층을 부품 이름보다 CPU가 데이터를 얼마나 빨리 받을 수 있는지 결정하는 구조로 보는 편이 중요합니다.

계층속도 감각용량 감각
register가장 빠름매우 작음
cache매우 빠름작음
RAM중간상대적으로 큼
storage가장 느림가장 큼

2. cache는 값 하나가 아니라 묶음을 가져온다

cache를 처음 배울 때 '필요한 값 하나를 가져온다'로 이해하면 절반만 이해한 것입니다. 실제로는 cache line이라는 연속된 데이터 묶음을 함께 가져오는 경우가 많습니다.

그래서 현재 쓰는 값 근처의 데이터도 곧 쓸 가능성이 높다면 유리하고, 멀리 흩어진 데이터만 계속 건드리면 낭비가 커집니다.

핵심 그림
배열 원소 하나를 읽었는데 옆 원소들도 함께 들어온다고 생각하면 cache line과 공간적 locality를 훨씬 빨리 이해할 수 있습니다.

3. locality는 왜 성능 이야기의 중심이 될까

시간적 locality는 최근에 쓴 값을 곧 다시 쓰는 경향이고, 공간적 locality는 근처 주소를 이어서 쓰는 경향입니다. 둘 다 cache가 미리 가져온 데이터를 덜 낭비하게 만듭니다.

그림으로 먼저 보기
시간적 locality
질문: 방금 쓴 값을 곧 다시 쓰는가
예시: 누적 합 변수 반복 사용
공간적 locality
질문: 근처 주소를 이어서 쓰는가
예시: 배열을 앞에서 뒤로 순차 접근

즉 locality는 알고리즘 복잡도와는 별개로, 같은 O(n) 코드도 실제 실행 시간이 크게 달라질 수 있는 이유를 설명해 줍니다.

locality 유형질문예시
시간적 locality방금 쓴 값을 곧 다시 쓰는가누적 합 변수 반복 사용
공간적 locality근처 주소를 이어서 쓰는가배열을 앞에서 뒤로 순차 접근

4. 접근 패턴이 비슷해 보여도 성능은 달라질 수 있다

행 우선 순회와 열 우선 순회처럼 계산량은 비슷해 보여도 메모리 접근 순서가 cache 친화적인지에 따라 속도 차이가 크게 날 수 있습니다. 이 지점부터는 CPU만이 아니라 데이터 배치와 접근 순서도 함께 봐야 합니다.

과정 그림
1
연속된 배열을 순차 접근하면 cache line 활용도가 높아진다.
2
멀리 떨어진 주소를 반복해서 건드리면 miss가 늘기 쉽다.
3
동일한 계산량이어도 miss 패턴 차이로 실행 시간이 달라질 수 있다.

5. 직접 해볼 문제: 어느 쪽이 cache 친화적일까

이 문제는 정답 코드보다 접근 패턴을 설명하는 것이 핵심입니다.

미니 문제
2차원 배열을 순회할 때 행을 먼저 도는 방식과 열을 먼저 도는 방식 중 어느 쪽이 더 cache 친화적일지, 그리고 왜 그런지 locality 관점으로 설명해 보세요.

이번 글에서 기억할 것

메모리 계층은 속도와 용량의 타협으로 만들어진 구조다.
cache는 값 하나가 아니라 cache line 단위로 데이터를 가져오는 경우가 많다.
실제 성능을 보려면 연산량뿐 아니라 접근 패턴과 locality를 함께 봐야 한다.

스스로 점검

왜 메모리 계층이 한 층으로 통일되지 않고 여러 층으로 나뉘는지 설명할 수 있는가
cache line과 locality를 서로 연결해 설명할 수 있는가
같은 계산량이어도 접근 패턴 때문에 성능이 달라질 수 있다는 점을 말할 수 있는가

다음 글 예고

다음 글에서는 이 감각을 최적화와 연결해, 왜 측정과 locality가 함께 가야 하는지 정리합니다.

한 줄 정리
프로그램 속도는 연산량만이 아니라 데이터가 메모리 계층을 어떻게 통과하느냐에 크게 좌우됩니다.