알기쉬운 컴퓨터 구조강의 | 메모리 계층구조란 무엇인가?

in #kr6 years ago

오늘은 컴퓨터 메모리의 계층구조에 대해 알아봅니다.

왜 메모리 계층구조가 필요한가?

컴퓨터 내에서 프로그램이 동작하기 위해서는 프로그램이 메모리 위에 적재되어야 하고, 이상적으로 모든 프로그램이 메모리 위해 적재 될 수 있는것을 많은 프로그래머들은 바래왔습니다.
즉, 무제한의 크기를 가지는 빠른 메모리는 모든 프로그래머들을 꿈 이라고 볼 수 있습니다. 하지만, 메인 메모리는 메우 비싸기 때문에 이러한 무제한의 크기를 가지는 메인 메모리는 사실상 구현 불가능 하기에 메모리 계층 구조를 통해 한정된 메모리를 가지고 최대한 큰 크기의 메모리를 사용하는 것 처럼 컴퓨터가 행동하도록 노력했고, 그 결과 메모리 계층 구조가 도입되게 되었습니다.

메모리 계층 구조를 이해할 때에 흔히 도서관에서 공부를 하는 상황에 대입하여 생각해 볼 수 있습니다. 도서관에는 수많은 책들이 꽂혀 있고 언제든지 가져와서 책을 볼 수 있지만, 한번 책을 가져올 때 마다 상당히 귀찮고 오랜 시간이 소요되게 됩니다. 컴퓨터의 경우도 마찬가지 입니다. 여기서 도서관에 해당하는 것이 컴퓨터의 자기 디스크 입니다. 자기 디스크는 아주 크기가 크고 막대한 양의 자료가 들어갈 수 있지만 한번 접근하려면 오랜 시간이 걸리게 됩니다.

이 문제를 어떻게 해결해야 할까요?
보통 도서관에서 공부를 할 때 우리는 필요한 책들을 쭉 뽑아서 책상위에 쌓아두고 공부를 시작합니다. 이렇게 하면 우리가 필요한 대부분의 정보들은 책상 위에서 빠르게 얻을 수 있고, 사실 도서관 전체에는 나와 관련이 없는 많은 자료들이 있는 것에 반해 책상 위에 뽑아 놓은 책에는 내게 필요한 정보들이 존재하게 됩니다. 이렇게 필요한 책을 뽑아 우리가 필요할 만한 정보들을 주변에 배치해 놓는 것처럼 컴퓨터 에서도 우리가 자주 사용할 만한 정보들을 가까운 곳에 복사해 놓게 되고 이것을 우리는 캐시 라고 합니다.

캐시에 들어갈 정보들은 어떤 식으로 선별이 될까요?
이는 마치 도서관에서 책을 뽑아오는 것과 같은 논리이며 지역성의 원칙 에 따라 선별됩니다. 도서관에는 필요한 책들이 종류별로 분류되어 있고, 아마 내게 필요한 정보는 주변에 붙어 있을 확률이 높습니다. 내가 A라는 책을 가져오면서 혹시 몰라서 A 책 주변의 다양한 책들을 가져오는 것이 이러한 지역성의 원칙 을 따른 캐싱이라고 볼 수 있습니다. 또는, 내가 예전에 한번 봤던 책들에 내가 필요한 정보가 담겨있을 확률도 높습니다.
위처럼 내가 필요한 정보 주변의 책에 필요한 정보가 있을 확률이 높은 것을 공간적 지역성 이라 하고, 또 예전에 내가 사용했던 책에 필요한 정보가 있을 확률이 높은 것을 시간적 지역성 이라고 합니다. 이러한 두가지 지역성을 원칙에 따라 우리는 책을 가져오고 컴퓨터 에서는 캐싱 을 통해 이러한 작업을 수행합니다.

도서관에서 책 무더기를 가져오듯이 한번에 가져오는 정보의 최소 단위를 블록 이라고 합니다. 컴퓨터가 어떤 정보가 필요하다면 그 정보가 담긴 블록을 통으로 가져와서 작업을 수행하게 됩니다. 만약 필요한 정보가 이렇게 한번 가져온 블럭 중에 있는 경우를 적중(hit) 했다고 하고, 그 확률을 적중률 이라고 하며, 그 시간을 적중 시간 이라고 합니다.

만약 가져온 블록 중에 필요한 정보가 없는 경우는 어떨까요?
이 경우를 컴퓨터에서는 실패 라고 하며, 그 확률을 실패율 이라고 합니다. 이렇게 실패에 따른 손실은 실패 손실 이라고 하며 이는 하위 계층에서 블록을 가져와서 상위 계층 블록과 교체하는 시간에 그 블록을 프로세서에 보내는 데 걸리는 시간을 더한 값입니다.

이처럼 컴퓨터는 사용할 확률이 높은 정보들을 CPU에 가까지 적재하고 다른 정보들을 메모리 계층의 아래쪽에 위치시킴으로써 보다 빠르게 정보를 탐색할 수 있도록 하며, 때문에 메모리는 계층 구조 로 이루어져 있습니다.

메모리의 종류에는 어떤 것들이 있나요?

메모리 계층 구조에서 프로세서와 가장 가까운 캐시 는 SRAM이 사용되며, 메인 메모리 에는 DRAM 이 사용됩니다. SRAM은 어떤 데이터든지 접근 시간이 같고 리프레시가 필요없어 DRAM에 비해 아주 빠릅니다. DRAM 은 SRAM에 비해 아주 느립니다.

