캐시
취준하며 남긴 노트를 글로 발행해봅니당.
캐시의 계층 구조
메모리는 빠를수록 제조 비용이 높아진다. 하지만 우리의 돈은 한정되어 있지만 더 좋은 성능을 원하기 때문에 컴퓨터는 보통 계층적인 캐시 구조를 가진다.
가장 비싸고 빠른 캐시 메모리인 L1을 CPU에 가까이 두고 그 다음으로 빠른 메모리를 배치한다. 자주 사용하는 데이터는 가장 빠른 L1에 저장되어 매우 빠르게 접근 된다. 이렇게 배치하면, 성능을 타협하며 전체적인 비용을 매우 낮출 수 있다.
성능적으로 보면 어떨까? 계층 구조를 사용하면 여러 단계에서 캐싱을 할 수 있어서 CPU가 캐시에서 데이터를 찾을 확률이 높아진다. L1에서 못찾더라도 L2에서 발견할 가능성이 높다.
출처: https://ocw.mit.edu/courses/6-004-computation-structures-spring-2017/pages/c14/c14s1/#1
데이터의 지역성
프로그램을 실행할 때 데이터 접근이 특정한 경향을 보이는 특성을 말한다. 이러한 특성을 이해하는 것은 캐시 메모리 시스템의 성능을 크게 향상시킬 수 있다. 캐시는 최근에 접근된 데이터나 인접한 데이터를 미리 로드해 두어 메모리 접근 시간을 개선한다.
1. 시간적 지역성
최근에 접근된 데이터가 가까운 미래에 다시 접근될 가능성이 높은 특성을 말한다.
2. 공간적 지역성
최근에 접근된 데이터에 물리적으로 인접해 있는 메모리가 가까운 미래에 접근될 가능성이 높은 특성을 말한다.
= 한번 접근한 메모리의 주소의 주변 주소들도 곧 접근될 것이라는 말이다.
캐시의 교체 정책
캐시는 가득 찼을 때 어떤 것을 교체할지 결정해야 한다. 그 교체 정책은 캐시의 효율성과 성능에 크게 영향을 미치므로 이해하는 것이 중요하다. 특히 백엔드를 준비한다면!
대표적으로 Least Recently Used (LRU), First In First Out (FIFO), Random Replacement 등이 있다.
Least Recently Used (LRU)
- 가장 오래 사용하지 않은 캐시 라인을 교체하는 정책이다.
- 시간을 추적해야 해서 오버헤드가 발생한다.
- 제일 실용적으로 많이 쓰인다.
First In First Out (FIFO)
- 언제 접근했는지 신경 쓰지 않고 제일 오래된 캐시를 지운다.
- 시간을 추적할 필요가 없다.
캐시의 쓰기 정책
궁국적으로 우리는 메인 메모리를 새로운 데이터로 Write해야 하는데 언제 해야 할까?
쓰기 정책은 CPU가 데이터를 캐시에 끌 때 메인 메모리와의 동기화 방식으로 쓸 정책을 말한다.
Write-through
바로! CPU가 Write 요청을 캐시에게 보내면 Cache가 같은 Write 요청을 메인 메모리에 수행한다.
특징
- 메인 메모리를 항상 최신의 값으로 업데이트 되어 있다
단점
- 하지만 이때 CPU가 DRAM의 Write 작업이 끝날 때까지 기다리기 때문에 느릴 수 있다.
- 계속 반복적으로 Write하다가 특정 작업이 끝났을 때 마지막 값만 업데이트하는 경우 비효율적이다
- 메인 메모리로의 쓰기 작업이 빈번하게 발생하여 메모리 대역폭을 많이 사용한다.
Write-behind
CPU가 데이터를 캐시에 쓰고 메인 메모리는 나중에 쓰기 작업을 수행한다.
- 쓰기 작업은 백그라운드로 돌린다! → CPU는 쓰기 작업이 완료될 떄까지 기다리지 않고 계속 실행한다.
특징
- CPU가 Write 작업을 기다리 않아서 성능이 향상된다.
단점
- 메인 메모리로의 쓰기 작업은 여전히 많이 발생하여 대역폭을 많이 잡아먹는다.
Write-back
CPU가 데이터를 캐시에 쓰지만, 메인 메모리는 나중에 블록이 교체될 때만 Write한다. 캐시에 저장된 데이터는 변경되지만 메인 메모리에는 반영되지 않을 수 있어진다.
특징
- 가장 빠르다.
- 메인 메모리의 쓰기 작업이 캐시 블록이 교체될 때만 발생해서 메모리 대역폭을 적게 사용한다.
- 현대 시스템에서 많이 채택된다.
단점
- 구현이 복잡하다
- 캐시 일관성 유지가 어렵다
면접 질문 예상해보기
캐시 메모리가 계층 구조를 가지는 이유는?
성능과 비용을 최적하기 위해서입니다.
메모리 속도가 높아질수록 가격은 비싸지기 때문에 성능을 극대화하면서 비용을 효율적으로 쓰기 위해 계층적으로 설계됐습니다.
용량이 작고 제일 빠른 메모리는 CPU에 가까이 배치하고 용량이 크지만 약간 느린 캐시는 뒤에 배치하여 비용을 절감했습니다.
그리고 계층 구조를 통해 데이터가 여러 단계에서 캐싱되므로 CPU가 느린 메모리까지 가지 않고 캐시에서 데이터를 찾을 가능성이 높아집니다.
캐시 일관성 문제가 무엇인가요?
캐시 일관성 문제는 여러 캐시가 동일 메모리에 위치한 서로 다른 데이터를 가지고 있을 때 발생합니다.
예를 들어서, Multicore 시스템에서 각 코어가 자신의 캐시에 데이터를 저장할 때 동일한 데이터에 대한 여러 복사본이 불일치되는 문제입니다.
캐시 일관성을 유지하기 위해서는 여러 방법이 있는데 대표적으로 각 캐시가 버스를 모니터링하여 다른 캐시의 데이터의 접근을 감지하고 필요에 따라 자신의 데이터를 업데이트 하는 “버스 스누핑”, 중앙 디렉터리를 사용하여 각 캐시의 상태를 추적하고 일관성을 유지하는 “디렉터리 기반 프로토콜” 등이 있습니다.
반복문에서 동일한 변수에 여러 번 접근할 때, 이 변수는 어떤 지역성을 가지나요?
시간 지역성
댓글
이 글 공유하기
다른 글
-
시스템 콜
시스템 콜
2025.03.20 -
꼬리 재귀
꼬리 재귀
2025.03.20 -
폰 노이만 구조의 특징
폰 노이만 구조의 특징
2025.03.20 -
Container화 한 Spring Boot 3의 baseUrl을 Nginx header로 알맞게 바꿔주자!
Container화 한 Spring Boot 3의 baseUrl을 Nginx header로 알맞게 바꿔주자!
2025.03.04