캐시 메모리 / 메모리 계층구조 / 참조 지역성 원리
CPU가 메모리에 접근하는 시간은 CPU의 연산 속도보다 압도적으로 느리다.
>> 성능적으로 엄청난 손해가 난다.
>> 메모리에 접근하는 시간을 줄일 필요가 있다.
저장 장치 계층 구조 (Memory hierarchy, 메모리 계층 구조)
- 여기서 메모리는 RAM을 의미하는것이 아니다.
- 일반적인 저장장치를 의미한다.
1) CPU와 가까운 저장장치는 빠르고, 멀리있는 저장장치는 느리다.
2) 속도가 빠른 저장장치는 저장 용량이 작고, 가격이 비싸다.
예시: 레지스터 vs RAM vs USB
속도: 레지스터 > RAM > USB
용량: USB > RAM > 레지스터
가격: 레지스터 > RAM > USB
캐시 메모리
- CPU와 메모리 사이에 위치해있다.
- 레지스터보다 용량이 크고 메모리 보다 빠른 SRAM 기반의 저장장치이다.
- CPU의 연산 속도와 메모리 접근 속도의 차이를 조금이나마 줄이기 위해 탄생했다.
("CPU가 매번 메모리에 왔다 갔다하는것은 시간이 오래걸림, 그러니 캐시메모리에 미리 일부 데이터를 갖고와서 쓰자")
- 캐시메모리는 1개가 아니다. CPU 외부에서 있을수도 있고 내부에 있을수도 있다.
(L1 - L2 - L3 // 일반적으로 L1 캐시와 L2 캐시는 코어 내부에, L3 캐시는 코어 외부에 위치해 있다.)
아래 사진은 멀티코어에서의 캐시 메모리
참고내용) 멀티 코어 프로세서의 캐시메모리의 경우 코어마다 L1, L2를 따로 두기 때문에 각각의 코어들이 서로 다른 내용을 저장할 수도 있다. => 즉, 데이터 일관성이 깨질 우려가 있다. 따라서 싱크를 맞춰주는것이 굉장히 중요한 문제가 된다.
저장장치 계층구조를 기억한다면
L1이 가장 빠르고 그다음 L2 L3 순서로 속도가 빠름을 알 수 있다.
더 빠른 캐시메모리를 위해 명령어만을 담고있는 L1캐시 / 데이터 만을 담기위한 L1캐시 등으로 관리하기도 한다. 분리형 캐시 (L1D, L1I)
순서를 나열해 보자면
레지스터 - L1 - L2 - L3 - RAM(주기억장치) - 보조기억장치 - 클라우드 스토리지(네트워크)
그렇다면 캐시메모리에는 어떤 내용이 저장되어야 하는가?
자주 사용되는 RAM의 정보를 캐시메모리에 미리 저장해 두어야 하는데 어떤 기준으로 저장할 것인가?
참조 지역성의 원리 (locality of reference)
- 캐시 메모리는 메모리보다 용량이 작다. 따라서 메모리의 모든 내용을 저장할 수 없다.
- 그렇다면 뭘 저장해야하나
1) CPU가 자주 사용할 법한 내용을 예측
- CPU가 실제로 사용했을 경우 (예측이 맞았을 경우)를 캐시 히트라고 한다. == 성능 향상
- 예측이 틀린것을 캐시 미스 라고 한다 == 성능 하락
- 캐시 적중률 (캐시 히트횟수 / 캐시히트 + 캐시미스) == 당연히 높을수록 성능이 좋다.
- 요즘 CPU의 캐시 적중률은 못해도 80% 이상이다.
- 따라서 CPU가 사용할 법한 데이터를 잘 예측해야 한다.
2) 그 예측하는 법이 참조 지역성의 원리이다. (CPU가 사용할 법한 데이터를 찾는 원리)
- CPU가 메모리에 접근할때의 주된 경향을 활용한다.
- CPU는 최근에 접근했던 메모리 공간에 다시 접근하려는 경향이 있다. (for, while 반복문)
- CPU는 접근한 메모리 공간 근처를 접근하려는 경향이 있다. (배열, List 등)
- 접근한 메모리 공간 근처를 접근하려는 경향이 있다. (공간 지역성 == 관련된 기능들이 모여있다.)