Computer Science

[CS] 메모리 계층과 성능

oagree0123 2022. 2. 3. 15:07

이 글은 '한 권으로 읽는 컴퓨터 구조와 프로그래밍' 을 정리하여 작성한 글입니다.


메모리 계층과 성능

과거에는 CPU와 메모리의 작업 속도가 같았지만, 

시간이 지남에 따라 CPU는 속도가 빨라졌고, 메모리는 그렇게까지 빨라지지 못해

CPU 보다 속도가 뒤쳐지기 시작했습니다.

 

이로인해, CPU가 느린 메모리를 기다리느라 아무 일도 하지 않는 경우가 생겼습니다.

 

메모리 계층

메모리를 필요에 따라 여러가지 종류로 나누어 둠을 의미합니다.

이 때 필요한 대부분의 경우 CPU가 메모리에 더 빨리 접근하기 위함 입니다.

 

메모리 계층

  1. 레지스터와 캐시는 CPU 내부에 존재합니다. CPU가 아주 빠르게 접근할 수 있습니다.
  2. 주 메모리는 CPU 외부에 존재합니다. 레지스터와 캐시보다 더 느리게 접근 할 수 밖에 없습니다.
  3. 대용량 저장장치는 CPU가 직접 접근할 방법조차 없습니다. CPU가 대용량 저장장치에 접근하기 위해서는 대용량 저장장치의 데이터를 메모리로 이동시키고, 메모리에서 접근해야 합니다. 아주 느린 접근 밖에 불가능합니다.

 

컴퓨터 메모리 종류

레지스터

레지스터는 컴퓨터의 프로세서 내에서 자료를 보관하는 아주 빠른 기억 장소입니다.

일반적으로 현재 계산을 수행중인 값을 저장하는 데 사용된다.

 

캐시

CPU 캐시는 메인 메모리에서 가장 자주 사용되는 위치의 데이터를 갖고 있는, 크기는 작지만 빠른 메모리입니다.

대부분의 메모리 접근은 특정한 위치의 근방에서 자주 일어나는 경향이 있기 때문에, 데이터를 크기는 작지만 속도가 빠른 캐시메모리에 복사해 두면 평균 메모리 접근 시간을 아낄 수 있습니다.

 

프로세서가 메인 메모리를 읽거나 쓰고자 할 때는, 먼저 그 주소에 해당하는 데이터가 캐시에 존재하는지를 살핍니다.

만약 그 주소의 데이터가 캐시에 있으면 데이터를 캐시에서 직접 읽고, 그렇지 않으면 메인 메모리에 직접 접근합니다.

 

주 메모리

CPU에서 직접 접근이 가능한 메모리. 메모리(memory)는 종종 '기억 장치'라는 용어와 혼용되기도 하지만,

대체로는 주기억장치를 말하며 특히 램을 가리키는 경우가 많습니다.

대표적으로 RAM과 ROM이 존재합니다.

 

대용량 저장장치

CPU에서 직접 접근이 불가능한 메모리. 접근하려면 디바이스 드라이버와 시스템 콜을 통하여 기억장치의 특정 위치의 내용을 주 메모리 로드(Load)한 뒤 읽어야 합니다.

 

 

책에 나온 비유에 따르면, 레지스터는 냉장고와 같이 공간이 많지는 않지만

내용물에 빨리 접근할 수 있습니다.

주 메모리는 가게와 같이 물건이 많지만 물건을 가져오려면 시간이 더 걸립니다.

대용량 저장장치는 창고와 같이 공간이 더 많지만 집에서 멀리 떨어져 있습니다.

 

조금 더 비유를 추가하면, 냉장고 < 가게 < 창고 순으로 물건을 많이 가지고 나옵니다.

컴퓨터에서 일어나는 일도 비슷합니다. CPU와 주 메모리 사이에는 작은 덩어리, 

주 메모리와 디스크 사이에는 더 큰 덩어리가 오갑니다.

 

위에서 CPU와 메모리들 간에 상관 관계에 대해 알아보았습니다. 

