[테마특강] 캐시메모리 기술동향

奇安度

86년 한양대 전자공학과 학사

88년 KAIST 전자 및 전자공학과 석사

97년 영국 맨체스터대학 컴퓨터사이언스 박사

88년∼현재 한국전자통신연구원 프로세서연구실 선임연구원

반도체 기술의 급속한 발전에 힘입어 단위 면적당 보다 많은 회로를 집적할 수 있게 됐다. 반도체 칩의 크기 또한 커지고 있다. 프로세서 개별 소자의 트랜지스터 집적도가 1970년대 초 수천 개에서 현재는 수백만 개로 향상되었다. 이러한 집적도 향상은 파이프라인(Pipeline)과 같은 기술을 프로세서에 보다 용이하게 구현할 수 있게 했다.

파이프라인은 명령어 수행에 필요한 제반 동작을 여러 단계로 분리하여 이들 각 단계가 동시에 동작하도록 하는 것으로 결국 단위 시간에 보다 많은 명령어가 실행되도록 하는 기술이다. 요즘은 단일 파이프라인이 아니라 여러 파이프라인을 동시에 지원하거나(Superscala Pipeline) 또는 파이프라인을 세분화하여 더욱 빠르게 동작 하도록 하는 기술(Superpipeline)이 여러 상용 마이크로 프로세서에 사용되고 있다.

이같은 상용 마이크로 프로세서 기술의 발전은 실로 경이적이다. 70년대 인텔이 1백8KHz(약 10만분의 1초)에 동작하는 4비트 마이크로 프로세서 4004를 개발한 이후 현재는 수백MHz(약 1억분의 1초)에 동작하는 64비트 마이크로프로세서가 상용화됐고, 1GHz(약 10억분의 1초)에 동작하는 프로세서도 발표되고 있다. 대표적인 예로 인텔의 펜티엄II 마이크로 프로세서와 DEC의 알파(Alpha)마이크로프로세서다.

프로세서와 함께 컴퓨터 하드웨어의 양대 기본 소자인 메모리 또한 엄청난 발전을 거듭했다. D램(Dynamic Random Access Memory)은 70년대 초 소개되기 시작해 80년대 중반 1MD램, 현재는 기가(Giga)급 D램이 상용화를 목전에 두고 있어 용량면에서 그 기술 발전이 프로세서 동작속도 발전에 비견된다 하겠다.

하지만 메모리 기술의 발전이 주로 저장능력 향상에 집중된 이유는 응답속도 면에서 고속 마이크로 프로세서의 데이터 요구를 충분히 뒷받침하지 못한다는 문제를 안고 있다. 물론 EDO(Extended Data Output), S(Synchronous), C(Cache), E(Enhanced)D램 등과 같이 메모리 기술 중 용량 이외의 기능을 향상한 것도 많이 있다.

하지만 고성능 프로세서는 그 성능에 걸맞게 대량의 데이터 용량을 필요로 하므로 결국 용량이 큰 D램을 메인 메모리로 사용하게 되어 여전히 프로세서와의 속도 차이는 문제가 된다. 예컨대 2백MHz로 동작하는 마이크로 프로세서와 응답지연이 50nsec인 보통의 D램을 사용한 메인 메모리로 구성된 간단한 컴퓨터에서 프로세서가 매 클럭마다 한 개 명령어를 수행하고 평균적으로 10개 명령어 중 한 개가 메모리를 참조한다고 가정해 보자. 이러한 컴퓨터에서 어떤 프로그램이 실행되어 1시간 만에 끝났다면 이중 39분을 프로세서는 단순히 메모리에서 데이터가 오길 기다리는데 사용한 꼴이 된다. 즉 반 이상을 빈둥거리고 논 것이나 마찬가지란 뜻이다. 보통의 동작환경에서 고성능 마이크로프로세서는 매 클럭마다 한 개 이상의 명령어를 수행하고 이 명령어 가운데 10% 이상이 메모리를 참조하므로 어떻게 보면 프로그램 수행의 대부분을 그냥 기다리는데 사용하게 될 수도 있다는 것이다.

이러한 문제를 풀기 위해 가장 광범위하게 사용되고 있는 것으로 캐쉬(Cache)가 있다. 이는 프로세서 속도에 준하는 응답속도로 동작하고, 프로세서와 메인메모리 사이에 위치하는 고성능 메모리다. 캐쉬는 고속 응답속도를 유지해야 되고 고가이기 때문에 그 용량을 제한 받는다. 최근 컴퓨터들은 수 메가 바이트 크기까지 사용하기도 한다. 자주 사용하는 데이터를 캐쉬에 가져 다 놓고 프로세서가 메인메모리를 참조하는 빈도 수를 줄임으로써 프로세서가 데이터를 기다리는 시간을 줄인다는 것이 그 동작원리다. 우리 일상생활에서 비슷한 예를 찾을 수 있다. 도서관에서 신간 잡지와 자주 찾는 책을 이용자가 쉽게 빨리 찾을 수 있도록 개가식 열람실에 비치하고 그렇지 않은 것들은 지하 창고에 보관하여 찾는 사람이 있으면 가져와서 대출하는 방식으로 운영하는 것이 한 예가 될 수 있을 것이다. 이때 개가식 열람실은 캐쉬에, 지하창고는 메인메모리에 해당한다 하겠다.

