이 포스팅은 운영체제 공룡책 9판을 참고하여 작성되었습니다.
캐시 메모리
캐시 메모리란?
두 구성요소 간 액세스 시간이나 전송 속도의 차이가 큰 경우 성능을 향상하기 위해 사용하는 하드웨어 캐시. 혹은 메모리를 말한다.
Name |
registers |
cache |
main memory |
solid state disk |
magnetic disk |
Typical size |
< 1 KB |
< 16MB |
< 64GB |
< 1 TB |
< 10 TB |
Implementation technology |
custom memory with multiple ports CMOS |
on-chip or off-chip CMOS SRAM |
CMOS SRAM |
flash memory |
magnetic disk |
Access time (ns) |
0.25 - 0.5 |
0.5 - 25 |
80 - 250 |
25,000 - 50,000 |
5,000,000 |
Bandwidth (MB/sec) |
20,000 - 100,000 |
5,000 - 10,000 |
1,000 - 5,000 |
500 |
20 - 150 |
Managed by |
compiler |
hardware |
operating system |
operating system |
operating system |
Backed by |
cache |
main memory |
disk |
disk |
disk or tape |
캐시 메모리는, 메인 메모리와 비교하였을 때
- 크기가 작다.
- 속도가 빠르다.
- 비용이 높다. (비싸다)
이러한 상대적 특징을 갖는 캐시는 주로 CPU 내부에 배치되어 있다.
등장 배경
메인 메모리는 CPU의 성능이 점차 증가함에 따라 CPU와의 속도 격차가 현저히 벌어지게 된다. (CPU가 훨씬 빠름)
즉, 메인 메모리가 CPU가 움직이는, 요구하는만큼 빠르게 데이터를 전달해줄 수 없어서 전체 시스템 성능의 향상은 어려워진다.
이러한 배경에서, 메인 메모리보다 접근 속도가 빠른 저장장치 '캐시'를 CPU <-> 메인 메모리 사이에 두어서
메인 메모리에 직접 접근하는 것이 아니라 캐시에 접근해서 데이터를 가져옴으로써 접근 속도의 향상을 이루고자 등장했다.
캐시의 동작원리 (지역성, Locality)
기본적으로 컴퓨터 시스템 내부의 정보들은 메인 메모리와 같은 저장장치에 저장이 된다.
메인 메모리와 CPU의 속도의 차이 때문에 생기는 문제를 해결하기 위해 캐시를 사용한다고 했다.
그렇다면, 캐시 안에 메인 메모리에 있는 정보들이 들어 있어야 한다.
하지만, 메인 메모리에 비해 캐시는 접근 속도는 높지만 저장용량의 크기는 낮다.
즉, 캐시에 저장할 수 있는 데이터의 양은 한정적이며 효율적인 캐시 활용을 위해서 메인 메모리에서 자주 사용되는 데이터들을 선별할 수 있어야 함을 의미한다.
이러한 상황에서, 데이터의 지역성(Locality)을 이용하게 된다.
데이터의 지역성이란, 프로그램이 참조하는 코드나 데이터에 대해 지역성을 가짐을 의미한다.
즉, 모든 데이터를 균등하게 참조하는 것이 아니라 일부 특정 데이터에 대해서 더 많이 참조하는 경향이 있다는 것이다.
밑의 그림은 메모리 참조 패턴에 대한 Figure으로 Locality의 특성을 확인할 수 있다.
데이터의 지역성은 대표적으로 두 가지로 볼 수 있다.
1. 시간 지역성(Temporal Locality) : 한 번 참조된 데이터는 잠시 후에 또 참조될 가능성이 높음. (ex. 반복문의 조건에 해당하는 변수)
2. 공간 지역성(Spatial Locality) : 참조된 데이터의 근처에 있는 데이터가 참조될 가능성이 높음. (ex. 배열 요소에 대한 연속 접근)
캐시 Hit, 캐시 Miss
CPU에서 요청한 데이터가 캐시 내에 존재한다면 이를 Cache Hit이라고 한다.
캐시 내에 존재하지 않아서 메인 메모리를 통해 가져와야 한다면 이를 Cache Miss라고 한다.
이에 대해 Hit Ratio, Miss Ratio를 정의할 수 있는데,
Hit Ratio = ( Cache Hit 횟수 / 전체 요청 횟수 ) * 100
Miss Ratio = 1 - Hit Ratio
캐시 미스가 발생하게 되면, ( cache access time + main memory access time ) 이 소요되므로, CPU가 요청하는 족족 캐시 미스가 발생하면 안 쓰느니만 못하다.
하지만 Miss Ratio가 대부분의 경우에서 높지 않기 때문에, 캐시를 사용하면 일반적으로 시스템 성능을 크게 향상시킬 수 있다.
캐싱 라인
위에서 언급했듯이, CPU에서 요청한 데이터가 Cache Hit 했다고 해보자.
그런데 어떻게 Cache Hit 했음을 알 수 있을까?
Cache의 모든 데이터를 다 뒤져서 "아! 찾았다!" 했을까?
실제로 이렇게 Brute하게 탐색하면 캐시 탐색 시간이 생각보다 오래 소요될 것이다.
이러한 문제들 때문에 캐싱 라인이라는 캐시 자료구조가 사용된다.
캐싱라인은 '캐시에 저장된 데이터의 메모리 주소'와 같이 접근에 대한 정보를 태그들로 나타낸 자료구조이다.
즉, 캐시에 있는 정보를 요청했을 때 바로 매핑시켜줄 수 있도록 한다는 것이다.
대표적으로 3가지가 존재하는데,
1. Directed Mapped Cache
메인 메모리의 주소:캐시 메모리의 주소=N:1
N:1 관계로 캐시와 메인 메모리가 연결되어있는 방식이다.
구현이 굉장히 간단하고 속도가 빠르나, Cache Miss시 Conflict가 발생할 확률이 높다.
( 같은 캐시 메모리의 주소를 갖는 2개의 데이터가 반복/교차적으로 요청된다면... 무한 캐시 교체가 일어날 수도 있다. )
2. Fully Associative Cache
메인 메모리의 주소가 캐시의 어디든 할당이 가능한 구조이다.
할당하는 것이 매우 간단하고 빠르지만, 탐색할 때는 캐시 전체를 탐색해야 하기 때문에 꽤나 오래 걸린다.
3. k-way Set Associative Cache
Directed Mapped Cache와 Fully Associative Cache의 중간책 느낌으로 등장했다.
특정 데이터가 k-way만큼 할당 가능한 캐시 인덱스를 가지고 있다.
즉 Cache Hit 여부를 판단하려면 k개의 블록을 체크하면 된다.
할당하는 것은 Fully Associative Cache보다는 오래 걸리지만, 탐색이 빠르다.
또한 Directed Mapped Cache 보다 Cache Conflict Problem의 발생 가능성이 낮다.
'단단해지기 > Computer Science' 카테고리의 다른 글
[Network] HTTP와 HTTPS (0) | 2021.04.13 |
---|---|
[Network] TCP와 UDP (2) | 2020.12.28 |
[Algorithm] 깊이우선탐색 DFS 에 대하여 (1) | 2020.09.07 |