CPU가 주 메모리 보다 10배 빠르다고 가정하면, CPU가 메모리를 기다리느라 많은 시간을 소비해야합니다.

이를 해결하기 위해 식품 저장고와 같은 캐시(cache)라는 하드웨어를 CPU에 추가합니다.

캐시는 저장공간이 훨씬 작지만, 빠르고 프로세서와 같은 속도로 작동합니다.

 

캐시의 지역성

반복 접근

책상에서 자주 사용하는 물건을 가까운 자리에 두듯, 자주 사용하는 데이터를 CPU와 가까운 위치에 저장해 필요할 때 마다 빠르게 꺼내쓸 수 있다. 캐시메모리를 사용하면 CPU가 메모리에 접근하는 횟수를 줄여 성능 향상의 효과를 볼 수 있다. 

 

주변 접근

메모리 접근은 모여있는 데이터들을 접근하는 경향이 있기 때문에, 데이터를 크기는 작지만 속도가 빠른 캐시메모리에 복사해 두면 평균 메모리 접근 시간을 아낄 수 있습니다.

 

데이터는 블록으로 전송되기 때문에 반복 접근과 주변 접근이 되면 속도와 성능에 유리함

 

주 메모리에서 데이터를 가져와 캐시에 어떻게 저장해야 할까요?

(가게에서 어떤 물건을 가져와 식품저장고를 채워야 할까?)

 

책 앞의 내용에서, '임의 접근 메모리'(RAM, 151p)를 보면

행을 고정하고 열을 변화시키면서 DRAM을 읽을 때 더 빠르다는 사실을 알 수 있습니다.

프로그램의 작동 방식을 보면, 분기가 없는 경우 메모리를 순서대로 읽고,

데이터가 한데 모여 있는 경우가 많다는 것을 알 수 있습니다.(지역성) 이러한 현상을 이용하면 성능을 높일 수 있습니다.

 

메모리에서 오고가는 자료를 관리하는 데 쓰이는 CPU 메모리 컨트롤러 하드웨어는

메모리에서 연속된 열에 있는 데이터를 한번에 가져옵니다. (블록 형태의 데이터)

대부분 연속된 위치의 데이터가 필요하기 때문입니다.(지역성)

 

가게에서 시리얼을 한 박스만 가져오는 대신 우리는 보통 가방에 몇 가지 시리얼을 담아서 집으로 가져옵니다.

(주 메모리에서 데이터를 전부 가져오는 대신, 주로 사용하는 데이터를 캐시에 저장합니다.)

 

메모리에 접근하는 패턴이 순차적이 아니라 캐시 실패가 일어나도 CPU는 고속 메모리 접근 모드가 가능하기 때문에 좀더 유리합니다.

 

캐시 실패는 CPU가 캐시에서 어떤 내용(어떤 주 메모리 주소에 들어 있는 내용)을 찾았는데 캐시에 그 데이터가 없어 메모리를 읽어야 하는 경우를 뜻합니다.

캐시 적중은 CPU가 원하는 내용을 캐시에서 찾은 경우를 말합니다.

 

캐시 메모리도 계층이 있는데, 모든 캐시가 같은 칩 안에 있어도 CPU와 멀 수록 더 느리고 더 커집니다.

이 들을 L1, L2, L3 (L은 level) 캐시라고 부르는데, 이 계층은 음식 저장고와 차고에 여분의 냉장고가 있는 것과 같습니다.

또한, 굉장히 복잡한 일을 처리하는 디스패처가 있는데, 이는 캐시에 데이터를 넣거나 꺼내는 일을 담당하는 아주 큰 논리 회로입니다.

 

더 복잡한 수정을 가하면 성능을 더 향상할 수 있다. 기계에는 올바른 데이터를 메모리에서 프리페치(미리 페치해 가져옴)해서 캐시를 준비시키기 위해 조건 분기 명령어의 결과를 예측하는 분기 예측회로가 포함됩니다.

