[컴퓨터구조] Memory Hierarchy
A Hierarchy of Memories
프로세서의 작동에 필수적인 주기억장치에 대해 간략하게 알아보자.
SRAM (Static RAM)은 트랜지스터에 기반한 기억장치로, DRAM에 비해 작동이 빠르고 비싼 편에 속한다.
DRAM (Dynamic RAM)은 축전기에 기반한 기억장치로, 10-100ms마다 refreshing을 거쳐야 하며, SRAM보다 작동이 느린 대신 값싸다.
DRAM은 clock 신호가 따로 없어 Asynchronous하고, 1-32Gb의 큰 저장 용량을 갖는다. DRAM에서는 데이터에 접근할 때 row address와 column address를 따로 받아 접근하게 된다. 각각 word line과 bit line을 지정하게 되는 것이다.
DRAM 속 데이터들은 정사각형의 배열의 형태로 저장되어 있는데, 주소가 주어지면 그에 해당하는 하나의 bit 'row'에 접근한다. 또한 DRAM은 인접한 word들에 대해서는 짧은 시간 안에 연속으로 접근할 수 있는데, 이러한 접근 방식을 Burst mode라고 한다.
DRAM에서 데이터를 읽거나 업데이트할 때, 요청들 여러 개를 모았다가 동시에 처리하게 함으로써 성능을 높일 수 있는데, 이를 row buffer라고 한다. 그리고 DRAM 여러 곳에 한번에 요청을 보내어 메모리의 처리 능력을 높일 수 있는데, 이를 DRAM banking이라고 한다.
디스크 드라이브는 널리 사용되는 보조 기억 장치이다. 디스크는 하나는 각각이 두 개의 surface를 가진 여러 개의 platter로 이루어져 있으며, 각 surface에는 동심원의 고리 형태인 track이 있어 그 위에 정보가 기록된다. 각각의 track은 sector로 이루어져 있으며, 각 sector는 gap으로 분리되어 있다.
디스크에서 데이터를 읽기 위해서는 platter가 물리적으로 회전해야 하기 때문에 매우 긴 시간이 걸린다. 데이터를 한 번 읽기 위해서는 head의 위치를 조정해야 하고, head가 데이터를 읽을 수 있게 되기까지 platter가 평균 1/2바퀴 회전해야 하기 때문에, 이러한 시간이 read time의 대부분을 차지한다. head를 조정하는 데 걸리는 시간을 Seek time, 원하는 데이터가 head 밑에 도착하기까지 platter의 회전을 기다리는 시간을 Rotational latency, Target sector에 있는 값을 읽어들이는 데 걸리는 시간을 Transfer time이라 한다. 디스크에서 데이터에 접근할 때 첫 번째 bit에서 가장 많은 시간을 소모하고, 나머지는 거의 바로 읽어들일 수 있다.
프로세서에서 디스크에 쓰인 정보에 접근하기 위해서, 다음과 같은 단계를 거친다.
먼저 CPU에서 disk controller에 command, logical block number, 그리고 읽은 정보를 저장할 메모리 주소를 보낸다. 그 뒤 DIsk controller는 해당하는 위치의 sector를 읽고, direct memory access (DMA)를 통해 메모리에 데이터를 전달한다. DMA가 완료되면 disk controller가 CPU에 interrupt를 보내, 데이터가 준비되었음을 알려 준다.
SSD(Solid State Disk)는 디스크 드라이브의 대안이 될 수 있는 보조 기억 장치이다. SSD는 디스크 드라이브와 다르게 움직이는 부분이 없으므로 상대적으로 빠르게 작동하며 전력을 덜 소모한다. 하지만 덮어쓰기를 반복하면 '닳는' 특성이 있어, 덮어쓰기 횟수에 한계가 있다.
Locality
앞서 살펴본 주기억장치는 프로세서보다 느리고, 보조기억장치는 더 느리다. 어떻게 하면 이들을 잘 이용해 '빠르면서 값싼' 메모리를 구현할 수 있을까? 컴퓨터 프로그램의 Locality(지역성)을 활용하면 가능하다.
Locality란, 프로그램이 데이터 혹은 instruction에 접근할 때, 최근 접근한 것, 혹은 메모리 주소 상에서 인접한 것을 다시 접근할 가능성이 높다는 원리이다. 이들을 Temporal locality, 그리고 Spatial locality로 나누어 볼 수도 있다.
Locality는 메모리 계층 구조의 핵심이 된다. 먼저 디스크와 같은 장치에 모든 데이터를 저장해 놓는다. 그리고 그중에서 최근에 접근된 데이터와 그 주변의 데이터를 조금 더 작고 빠른 DRAM 메모리 (메인 메모리)에 저장한다. 그리고 그 중에서도 더 최근에 접근된 데이터를 SRAM 메모리에 (캐시 메모리)에 저장한다. 그렇게 상위 계층으로 갈수록 빠르고, 용량이 작은 메모리가 있도록 하는 것이 계층 구조의 핵심 개념이다.
메모리 계층 구조에서 더 느리고 큰 하위 계층 메모리의 부분집합으로, 더 작은 용량으로 빠른 접근을 제공하는 상위 메모리를 캐시(Cache)라고 부른다. 캐시에 최근에 접근된 데이터들을 위주로 저장하게 되면 Locality에 의해 대부분의 경우 프로그램은 캐시에서만 데이터를 가져와도 된다.
캐시는 하위 메모리 장치에서 데이터를 복사하여 만드는데, 복사하는 단위를 Block, 혹은 Line이라고 부른다.
프로세서에서 데이터를 요청하였을 때, 캐시에 그 데이터가 존재하는 경우를 Hit, 그렇지 않은 경우를 Miss라고 한다.
Miss가 발생한 경우 하위 메모리에 접근하여 데이터를 가져와야 하는데, 그로 인해 소모해야 하는 시간을 Miss penalty라고 한다.
또한 (Hit ratio) = hits / accesses, (Miss ratio) = 1 - (Hit Ratio)와 같이 비율을 구하기도 한다.
다음 포스팅에서는 캐시의 구조와 작동에 대해 자세히 알아보겠다.
References
- D. Patterson, J. Hennessy (2021). Computer Organization and Design: RISC-V edition (2nd ed). Morgan Kaufmann.
- Lecture Notes from SNU CSE (김지홍 교수님 강의노트)