티스토리 뷰
1. 컴퓨터 시스템에서 연산 속도
- CPU 레지스터 > CPU 캐시(Cache) > 메인 메모리(RAM) > 하드 디스크(HDD)
2. 캐시(Cache)를 왜 사용할까?
메모리가 CPU 속도를 따라오지 못한다.
CPU 성능은 빠르게 향상되었지만, 메모리의 처리 속도는 이를 따라오지 못했다. 아무리 CPU의 처리 속도가 빠르더라도 메모리 속도가 이를 따라오지 못한다면 시스템 성능은 저하될 수밖에 없다.
메모리와 CPU 간 속도 차이로 작업이 지연된다.
CPU는 초당 수십억 개의 명령어를 처리할 수 있지만, 메인 메모리는 그 속도를 따라오지 못한다. CPU가 데이터를 처리하려면 메모리에서 필요한 데이터를 읽어오거나 쓰는 과정이 필요한데, 메모리 속도가 느리면 CPU는 데이터가 도착할 때까지 대기해야 한다.
CPU가 메모리보다 훨씬 빠르기 때문에 메모리에서 데이터를 불러오는 과정이 전체 시스템의 병목 구간이 된다.
대기 시간 동안 CPU는 아무 작업도 하지 못한다.
CPU는 메모리로부터 필요한 데이터를 기다리는 동안 아무 일을 할 수 없고, 이로 인해 CPU의 처리 능력을 제대로 활용하지 못하게 된다. 결국 아무리 CPU 속도가 빨라져도 메모리에서 데이터를 제때 공급받지 못하면 CPU의 빠른 연산 자체가 의미 없어지고, 전체 시스템의 성능은 그만큼 떨어진다.
3. 캐시(Cache)란?
캐시는 CPU 내부에 내장된 작고 빠른 고속 메모리로, CPU가 자주 사용하는 데이터를 임시로 저장하는 역할을 한다. CPU가 매번 메인 메모리에 접근하면 시간이 많이 걸리기 때문에, 자주 사용하는 데이터를 캐시에 저장해 두고, 필요할 때 캐시에서 데이터를 빠르게 가져와 처리 속도를 높인다. 이를 통해 CPU와 메모리 간의 속도 차이로 인한 지연을 줄이고 시스템의 성능을 향상시킬 수 있다.
4. 지역성(Locality)
CPU가 자주 접근하는 데이터는 캐시에 담기게 되는데, 자주 접근하는 데이터를 결정하는 것은 지역성의 원리에 따라 결정된다. 지역성은 시간 지역성과 공간 지역성으로 구분된다.
시간 지역성(Temporal Locality)
최근에 접근한 데이터에 다시 접근하는 경향을 의미한다. 예를 들어, 반복문 내에서 배열의 인덱스를 반복적으로 사용하는 상황이다.
아래 코드는 같은 배열 인덱스에 여러 번 접근하여 시간 지역성을 보여주는 예제 코드이다.
public class Main {
public static void main(String[] args) {
int[] arr = new int[100];
// 배열의 같은 인덱스를 여러 번 접근하는 예 (시간 지역성)
for (int i = 0; i < 100; i++) {
arr[50] = arr[50] + 1; // 같은 인덱스 50에 계속 접근
}
}
}
공간 지역성(Spatial Locality)
최근에 접근한 데이터의 주변 공간에 다시 접근하는 경향을 의미한다. 즉, 배열과 같은 연속적인 데이터 구조에서는 근처의 데이터에 자주 접근하는 경향이 있다.
아래 코드는 연속적인 메모리 공간을 갖는 배열에서, 배열의 요소를 순차적으로 접근하여 공간 지역성을 보여주는 예제이다.
public class Main {
public static void main(String[] args) {
int[] arr = new int[100];
// 배열의 모든 인덱스를 순차적으로 접근하는 예 (공간 지역성)
for (int i = 0; i < 100; i++) {
arr[i] = i; // 배열의 인덱스를 순서대로 접근
}
}
}
5. 캐시 히트와 미스
- 캐시 히트(Cache Hit) : CPU가 연산을 수행할 때 필요한 값이 캐시에 존재하여, 캐시에서 해당 값을 바로 가져와 사용한다.
- 캐시 미스(Cacahe Miss) : CPU가 연산을 수행할 때 필요한 값이 캐시에 존재하지 않아, 메모리에서 값을 읽어와야 한다.
6. CPU 캐시가 잘 사용되고 있는지 판단 근거
CPU 캐시의 성능은 캐시 히트와 캐시 미스의 비율을 통해 확인할 수 있다. 이를 캐시 적중률(Cache Hit Rate)라고 한다.
- 캐시 적중률 : (캐시 히트 횟수) / (캐시 히트 횟수 + 캐시 미스 횟수)
캐시 적중률이 80% 이상이면 효율적인 연산 속도를 보여주고 있다고 할 수 있다.