들어가기 앞서 . . .
CS 공부를 하면서 CPU나 메모리 구조를 배울 때마다 자주 마주치는 용어가 바로 캐시 메모리였다.
하지만 “속도 차이를 줄이기 위한 메모리다”라는 정의만으로는 왜 필요한지, 어떻게 동작하는지 명확히 와닿지 않았다.
이번 포스팅에서는 캐시 메모리가 실제로 어떤 상황에서 사용되고, CPU와 메모리 사이에서 어떤 역할을 하는지 그림과 예시를 통해 구체적으로 정리해보고자 한다.
캐시 메모리란 무엇일까?
캐시 메모리란 속도가 빠른 장치와 속도가 느린 장치간의 속도 차이로 인해 일어나는 병목 현상을 줄이기 위한 메모리이다.
정의로만 보면 쉽게 이해가 잘 안된다. 그림과 예시를 함께 봐보자.
CPU는 연산처리가 굉장히 빠르다.
하지만 CPU가 주기억장치(RAM)에서 데이터를 가져오는데 시간이 오래 걸린다.
CPU는 연산처리가 굉장히 빠르다.
하지만 CPU가 주기억장치(RAM)에서 데이터를 가져오는데 시간이 오래 걸린다.
CPU에서 명령어나 데이터를 느리게 가져오게 되면 CPU가 대기 하는 시간이 길어지게 되므로 즉, 효율이 떨어지고 성능이 저하된다고 말할 수 있다.
이런 문제점을 캐시 메모리는 어떻게 해결할 수 있을까?
캐시메모리의 역할
캐시 메모리의 역할은 속도 차이를 완층해서 병목 현상을 줄인다고 했었다. 어떻게 속도 차이를 줄이는 지 살펴보자.
CPU가 주기억장치에 저장된 데이터를 읽어올 때, 자주 사용하는 데이터를 캐시 메모리에 저장한 뒤, 다음에 이용할 때 주기억장치가 아닌 캐시 메모리에서 먼저 가져오게하여 속도를 향상시킨다.
이해하기 쉽게 빠른 임시 저장소라고 생각하자.
속도가 빠르다는 장점이 있지만, 용량이 적고 비용이 비싸다는 단점이 있긴 하다.
캐시 메모리의 계층 구조
CPU에는 2~3개의 캐시 메모리가 존재한다.
L1, L2, L3캐시 메모리라고 부르는데, 속도와 용량에 따라 분류한 것으로 일반적으로 L1캐시부터 먼저 사용된다.
CPU에서 L1 캐시에 가장 빠르게 접근 후, 데이터가 없으면 L2 캐시로 이동한다.
듀얼 코어 프로세서의 캐시 메모리
듀얼 코어란 말 그대로 CPU가 2개의 코어를 가진 것을 말한다.
만약 L1캐시가 128kb라면, 64kb/64kb로 나누어
- 명령어를 처리하기 직전의 명령어
- 실행 후 명령어
를 각각 임시로 저장하게 된다.
각 코어마다 각각의 L1 캐시를 가지고 있고, 두 코어가 함께 쓰는 L2 캐시가 있다.
L1캐시는 CPU 내부에 존재하고, L2캐시는 CPU와 RAM 사이, L3는 보통 메인보드에 존재한다고 한다.
(요즘은 L3이 CPU 내부에 존재하기도 한다.)
예시
- 코어 A → L1 - A
- 코어 B → L1 - B
- 둘 다 → 공유 L2
캐시 메모리 작동 원리
캐시 메모리의 작동 원리에 대해서 알아보자.
시간지역성
“방금 쓴 데이터는 또 사용될 확률이 높다.”
한 번 참조된 데이터는 잠시 후 또 참조될 가능성이 높다.
for문과 while문 같은 반복문에 사용하는 조건 변수처럼 작용한다.
공간지역성
“근처의 데이터도 곧 사용할 것이다.”
배열처럼 연속된 메모리 접근에서는 arr[0]만 쓰더라도, arr[1], arr[2]도 같이 캐시에 담아둔다.
→ 다음에 또 메모리에서 불러와도 되지 않음.
이런식으로 캐시 메모리는 데이터를 저장할 때, 해당 데이터만 저장하는 것이 아닌 인근의 데이터(옆 주소의 데이터)도 같이 가져와 미래에 쓰일 것을 대비한다.
Cache Hit와 Cache Miss
Cache Hit는 필요한 데이터가 캐시에 있는 경우, Cache Miss는 필요한 데이터가 캐시에 없어 RAM에서 가져와야 하는 경우를 말한다.
Cache Miss의 3가지 유형
Cold Miss
해당 메모리 주소를 처음 불러서 나는 미스 CPU가 어떤 데이터를 처음 요청할 때, 그 데이터가 캐시에 존재한 적이 아예 없었기 때문에 당연히 못 찾고 미스가 나는 것이다.
Conflict Miss
서로 다른 데이터가 동일한 캐시 주소에 맵핑되어 충돌
Capacity Miss
캐시 크기가 부족하여 발생
캐시 구조 방식 3가지
Direct Mapped Cache(직접 매핑 캐시)
말 그대로 “직접 연결”방식이다. 메인 메모리의 어떤 주소가 딱 하나의 캐시 슬롯에만 저장될 수 있다.
즉 “0x1000번지 메모리 주소에는 반드시 캐시의 3번 자리에 들어가게 해야해.” 라고 하는 것이다.
계산이 단순해서 빠르고 구조가 간단하다는 장점이 있지만, 같은 캐시 슬롯에 여러 주소가 겹치면 기존 걸 지우고 새로 넣어야 한다.(이게 위에서 말한 Conflict Miss이다.)
Fully Associative Cache(완전 연결 캐시)
아무 칸이나 저장 가능한 방식이다. DRAM 주소를 저장할 때 빈 자리가 있으면 아무 데나 넣어도 된다.
장점으론 Direct Mapped Cache와 다르게 충돌이 거의 없어 Conflict Miss가 잘 발생하지 않는다. 하지만 어디에 있는 지 모르니 전부 다 확인해야 해, 찾을 때 느리다는 단점이 있다.
Set Associative Cache(집합 연결 캐시)
직접 매핑과 완전 연결의 중간 방식이다.
먼저 DRAM 주소를 가지고 어느 그룹(Set)에 들어갈지 정하고, 그 Set안에서는 여러 칸 중 아무 데나 저장 가능하다.
“0x1000번지 주소는 2번 그룹에 들어가야 해. 그 안에 4개의 칸 중 아무 데나 넣을 수 있어.”라는 뜻이다.
장점으론 직접 매핑보다 덜 충돌이나고, 완전 연결보다 찾기 쉽다.
하지만 구조가 좀 더 복잡하고 직접 매핑보다는 느리다는 단점이 존재한다.
마무리하며
처음에는 막연하게만 느껴졌던 캐시 메모리가, CPU의 연산 속도를 효과적으로 끌어올려주는 핵심 요소라는 걸 이해할 수 있었다.
단순히 데이터를 임시 저장하는 공간이 아니라, 자주 사용되거나 인접한 데이터를 미리 준비해 CPU 대기 시간을 줄이는 전략적 메모리 구조라는 점이 인상 깊었다.
이번 정리를 통해 운영체제나 컴퓨터 구조를 공부할 때, 메모리 계층의 작동 원리를 더 깊이 있게 이해할 수 있는 기반을 마련할 수 있었다.
'CS' 카테고리의 다른 글
[ CS ] Lock (0) | 2025.09.18 |
---|---|
[ CS ] 동기와 비동기 (0) | 2025.09.18 |