Cache, 캐시
Cache, 캐시
캐시의 등장 배경
컴퓨터는 꾸준한 발전으로 인해 프로세서(CPU)는 성능이 매우 높아졌지만, 메인 메모리(DRAM)은 프로세서의 발전 속도를 따라가지 못했다. 메모리는 속도보다 메모리 자체 용량을 늘리는 것을 목표로 했기 때문에 성능 면에서 차이가 난 것이다. 따라서 프로세서가 아무리 빨라도 계산에 필요한 데이터를 가져오기 위해서는 상대적으로 느린 메인 메모리에 접근해야 했고, 이 때문에 CPU가 메모리를 기다려야 하는 병목 현상이 발생하며 이로써 전체적인 시스템 성능 향상에 한계가 생겼다.
그래서 CPU와 메인 메모리 사이에 캐시(SRAM)를 두어, CPU와 메인 메모리 사이의 속도 간극을 줄여주는 완충재 역할로 자리잡게 된 것이다.
캐시란?
💡 캐시(cache)란, 자주 사용하는 데이터나 값을 미리 복사해 놓는 임시 장소를 말한다.
위 사진은 메모리 계층 구조이다. 위에서도 확인할 수 있듯이, 캐시는 비싸지만 작고 빠르고 CPU와 가까이 위치한다.
시스템에 장착된 캐시의 용량과 성능이 점점 증가하면서 캐시의 캐시로 사용되는 메모리가 계속 추가되었는데, 순서대로 L(Level)1, L2, L3라 부른다. 즉 1차 캐시, 2차 캐시, 3차 캐시가 된다. L1이 가장 고성능, 고가의 집적회로가 사용되고, 이보다 용량이 살짝 더 크지만 약간 더 느린 L2가 추가되었다. CPU는 처음으로 L1 캐시를 보고 데이터를 찾지 못하면 L2 캐시로 넘어가 데이터를 찾게 된다.
이처럼 한 계층은 바로 아래 계층에 대해 캐싱 작업을 수행한다. 즉, 메모리 계층 구조의 목적은 캐싱을 이용하여 빠르고 작은 메모리와 크고 느린 메모리의 장점을 조합하여 크고 빠른 메모리처럼 행동하도록 만드는 것이다.
이처럼 캐시를 이용하는 것을 캐싱이라 한다.
💡 캐싱(caching)이란, 자주 사용하는 데이터나 값을 캐시에 저장해두고, 다음에 요청할 때 DB 또는 API를 참조하지 않고 캐시에 접근해서 요청을 빠르게 처리하는 것을 말한다.
캐시와 파레토 법칙
💡 파레토 법칙이란, 80퍼센트의 결과는 20퍼센트의 원인으로 인해 발생한다는 말이다.
이러한 파레토 법칙은 캐시가 효율적임을 말해준다.
캐시는 용량이 작고, 따라서 많은 내용을 저장하지 못한다. 하지만 파레토 법칙에 따르면 서비스를 할 때 많이 사용되는 20%를 캐싱한다면 효율을 극대화하여 80퍼센트의 결과를 만들어낼 수 있다.
캐시의 특성 : 어떤 정보를 캐시에 담을 것인지
캐시의 용량은 제한적이므로, 앞서 나온 파레토 법칙에 해당하는 소수의 데이터를 선별하기 위한 기준이 필요하다. 이 기준이 바로 지역성이다.
위 사진은 순차 지역성, 공간 지역성, 시간 지역성을 시각적으로 보여준다.
순차 지역성
데이터가 순차적으로 접근 되는 경향을 보이는 것을 말한다.
일차원 배열에 대해 반복문을 통해 첫 번째 인덱스부터 차례대로 접근하는 것을 예로 들 수 있다.
공간 지역성의 개념과 겹치는 부분이 있다.
공간 지역성
특정 데이터와 가까운 주소가 순서대로 접근 되는 경향을 보이는 경우를 말한다.
CPU 캐시나 디스크 캐시의 경우, 한 메모리 주소에 접근할 때 해당 메모리 주소의 값 뿐만 아니라 해당 블록을 한꺼번에 캐시에 가져온다. 이때 메모리 주소를 오름차순이나 내림차순으로 인접한 주소에 접근한다면 이미 캐시에 저장된 블록의 데이터에 접근하므로 캐시의 효율성이 크게 향상된다.
시간 지역성
특정 데이터가 한 번 접근 되었을 경우, 가까운 미래에 또 다시 접근할 가능성이 높은 것을 말한다.
같은 메모리 주소에 여러 차례 접근할 경우, 이 주소를 캐싱해두고 재사용하면 효율성을 높일 수 있다.
캐시 사용 방식과 성능
캐시를 사용하는 일반적인 플로우는 다음과 같다.
- Server는 Client로 부터 요청을 받는다
- 해당 요청에 필요한 데이터가 Cache에 있는지 확인한다
- 데이터가 존재한다면 ⇒ cache hit
- 데이터가 없다면 ⇒ cache miss
- 없다면 메인 메모리에서 값을 가져온다
- 가져온 값을 이용하고 Cache에 저장한다.
여기서 hit와 miss의 개념이 등장한다.
- Hithit가 발생해 캐싱된 데이터를 가져오는 시간이 hit latency이다.
- 요청한 데이터가 캐시에 존재하는 경우이다.
- Miss미스가 발생해 상위 캐시나 메인 메모리에서 데이터를 가져오는 시간이 miss latency이다.
- 요청한 데이터가 캐시에 존재하지 않는 경우이다.
즉, 데이터의 평균 접근 시간은 다음과 같다.
Hit ratio X Hit Latency + (1 - Hit ratio) X Miss Latency
캐시 메모리 쓰기 정책과 캐시 일관성
CPU에서 데이터를 읽는 동작이 아니라 입력하는 동작이 발생한 경우, 데이터를 변경할 주소가 캐싱된 상태라면 메모리의 데이터가 업데이트 되는 대신 캐시의 데이터가 업데이트 된다.
따라서 메인 메모리는 따로 업데이트 해주어야 하는데, 이 메인 메모리를 업데이트 하는 시점에 따라 정책이 두 가지로 나뉜다.
Write Through 정책
메인 메모리를 바로 업데이트하는 방식이다.
단순하고 캐시와 메인 메모리 사이의 일관성을 유지할 수 있지만, 매번 바꿔줘야 하므로 느리다는 단점이 있다.
Write Back 정책
캐시만 업데이트 하다가, 업데이트된 데이터가 캐시에서 빠지게 될 때 메인 메모리를 업데이트한다.
속도는 빠르지만 캐시와 메모리가 서로 값이 다른 경우가 발생할 수 있다. 데이터가 변경되었는지 확인하기 위해 캐시 블록마다 dirty bit를 만들어주어야 한다. 데이터가 변경되면 dirty bit를 1로 만들어주고, 나중에 캐시에서 나가는 경우 dirty bit를 확인하여 1이면 메인 메모리를 업데이트 해준다.
참고자료
캐시란 무엇인가
# 캐시(Cache) > 자주 사용하는 데이터나 값을 미리 복사해 놓는 임시 장소 아래와 같은 저장공간 계층 구조에서 확인할 수 있듯이, 캐시는 저장 공간이 작고 비용이 비싼 대신 빠른 성능을 제공한
velog.io
[컴퓨터구조] 시스템 캐시란? (feat. L1, L2, L3)
1차 수정: 21.09.28 안녕하세요🐶 이번 시간에는 캐시에 대해서 알아보려고 합니다. 컴퓨터공학에서 빼놓을 수 없은 개념이 바로 캐시인데요. 그 중 CPU 에 가까이 붙어있는 시스템 캐시에 대해서
woozzang.tistory.com