캐시란 무엇인가요?

캐시란 메모리와 프로세서 사이에 있는 메모리 계층을 나타내기 위해 선택된 이름입니다. 오늘날 대부분의 컴퓨터가 캐시 메모리를 사용하고 있습니다.
위의 도서관에서의 예처럼 캐시는 '책상' 의 역할을 수행합니다. 우리는 도서관에서 책상위의 책들을 뒤적거려 책을 찾는다면 캐시는 어떻게 정보를 찾을 까요? 그건은 바로 메모리 주소에 기반하여 캐시 내의 정보를 할당 하는 직접 사상 방식을 통해 이루어 집니다. 실제 물리 메모리는 주소값 을 가지는데 이 주소값의 마지막 몇자리를 인덱스로 하여 캐시에 저장이 됩니다. 가령 물리 메모리의 주소값이 0101100101 이고, 블록의 수가 8개 라면 끝의 3자리(log2_8)는 인덱스 필드로 캐시 내에서의 주소를 담당합니다.
모든 직접 사상 캐시는 블록을 찾기 위하여 다음의 사상 방식을 사용합니다.

(블록주소) modulo (캐시 내에 존재하는 전체 캐시 블록 수)

위의 사상 방식을 따르면 10101011, 11101011, 00101011 처럼 끝의 인덱스 필드가 같은 메모리의 정보들을 캐시 메모리에서 같은 블록에 사상될 것입니다. 이렇게 되면 가져온 블록이 정말 원하는 정보인지 알 수 있어야 하며 이를 위해 태그 필드가 존재합니다. 이 태그 필드는 주소 중에서 인덱스 필드를 제외하고 남은 숫자들이며 이를 통해 해당 블록이 찾고자 하는 블록인지 알 수 있습니다.

캐시 블록은 항상 유효한 숫자를 가지고 있을까요?
만약 캐시가 비어있고나 혹은 올바르지 못한 값을 가지고 있는 경우가 있을 수 있습니다. 심지어 이 데이터는 물리 주소에 없는 값일 수도 있고요, 그렇다면 이러한 블록을 어떻게 표기해야 할까요?
이를 위해 캐시에는 유효 비트 라는 것이 존재합니다. 이 비트가 1로 설정되어 있지 않으면 유효한 블록이 없는 것으로 간주합니다.

이처럼 캐시는 예측 기법 을 통해 자료의 찾는 속도를 빠르게 해 주는 역할을 하며, 현대 컴퓨터에서 캐시 예측 적중률은 95% 이상입니다.

필요한 캐시의 사이즈는 어떻게 알 수 있나요?
필요한 캐시의 사이즈는 전체 블록의 수와 블록의 크기를 가지고 알 수 있습니다.

예를 들어,
32비트의 직접 사상 캐시가 있고, 2^n개 블록을 가지고 있다고 하면 당연히 n개의 비트는 인덱스 필드에 사용됩니다.
또 실제 캐시에서는 블록의 크기가 1워드보다 보통 크기 때문에, 만약 블록의 크기가 2^m개 워드라고 하면 m개 비트는 블록 내부에서 워드를 구분하는 데에 사용되며 두 비트는 주소 중 바이트 구별용으로 사용됩니다.
이 경우 태그 필드의 길이는

32-(m+n+2) 가 되며,

직접 사상 캐시의 전체 비트 수는
2^n * (블록 크기+태그 크기+유효 비트 크기) 이므로

2^n * (2^m * 32 + 32-n-m-2 + 1) = 2^n(32*2^m+31-n-m) 비트 이다.

캐시 실패의 경우는 어떻게 처리되나요?
만약 캐시에서 원하는 정보를 찾지 못하는 경우에는 임시 레지스터와 프로그래머에게 보이는 레지스터의 내용을 그대로 유지한 채 메모리로부터 데이터가 오기를 기다리면서 전체 시스템이 지연되게 됩니다. 캐시 실패의 처리 단계는 다음과 같습니다.

  1. 원래의 PC값(현재 PC 값 -4)을 메모리로 보낸다.
  2. 메인 메모리에 읽기 동작을 지시하고 메모리가 접근을 끝낼 때까지 기다린다.
  3. 메모리에서 인출된 데이터를 데이터 부분에 쓰고, 태그 필드에 주소의 상위 비트를 쓰고 유효 비트를 1로 만들어서 캐시 엔트리에 쓰기를 수행한다.
  4. 명령어 수행을 첫 단계부터 다시 시작하여 캐시에 명령어를 가져온다. 이제는 필요한 명령어를 캐시에서 찾을 수 있다.

캐시에 데이터를 쓰는 경우는 어떻게 되나요?
캐시에 데이터를 수정하고 저장하는 경우 데이터 캐시에만 작성 되고 메인 메모리에는 쓰지 않아지는 불일치 가 나타날 수 있습니다. 이를 해결하는 방법 중 하나는 즉시쓰기 이며, 통해 데이터를 항상 메모리와 캐시에 동시에 작성하게 됩니다. 하지만 이는 프로세서의 성능을 심하게 저하시키고 보통은 쓰기 버퍼 를 활용하여 일단 캐시에만 작성하고 천천히 메모리에 작성되는 방식으로 처리합니다.


Coin Marketplace

STEEM 0.30
TRX 0.12
JST 0.033
BTC 63527.41
ETH 3109.34
USDT 1.00
SBD 3.86