캐시(Cache)
캐시는 속도가 빠른 장치(CPU)와 느린 장치(메인 메모리) 사이에서 속도 차이에 따른 병목 현상을 줄이기 위한 범용 메모리를 뜻합니다.
즉, 어떤 시스템 내에서 데이터의 집중적인 사용으로 인해 전체 시스템에 절대적인 영향을 미치는 부분의 사용 빈도가 늘어나 그 부분의 성능이 저하되어 전체 시스템이 마비되는 현상을 줄이기 위한 것압니다.
캐시는 자주 사용하는 데이터나 값을 복사해 놓는 임시 저장소라고 생각할 수 있습니다.
캐시의 접근 시간에 비해 원래 데이터를 접근하는 시간이 더 오래 걸리는 경우
또는 값을 다시 계산하는 시간을 절약하고 싶은 경우에 사용합니다.
캐시는 저장 공간이 작고 비용이 비싸지만, 빠른 성능을 제공합니다.
보통 L1, L2, L3 캐시로 나뉘어지는데, CPU에 가까운 캐시일수록 작고 비싸고 빠릅니다.
또한, 캐시는 프로그램에서 직접적으로 읽거나 쓸 수 없고 하드웨어의 메모리 관리 시스템(MMU)이 내부적으로 제어합니다.
캐시는 메모리에 있는 데이터를 임시로 가져온 것이기 때문에 캐시에 있는 데이터가 변경되면, 메모리에 있는 데이터도 변경해야 합니다.
변경하기 위한 방법이 2가지가 있습니다.
- 즉시 쓰기(write through)
- 캐시에 있는 데이터가 변경되면 이를 즉시 메모리에 반영하는 방식
- 메모리와의 빈번한 데이터 전송으로 인해 성능이 느려진다는 단점이 있지만, 메모리의 최신 값이 항상 유지된다는 장점도 있습니다.
- 지연 쓰기(copy back OR write back)
- 변경된 내용이 즉시 반영되는 '즉시 쓰기'와 달리, 변경된 내용을 모아서 주기적으로 반영하는 방식
- 메모리와의 데이터 전송 횟수가 줄어들어 시스템의 성능을 향상시킬 수 있으나, 메모리와 캐시된 데이터 사이의 불일치가 발생할 수 도 있다는 단점이 있습니다.
캐시 관련 용어
- Cache Hit : 필요한 데이터가 캐시 영역에 존재하는 경우
- Cache Miss : 필요한 데이터가 캐시 영역에 존재하지 않는 경우
- Cache Hit Ratio : 캐시 히트가 되는 비율을 말합니다. 일반적으로 90%가 이상적인데, 캐시의 크기를 늘리는 것이 적중률을 높이는 방법 중 하나지만, 가격이 비싸질 것입니다.
데이터 지역성이란?
세 가지로 데이터 지역성을 나뉠 수 있습니다.
- 공간적 지역성 : CPU가 요청한 주소 지점에 인접한 데이터들이 앞으로 참조될 가능성이 높은 현상
- 시간적 지역성 : 최근 사용된 데이터, 변수가 재사용될 가능성이 높은 현상
- 순차적 지역성 : 데이터가 기억 장치에 저장된 순서대로 인출되고, 실행될 가능성이 높은 현상
Long Tail 법칙
자주 요구하는 데이터 중 20% 정도 요구한 것이 시스템 리소스의 대부분을 사용한다는 법칙입니다.
자주 사용되는 20%의 기능에 캐시를 이용하면, 리소스 사용량을 대폭 줄일 수 있어, 시스템의 성능을 대폭 향상 시킬 수 있습니다.
버퍼(Buffer)
버퍼는 임시 저장 공간을 의미합니다.
일정량의 데이터를 모아 한 번에 옮겨, 두 장치(디스크, CPU) 간의 속도 차이를 완화시킵니다.
빠른 쪽에서 데이터가 느린쪽으로 보내질 때, 데이터의 손실을 막기 위해 쓰입니다.
프로그래밍이나 운영체제에서 사용하는 버퍼는 대부분 CPU와 보조기억장치 사이에서 사용되는 임시 저장 공간을 의미합니다.
CPU는 기술이 계속 발전을 거듭하여, 굉장히 빠른 속도로 데이터를 처리할 수 있습니다. (1초에 수십억 bit 이상..)
그러나,
보조기억 장치의 경우. 데이터를 주고 받는데에 많은 시간이 필요합니다
물리적의 경우 데이터를 전송할 수 있는 속도가 빨라도 초당 100mb ~ 300mb입니다.
이 때, 버퍼를 사용하게 됩니다.
버퍼는 CPU 내부에 있는 캐시 메모리 보다는 느리지만, 보조 기억장치보다 훨씬 빠른 주기억 장치(RAM)을 이용합니다.
보조 기억장치는 주 기억장치의 버퍼로 마련해둔 공간에 데이터를 열심히 보내 쌓아둡니다.
CPU는 처리가 빠르므로 밀려있는 다른일을 처리한 후, 시간이 남을 때 가끔 버퍼를 확인하여 데이터가 모두 쌓였는 지 확인하고 모두 쌓였다면, 가져다 한 번에 처리합니다.
이렇게 버퍼라는 것은 속도 차가 큰 두 대상이 입출력을 수행할 때 효율성을 위해 사용하는 임시 저장공간이라고 할 수 있겠습니다.