이러한 캐쉬메모리가 제 몫을 할 수 있는 것은 프로그램의 특정부분이 수행되는 동안 프로그램은 데이터 전체를 참조하기 보다는 이보다 훨씬 작은 부분을 참조하는 경향이 있기 때문이며 이러한 성질은 두 가지로 분류된다. 하나는 지역적 집약성(spatial locality)으로 프로그램이 수행 중 어떤 데이터를 참조한 후 이것과 인접한 데이터를 참조하는 경향이 있다. 또 하나는 시간적 집약성(temporal locality)으로 프로그램이 수행 중 어떤 데이터를 참조한 후 가까운 장래에 같은 데이터를 또 참조하는 경향이 있는 것을 말한다.

따라서 프로그램이 참조하는 부분을 고속 캐쉬메모리에 유지시킨다면 프로그램이 보기에 마치 전체 데이터 영역이 고속으로 참조되는 것과 같아진다. 즉 프로세서가 어떤 데이터를 참조할 때 해당 데이터 뿐 아니라 그 근처의 데이터도 같이 캐쉬메모리에 가져 다 놓음으로써 한번의 메모리 참조로 프로세서가 요청하는 여러 번의 참조를 만족시키고 아울러 캐쉬메모리에 가져 다 놓은 데이터를 가능한 오래 유지함으로써 같은 데이터를 또 참조할 때 메인메모리 참조없이 프로세서에게 공급할 수 있게 한다.

많은 연구결과와 실측 자료에 의하면 적당한 크기의 캐쉬메모리는 프로세서가 요청하는 메모리 참조 중 90~95% 이상을 만족시키는 것으로 보고되고 있다. 앞서 설명한 가상 컴퓨터에 캐쉬메모리를 사용하고 이 캐쉬가 메모리 요청 중 90%를 만족시킨다면 1시간 걸리던 프로그램이 32분 정도 걸리게 된다. 또 이 가운데 약 10% 정도만 메모리 응답을 기다리는데 사용된다. 즉 프로그램 실행 속도가 두 배 정도 빨라진 것과 같아지고 프로세서를 사용한 효율도 높아지게 된다.

프로세서가 메인메모리를 참조하는 경우는 읽기와 쓰기밖에 없고 캐쉬가 쓰기를 어떻게 처리하느냐에 따라 크게 두 가지로 구분한다. 첫째, 항상 쓰기(write-through) 방식은 캐쉬에 해당 데이터가 있든 없든 항상 메인메모리에 쓰기를 하는 방식이다. 둘째, 나중 쓰기(write-back) 방식은 메인메모리에 쓰기를 하는 대신 캐쉬에만 쓰기를 하고 나중에 꼭 필요한 경우에 한해 메인메모리에 쓰기 결과를 반영하는 방식이다. 후자가 전자에 비해 좋은 성능을 가능하게 하는데 이는 동일 주소에 대한 여러 번의 쓰기가 메모리 참조없이 캐쉬에서 만족될 수 있고 덤으로 그 주소에 대한 읽기 또한 만족시킬 수 있기 때문이다.

캐쉬메모리의 가장 큰 장점은 하드웨어적인 구성만으로 프로그램이 실행되는 환경을 캐쉬 유무와 전혀 무관하게 보장하며, 캐쉬가 있으므로 해서 전체 프로그램 수행 환경이 마치 아주 빠른 것처럼 보여준다는 것이다. 따라서 일반 사용자는 캐쉬가 있으나 없으나 사용환경은 동일하게 된다.

캐쉬메모리의 크기는 항상 메인메모리보다 작으므로 어떤 데이터가 캐쉬메모리에 저장되려면 우선 빈 방을 만들어야 된다. 빈 방을 만드는 방법에 따라 캐쉬를 구분할 수 있다. 주소에 의해 특정 한개 방이 고정적으로 지정되는 방법(direct map)과 주소에 의해 두개이상 방중 선택할 수 있는 방법(set associative), 그리고 캐쉬메모리 내 모든 방중 아무 방이나 선택하는 방법(full associative)이 있다. 당연히 후자로 갈수록 성능향상에 도움이 되지만 구현상 어려움이 따른다.