심지어 순서를 벗어나는 실행을 처리하는 회로도 존재한다.

 

이 회로는 CPU가 프로그램에 명시된 명령어 순서를 벗어나서 가장 효율적으로 명령어를 수행하게 해줍니다.

 

캐시 일관성을 유지하는 것은 아주 어렵습니다.

캐시 일관성(cache coherence)는 공유 메모리 시스템에서 프로세서가 가진 로컬 캐시 간의 일관성을 의미한다.

공유 메모리 시스템 개념도

각 클라이언트가 자신 만의 로컬 캐시를 가지고 다른 여러 클라이언트와 메모리를 공유하고 있을 때, 캐시의 갱신으로 인한 데이터 불일치 문제가 발생한다. 예를 들어 변수 X에 대해서 두 클라이언트가 변수 X를 공유하고 있고 그 값이 0이라고 하자. 이때 클라이언트 1(그림의 윗쪽)이 X에 1을 대입하였고 클라이언트 2(그림의 아래쪽)가 변수 X를 읽어들이게 되면 클라이언트 2는 클라이언트 1에 의해 수정된 값인 1을 받아들이는 것이 아니라 현재 자신의 로컬 캐시에 있는 0을 읽어들이게 된다. 따라서 캐시 1, 2는 같은 X라는 변수에 대해 다른 값을 가지게 되므로 데이터 불일치 문제가 발생한다. 캐시 일관성을 유지한다고 하는 것은 이러한 데이터 불일치 현상을 없애는 것을 의미한다.

 

위와 같은 문제를 해결하는 방법 중 가장 간단한 방법은 라이트 스루 입니다.

 

라이트 스루는 데이터를 캐시에 기록하는 동시에 메모리에도 기록합니다.

그러나 이 방식은 캐시의 장점을 없애버립니다. 이에 대한 해결 방법은 책의 범위를 벗어납니다.

코프로세서

프로세서 코어는 아주 복잡한 회로입니다.

몇 가지 연산을 코프로세서라는 더 단순한 회로에 위임하면 프로세서 코어가 일반적인 연산에 

활용할 수 있는 공간을 더 확보할 수 있습니다.

 

과거는 한 칩에 모든 연산 회로를 넣기 어려워서 코프로세서가 사용되었습니다.

예를 들어 부동소수점 연산을 처리할 회로 공간이 없어서 사용되는 경우가 있었는데, 지금은

그래픽 처리 등 여러 가지 기능을 담당하는 코프로세서가 한 칩에 같이 들어가는 경우가 많습니다.

 

일부 코프로세서는 다른 일은 처리하지 않고 데이터 복사만 담당합니다.

이런 방식을 직접 메모리 접근(DMA) 이라고 합니다.

여기서 이만큼의 데이터를 저쪽으로 복사하고, 다 끝나면 나한테 알려줘와 같은 방식으로

DMA를 설정할 수 있다. CPU는 DMA 장치에 귀찮은 일을 많이 떠맡기기 때문에 유용한 연산을 더 많이

처리할수 있습니다.

 

정리

  • 메모리가 CPU보다 속도가 느려, CPU가 느린 메모리를 기다리느라 아무 일도 하지 않는 경우가 생김
  • 캐시의 사용 이유
    데이터는 블록형태로 한번에 넘어온다(지역성)

    반복 접근
    대부분의 메모리 접근은 특정한 위치의 근방에서 자주 일어나는 경향이 있기 때문에, 데이터를 크기는 작지만 속도가 빠른 캐시메모리에 복사해 두면 평균 메모리 접근 시간을 아낄 수 있습니다.

    주변 접근
    책상에서 자주 사용하는 물건을 가까운 자리에 두듯, 자주 사용하는 데이터를 CPU와 가까운 위치에 저장해 필요할 때 마다 빠르게 꺼내쓸 수 있다. 캐시메모리를 사용하면 CPU가 메모리에 접근하는 횟수를 줄여 성능 향상의 효과를 볼 수 있다.