본문 바로가기

컴퓨터/컴퓨터구조

[컴퓨터 구조] - 메모리 #1 메모리 구조 개론

Overview

지금까지 만든 CPU는 메모리에서 Instruction을 가져오고 데이터를 메모리에서 저장한다. 그리고 메모리는 호출하는 즉시 값을 반환한다고 가정했으나....실제 메모리는 그런거 없다. 아무리 빠른 메모리이더라도 몇 사이클씩은 stall을 피할 수 없고 용량이 커지게 되면 stall 하는 사이클 수는 더욱 증가하게 된다. 하지만, 우리는 빠르면서 용량도 큰 메모리를 원하는데 어떻게 이것을 실현할 수 있을까?

정답은 빠르면서 용량도 큰 것 같은 착시를 만들어내는 것이다. 여러 종류의 메모리를 계층구조로 쌓아올리면 빠르면서 용량도 큰 것 같은 메모리를 구현할 수 있다!

Ideally one would desire an indefinitely large memory capacity such that any particular … word would be immediately available. … We are forced to recognize the possibility of constructing a hierarchy of memories, each of which has greater capacity than the preceding but which is less quickly accessible.

A. W. Burks, H. H. Goldstine, and J. von Neumann

Q. 어떻게 계층구조가 메모리 속도를 높일 수 있는 걸까?
A. 프로그램의 Locality가 있기에 가능하다! 대부분의 프로그램들은 비슷한 영역의 메모리에서 작업하기 마련이고 이것을 이용해서 필요한 메모리들만 cache에 옮겨 놓으면 빠른 작업이 가능하다.

이제 메모리를 어떻게 구성해야할 지 계획을 세웠으니 구체적인 메모리 구현으로 천천히 넘어갈 예정이다. 우선은 메모리의 종류와 구현 기술을 간략하게 확인해보자.

메모리의 종류와 구현 기술들

대표적인 메모리 구현 기술인 SRAM, DRAM, FLASH, DISK, SSD를 살펴보자.

SRAM, DRAM, FLASH, DISK 순서로 속도가 느려지며 생산단가가 감소한다.

SRAM (Static RAM)

  • access time: 0.5 – 2.5ns
  • transitor circuit으로 저장
  • power가 있어야 데이터가 유지된다.

DRAM (Dynamic RAM)

  • access time: 50 – 70ns
  • capacity: 1 – 32 Gb
  • capacitor로 저장
  • 일정한 주기마다 refresh 필요
  • addressing방식이 word line + bit line 방식이라 오래 걸린다.

FLASH

  • access time: 5μs – 50μs 

DISK

  • access time: 5ms – 20ms
  • 물리적 Platter로 저장
    • Disks consist of platters, each with two surfaces.
    • Each surface consists of concentric rings called tracks.
    • Each track consists of sectors separated by gaps.
  • Seek time (원 중심으로부터 수직인 위치 탐색) + Roation time (회전하는데 걸리는 시간) + transfer time (시작 위치로부터 데이터 읽는 시간)

SSD

  • Flash memory를 이용해서 구현

SSD vs DISK

  SSD DISK
속도 Fast Slow
전력 Less More
내구성 Wears out -
가격 Expensive Cheaper

Locality

앞서 overview에서 살펴본 지역성(Locality)가 무엇인지, 어떻게 영향을 미치는지 알아보고자 한다.

대부분의 컴퓨터 프로그램들은 최근에 사용한 메모리위치 근방에서 주로 작업하게 된다. For 이나 while문이 포함된 프로그램이 메모리에 올라간다고 했을때 반복문이 실행된 이후에는 Instruction memory에서는 반복문에 해당하는 영역만 계속 접근하게 될 것이다.

Locality는 temporal locality와 spatial locality로 나뉜다. Temporal locality는 시간의 관점에서 최근 접근한 메모리에 다시 접근할 가능성이 높다는 것이고 spatial locality가까운 메모리는 곧 접근할 가능성이 높다는 것이다.

아래 while문을 활용한 예시를 보면, 

sum = 0;
for (i = 0; i < n; i++){
	sum += a[i];
	return sum;
}

`a[i]`로 순차적으로 접근하는 것을 보아 데이터에 대해 spatial locality를 확인할 수 있고 `for`문 안 명령을 지속적으로 접근하는 것에서 temporal locality를 확인할 수 있다.

위 내용은 컴퓨터 구조에서만 중요한 것이 아니라 high-level에서 좋은 프로그램을 짜기 위해 꼭 알아야 하는 내용이다. 물론 컴파일러가 알아서 최적화를 해주겠지만, 코드의 지역성이 존재해야 메모리 접근 시간이 줄어 성능이 좋아지기 때문이다. 메모리 #3에서 캐시 최적화 관련해서 이와 관련한 예제를 확인해보도록 하자.

Cache

캐시(cache)란 느린 데이터를 임시로 저장해 두는 작고 빠른 메모리를 의미한다. 

Big Idea: The memory hierarchy creates a large pool of storage that costs as much as the cheap storage near the bottom, but that serves data to programs at the rate of the fast storage near the top

메모리 계층구조에서 주로 L1, L2 L3, ... 메모리라는 이름을 부여하며 숫자가 작을수록 계측구조상 위쪽, 더 빠른 메모리이다.

용어

  • Block: 메모리를 cache에 올리는 단위
  • Hit: cache에서 원하는 데이터를 찾은 경우
    • Hit ratio: hit / access
  • Miss: cache에서 원하는 데이터를 찾지 못한 경우
    • Miss ratio: miss / access = 1 - (hit ratio)
    • Miss penalty: miss시 추가적으로 걸리는 시간

 

여기까지 메모리 구조에 대한 전반적인 내용을 살펴보았고, 다음 글에는 cache에 대해서 설명할 예정이다.