캐시와 버퍼, 그리고 레지스터는 데이터를 임시적으로 저장한다는 공통점이 있습니다.
그렇다면 어떤 경우에 어떤 것을 사용하게 될까요? 그리고 각자 어떤 특징이 있을까요??
캐시(Cache)
먼저 캐시는 속도가 빠른 장치(CPU)와 느린 장치(메인 메모리) 사이에서 속도 차이에 따른 병목현상을 줄이기 위한 범용 메모리를 뜻합니다. 즉, 어떤 시스템 내에서 데이터의 집중적인 사용으로 인해 전체 시스템에 절대적인 영향을 미치는 부분의 사용 빈도가 늘어나 그 부분의 성능이 저하되어 전체 시스템이 마비되는 현상을 줄이기 위한 것입니다.
캐시는 자주 사용하는 데이터나 값을 복사해 놓는 임시 저장소라고 생각할 수 있는데, 이때 캐시의 접근 시간에 비해 원래 데이터(서버의 균일한 api 데이터 등)를 접근하는 시간이 오래 걸리는 경우나 값을 다시 계산하는 시간을 절약하고 싶은 경우(반복적으로 동일한 결과를 돌려주는 경우 -> 이미지, 썸네일 등)에 사용합니다.
그리고 캐시는 저장공간이 작고 비용이 비싸지만 빠른 성능을 제공합니다. 보통 L1, L2, L3 캐시로 나뉘어지는데, CPU에 가까운 캐시일수록 작고 비싸고 빠릅니다. 또한, 캐시는 프로그램에서 직접적으로 읽거나 쓸 수 없고 하드웨어의 메모리 관리 시스템(MMU)이 내부적으로 제어합니다.
앞서 말했듯이 캐시는 병목현상을 줄인다고 해요. 대부분의 프로그램은 한 번 사용한 데이터를 다시 사용할 가능성이 높고, 그 주변의 데이터도 곧 사용될 가능성이 높은 데이터 지역성을 가집니다.
잠깐 잠깐! 근데 데이터 지역성이 뭘까요???
(1) 공간적 지역성 : CPU가 요청한 주소 지점에 인접한 데이터들이 앞으로 참조될 가능성이 높은 현상
(2) 시간적 지역성 : 최근 사용된 데이터, 변수가 재사용될 가능성이 높은 현상
(3) 순차적 지역성 : 데이터가 기억장치에 저장된 순서대로 인출되고 실행될 가능성이 높은 현상
-> 여기서 보통 명령어(instruction)는 공간적 지역성이 높고, 데이터는 시간적 지역성이 높아요.
여기서 또 알아야할 캐시의 '적중률(Hit Ratio)'!!
적중률이란? 얼마나 캐시를 통해서 데이터를 잘 찾았는지의 정도를 말합니다.
- Compulsory miss : 해당 메모리 주소를 처음 부르는 경우
- Conflict miss : 서로 다른 데이터가 같은 캐시 메모리 주소에 할당되는 경우
- Capacity miss : 캐시 메모리에 공간이 부족해서 나는 경우
캐시는 메모리에 있는 데이터를 임시로 가져온 것이기 때문에
캐시에 있는 데이터가 변경되면 메모리에 있는 데이터를 변경해야 하는데요, 여기에는 두 가지 방식이 있습니다.
1. 즉시 쓰기 (write through)
- 캐시에 있는 데이터가 변경되면 이를 즉시 메모리에 반영하는 방식
- 메모리와의 빈번한 데이터 전송으로 인해 성능이 느려진다는 단점이 있지만, 메모리의 최신값이 항상 유지된다는 장점이 있습니다.
2. 지연 쓰기 (copy back 또는 write back)
- 변경된 내용이 즉시 반영되는 '즉시 쓰기'와 달리, 변경된 내용을 모아서 주기적으로 반영하는 방식
- 메모리와의 데이터 전송 횟수가 줄어들어 시스템의 성능을 향상시킬 수 있으나 메모리와 캐시된 데이터 사이의 불일치가 발생할 수도 있다는 것이 단점입니다.
그렇다면 캐시는 단순히 자주 사용되는 데이터를 저장하고 있는 걸까요? 그냥 단.순.히?
당연히 아니죠❗️ 캐시와 관련해서 언급할 법칙이 하나 있습니다. 바로 Long Tail 법칙!!
Long Tail 법칙이란, 자주 요구하는 데이터 중 20% 정도 요구한 것이 시스템 리소스의 대부분을 사용한다는 법칙입니다.
무슨 말이냐면, 100번 요구한 데이터가 차지하는 리소스 크기보다 20번 요구한 데이터가 차지하는 리소스 크기가 더 크더라는 말입니다. 위 그래프를 보면 이해가 가시나요? 따라서 20%의 기능에 캐시를 이용함으로써 리소스 사용량을 대폭 줄이고, 성능은 대폭 향상시킬 수 있는 거죠!
버퍼(Buffer)
그렇다면 캐시와 함께 자주 언급되는 버퍼는 캐시와 어떤 차이가 있을까요?
캐시가 자주 사용하는 데이터나 값을 복사해 놓는 임시 저장소라면, 버퍼는 데이터를 한 곳에서 다른 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리 영역을 말합니다. 일시적으로 데이터를 보관하기 때문에 버퍼는 사용 후에 데이터를 폐기합니다. 버퍼는 캐시에 비해서 처리하는 데 필요한 리소스 크기가 큰 편이기 때문에 모든 데이터를 저장할 수 없습니다. 따라서 더블 버퍼링이나 입출력에 사용될 때의 버퍼 등의 모든 버퍼는 특정한 데이터를 담았다가 처리가 끝나면 그 데이터를 모두 폐기합니다. 이와 반면에 캐시는 한 번 저장한 것은 계속해서 가지고 있으면서 접근 요청이 발생할 때마다 그 기억 매체를 불러온 쪽에 반환할 수 있습니다.
버퍼는 캐시와 마찬가지로 속도에 차이가 있는 두 장치 사이에서 그 차이를 완화하는 역할을 합니다.
캐시는 처리속도를 최대한 올리기 위한 기술로 주로 빠른 속도의 장치를 보조한다면, 버퍼는 처리속도가 떨어지는 걸 방지하는 기술로 주로 느린속도의 장치를 보호한다고 할 수 있죠. 그래서 캐시와 버퍼는 주로 읽기/쓰기 부분에 사용됩니다.
버퍼링 : 버퍼를 활용하는 방식 또는 버퍼를 채우는 동작
즉, 캐시와 버퍼는 역할은 비슷하지만 캐시는 더 빠르게, 버퍼는 더 느리지 않게 하는 상호보완의 관계라고 할 수 있습니다 :)
레지스터(Register)
자주 사용하는 데이터를 복사해 놓는 임시 저장소를 캐시, 속도가 다른 두 장치 사이에서 데이터가 전송되는 동안 일시적으로 보관하는 임시 저장소를 버퍼라고 한다면 과연 레지스터는 무엇일까요?
레지스터는 CPU가 요청을 처리하는 데이터의 임시저장 공간입니다. 공간은 작고 가격은 비싸지만 CPU에 직접 연결되어 있어 연산속도가 매우 빠릅니다.
CPU는 자체적으로 데이터를 저장할 수 없기 때문에 레지스터를 이용해서 연산처리 및 데이터 주소 지정을 도와주게 되는데요, 수행하는 역할마다 레지스터의 종류는 다양합니다. 대표적으로는 PC, AC, IR, MAR, MBR을 예로 들 수 있습니다.
- PC (Program Counter) : 다음 인출(Fetch) 될 명령어의 주소를 가지고 있는 레지스터
- AC (Accumulator) : 연산 결과 데이터를 일시적으로 저장하는 레지스터
- IR (Instruction Register) : 가장 최근에 인출된 명령어(현재 실행 중인 명령어)가 저장되어 있는 레지스터
- MAR (Memory Address Register) : PC에 저장된 명령어 주소가 사용되기 전에 일시적으로 저장되는 주소 레지스터
- MBR (Memory Buffer Register) : 기억장치에 저장될 데이터 혹은 읽혀진 데이터가 일시적으로 저장되는 버퍼 레지스터
작년에 학교에서 컴퓨터 구조 수업을 들을 때, 레지스터와 관련해서 과제를 푼 적이 있었습니다. 레지스터의 역할을 쉽게 이해하기 위해 그 당시 풀었던 과제를 예시로 그려보았어요! 아래 문제와 풀이과정 그림을 본다면 레지스터의 역할을 좀 더 이해하기 쉬울 듯합니다 :)
문제 : Assume that the next value retrieved from device 5 is 3, and that location 940 contains a value of 2.
풀이 👇
Reference
버퍼(Buffer)란?
캐시(Cache)란?
캐시 메모리
'스터디 > CS & Network' 카테고리의 다른 글
Web의 동작원리 (0) | 2021.01.04 |
---|---|
DeadLock (교착 상태) (0) | 2020.12.21 |
메모리 구조를 알아보자. (0) | 2020.12.10 |
커널 (Kernel) (2) | 2020.09.03 |
HTTP와 HTTPS (4) | 2020.07.27 |
댓글