★KEYWORD★
캐시메모리 / 속도 차에 따른 병목 현상을 줄이기 위한 범용 메모리
캐시 메모리(Cache Memory) 란?
캐시 메모리(cache memory)는 속도가 빠른 장치와 느린 장치 사이에서 속도 차에 따른 병목 현상을 줄이기 위한 범용 메모리이다. 대표적으로, 속도가 빠른 CPU 코어와 속도가 느린 메모리 사이에서 속도 차에 따른 병목 현상을 완화하는 역할을 한다. CPU는 메모리에 저장된 데이터를 읽어오는데, 자주 사용하는 데이터를 캐시 메모리에 저장하면 그 데이터를 다시 사용할 때는 메모리가 아닌 캐시 메모리에서 데이터를 읽어올 수 있다.
캐시(cache)란 무엇일까?
캐시(cache, 문화어: 캐쉬, 고속완충기, 고속완충기억기)는 컴퓨터 과학에서 데이터나 값을 미리 복사해 놓는 임시 장소를 가리킨다. 캐시는 캐시의 접근 시간에 비해 원래 데이터를 접근하는 시간이 오래 걸리는 경우나 값을 다시 계산하는 시간을 절약하고 싶은 경우에 사용한다. 캐시에 데이터를 미리 복사해 놓으면 계산이나 접근 시간없이 더 빠른 속도로 데이터에 접근할 수 있다.
적중과 실패
캐시메모리가 있는 컴퓨터 시스템은 CPU가 메모리에 접근하기 전 먼저 캐시 메모리에서 원하는 데이터의 존재 여부를 확인한다. 이때 필요한 데이터가 있는 경우를 적중(hit), 없는 경우를 실패(miss)라고 한다.
이 때 요청한 데이터를 캐시메모리에서 찾을 확률을 적중률(hit ratio)이라고 한다. 캐시 메모리의 성능은 적중률에 의해 결정된다.
실패율은 반대로 캐시 메모리의 실패 횟수를 전체 메모리 참조 횟수로 나눈 값이며, (1 - 적중률)로 구할 수 있다.
보통 CPU는 데이터를 가져오기 위해 캐시 메모리 > 메모리 > 보조기억장치 순으로 접근한다.
- 캐시 적중일 때 : 캐시 메모리의 데이터를 CPU 레지스터에 복사한다.
- 캐시실패/메모리 적중일 때 : 메모리의 데이터를 캐시 메모리에 복사하고, 캐시 메모리의 복제된 내용을 CPU 레지스터에 복사한다.
- 캐시, 메모리 실패일 때 : 보조 기억장치에서 필요한 데이터를 메모리에 복사한다. 메모리에 복제된 내용을 캐시 메모리에 복제한다. 캐시 메모리의 복제된 데이터를 CPU 레지스터에 복제한다.
캐시메모리에 최대한 많은 데이터를 넣는다면 CPU에 필요한 대부분의 데이터를 빠르게 얻어올 수 있겠지만, 위에서 언급했듯 캐시메모리는 용량이 적기 때문에 작업 집합의 일부만을 적재할 수 있다.
마트에서 사용할 물류 창고를 만든다고 가정해보자. 물류 창고에 마트에서 팔 수 있는 모든 종류의 물건을 최대한 많이 갖다둔다면 손님이 원하는 물건이 품절돼서 사지 못하는 일이 드물 것이다. 하지만 현실적으로 공간의 크기와 건설 비용의 제약이 있으므로 물류 창고에는 잘팔리는 물건 위주로 보관하는 것이 유리할 것이다.
캐시 메모리의 성공 여부는 참조의 지역성(Locality of reference) 원리에 달려있다. 지역성은 짧은 시간 동안 제한된 주소 공간의 일부만 참조되는 경향을 말한다.
지역성의 종류
- 시간적 지역성(temporal locality) : CPU가 한 번 참조한 데이터는 다시 참조할 가능성이 높다.
- 공간적 지역성(spatial locality) : CPU가 참조한 데이터와 인접한 데이터 역시 참조될 가능성이 높다.
- 순차적 지역성(sequential locality) : 분기가 발생하지 않는 한 명령어는 메모리에 저장된 순서대로 인출/실행된다.
지역성은 어디까지나 경향에 대한 것이므로 항상 캐시의 높은 적중률을 보장해주지는 않는다.
캐시 메모리의 기본 구성과 동작
CPU는 데이터를 요청할 때마다 캐시 메모리에서 해당 데이터의 존재 여부를 확인한다. 따라서 캐시 메모리는 요청받은 데이터를 탐색하는 기능이 필요하다. 캐시 메모리는 데이터를 관리하기 위해 데이터 메모리와 태그 메모리를 사용한다.
- 블록 : 데이터의 기본 단위인 워드의 집합
- 데이터 메모리 : 메모리의 데이터들이 저장된 블록으로 구성되어 있다.
- 태그 메모리 : 데이터 메모리의 블록을 탐색할 정보를 포함한다. 태그 메모리의 엔트리는 데이터 메모리 블록과 쌍을 이루면서 태그, 유효 비트, 갱신 비트를 포함한다. 또한 CPU 주소와 태그를 비교하는 비교기를 가지고 있다.
- 태그(tag) : CPU가 요청한 데이터를 탐색하는데 사용할 주소의 일부. 캐시 블록 주소에서 인덱스로 사용되지 않는 부분이다.
- 유효 비트(valid bit) : 캐시 블록이 유효한 데이터인지 나타낸다.
- 갱신 비트(dirty bit) : 캐시로 블록을 가져온 후 CPU가 블록을 수정했는지 나타낸다.
기본적인 동작의 흐름
- CPU가 캐시에 주소 전송 > 태그 메모리 탐색 > 일치하는 태그 발견 (hit) > 블록 상태 갱신(필요할 경우) >데이터 메모리에서 블록 추출 > 요청받은 데이터 선택 > 캐시가 CPU에 데이터 전송
- CPU가 캐시에 주소 전송 > 태그 메모리 탐색 > 일치하는 태그 없음(miss) > 주소를 메모리로 전송해 대응하는 블록을 캐시에 저장 > 요청받은 데이터 선택 > 캐시가 CPU에 데이터 전송
출처: 위키백과, 나무위키, https://zion830.tistory.com/46
HyunZzang의 프로그래밍 공간 / 함께 공부해요!!
도움이 되셨다면 "좋아요❤️" 또는 "구독👍🏻" 부탁드립니다 :)