고속 프로세서의 동작속도에 부응하도록 충분히 빠른 캐쉬메모리를 구성하는 것이 불가능하진 않지만 용량과 속도를 모두 만족시키는 데는 어려움이 있어 캐쉬메모리를 다단으로 구성하는 것이 일반적이다. 즉 프로세서와 동일한 속도로 동작하는 비교적 용량이 작은 일차 캐쉬와 속도면에서는 조금 느리지만 용량이 큰 이차 캐쉬로 구성하는 것이다. 우리 주위에서 흔히 볼 수 있는 개인용 컴퓨터에 내장되어 있는 펜티엄 계열 마이크로프로세서의 경우 일차 캐쉬는 약 16K바이트, 그리고 이차 캐쉬는 1백28K~1M바이트 정도 된다. 과거 초창기 개인용 컴퓨터가 사용한 메인메모리가 수K바이트였던 것을 감안한다면 요즈음의 개인용 컴퓨터가 사용하는 캐쉬메모리는 대단히 큰 용량이라 하겠다.

캐쉬메모리의 효용은 단일 프로세서 컴퓨터에서보다 다중프로세서 컴퓨터에서 더욱 크다. 다중프로세서 컴퓨터에서 캐쉬메모리는 메모리 참조 시간을 효과적으로 줄이면서 동시에 메모리를 참조하는 횟수를 줄여 네트워크 부하를 감소시키는데도 기여하기 때문이다. 하지만 다중프로세서에서 사용되는 캐쉬는 단일프로세서 캐쉬에서는 없었던 캐쉬 데이터 동일성 유지 문제를 해결해야 되는 부담이 있다. 이것은 동일한 데이터가 한 개 이상 서로다는 프로세서 캐쉬에 존재가능 하므로 한쪽 복사본이 변할 때 다른 쪽에도 동시에 반영하여 모든 복사본이 항상 최근 데이터로 유지될 수 있도록 해야 하기 때문이다. 같은 데이터(같은 주소에 할당된 정보)에 대해 여러 복사본이 여러 캐쉬에 존재할 수 있게 되므로 만약 각 프로세서들이 자신의 전용 캐쉬에 있는 복사본에 대해 자유롭게 변경(쓰기)을 시도하게 되면 동일 메모리 주소에 대한 동일하지 못한 상태를 야기하게 되어 결국 프로그램 수행의 결과가 오류를 범하게 된다.

캐쉬의 일관성을 깨뜨릴 수 있는 요인에는 쓸 수 있는 데이터의 공유(sharing writeable data), 프로세스 이주(process migration), 그리고 입출력 동작(input output activity) 등이 있다.

일반적으로 프로세서의 임의의 주소에 대한 읽기의 복귀 값(return value)이 같은 주소에 대한 가장 최근의 쓰기 값과 같음을 보장 할 때 캐쉬가 일관성을 유지한다고 정의한다. 이를 위해서는 캐쉬 일관성/동일성 유지 프로토콜(cache coherency protocol)이 필요한데 이 프로토콜이 메모리에 대한 일관된 상태를 보장하여 프로그램이 잘 수행됨을 보장하게 된다. 캐쉬 동일성을 유지하기 위해서는 읽고 쓰는 명령 외에 캐쉬간의 동일성 유지 명령(consistency command)을 필요로 한다. 예를들면 한 프로세서의 캐쉬에 있는 데이터를 다른 캐쉬에서 요구할 경우 이것이 공유되고 있음을 알리는 명령이 필요하다. 또 다른 예로는 특정 프로세서가 여러 캐쉬에서 공유되고 있는 데이터에 대해 배타적인 참조를 필요로 할 때 다른 캐쉬에 있는 복사본을 무효화시켜야 하므로 무효화 명령이 필요하다. 캐쉬 동일성 유지 명령들은 동시에 여러 캐쉬에 영향을 주어야 하는 만큼 프로세서들 사이의 상호연결망에 상당한 통신부담을 야기하게 된다.

상호연결망이 단순한 형태인 버스(bus)인 경우, 또는 프로세서의 수가 적은 경우 이러한 동일성 유지에 필요한 통신부담은 어느 정도 감수할 수 있으나 프로세서 수가 상당히 많아지는 경우 단순한 상호연결망으로는 전체적인 통신을 감당할 수 없게 된다. 더구나 복잡한 상호 연결망에서는 동시에 여러 캐쉬에 영향을 주기란 어려운 일이다. 때문에 대규모 다중프로세서에서는 캐쉬에 저장되는 데이터 별로 일정한 정보를 유지함으로써 선택적으로 캐쉬 동일성 유지 동작을 가능하게 하는 디렉토리 방법(directory method)이 사용되고 있다. 버스에 기반한 다중 캐쉬 시스템에는 엔코어 멀티맥스(Multimax), 시퀀트 시메트리(Symmetry), 피라미드 MI서버, 국산 주전산기 타이콤II와 III, SGI 챌린지, 선 엔터프라이즈 등이 있다. 디렉토리 방법은 2~4 개 프로세서로 구성되는 작은 규모의 버스 기반 시스템을 상호 연결망으로 묶는 시스템에서 일반적으로 많이 사용되고 있다. 그 대표적인 예가 CC-NUMA(Cache Coherent Non-Uniform Memory Access) 컴퓨터로 SGI Origin 2000, 시퀀트 NUMAQ, DG 아비뇽20000, HAL S1 등이 있다.


브랜드 뉴스룸