반응형

버스 : 메모리에 있는 값들을 CPU의 레지스터로 불러들이거나 기록하는 등의 데이터의 이동이 필요한데, 이 값들을 주고 받는 통로

 

캐시 메모리

: 메인 메모리와 CPU간의 데이터 속도 향상을 위한 중간 버퍼(중간지점: 데이터를 기억) 역할을 하는 CPU내 또는 외에 존재하는 메모리

 

데이터의 임시 보관소

'Cache'는 보관이나 저장의 의미이다. CPU와 메인 메모리 사이에 존재한다고 말할 수 있다.

즉, CPU는 빠르게 일을 진행하고 있는데, 메모리(느림)에서 데이터를 가져오고 가져가는데 느려서 중간에 미리 CPU에 전달될 데이터를 들고 서 있는 형태라고 말할 수 있다.

 

캐시 메모리의 성능

메인 메모리의 블록(예: 박스)사이즈의 데이터를 담아 두었다가 CPU에게 워드(예: 글자)사이즈 만큼의 데이터를 전송하게 된다.

이때, 이 사이즈들이 캐시의 성능에 영향을 미치게 된다. 블록사이트나 워드사이즈가 상대적으로 크다면 그만큼 Cache의 Hit률(캐시메모리에 CPU가 찾는 데이터가 존재할 확률)이 높아지기 때문이다.

 

이때, CPU가 필요한 데이터가 캐시에 들어와 있으면 'Cache Hit'이라 하고, 없으면 'Cache Miss'라 한다.

그리고 CPU가 원하는 데이터가 캐시에 있을 확률을 'Hit Ratio'라고 한다.(스페인어 Ratio는 확률이라는 뜻)

 

동작과정

1. CPU가 필요로하는 메모리 주소를 받는다.

2. 캐시에 존재하는가? (YES/NO)

 

YES

CPU가 요청한 데이터를 캐시로부터 읽어 전달 -> 끝

 

NO

메인 메모리로부터 해당 주소의 메모리를 블록사이즈만큼 읽어들인다. ->

메인 메모리로부터 읽어들인 데이터를 캐시에 기록한다. ->

CPU가 요청한 데이터를 워드사이즈로 전달해준다. ->

끝 

캐시의 지역성(Locality)

CPU에서 명령어를 수행하면서 매번 Cache Memory를 참조하게 되는데, 이때 Hit률(데이터가 있을 확률)이 지역성을 갖는다.

지역성 : 어느 순간에 특정부분집중적으로 참조하는 것. 공간적 시간적 특성이 있다. 

 

공간적 지역성

: 한 번 참조한 메모리의 옆에 있는 메모리를 다시 참조하게 되는 성질 

예) Array(배열)는 일정한 메모리 공간순차적([0],[1])으로 할당받아 사용하는 것

 

int a[10] 이라고 한다면, a[0]을 사용 후, 인접한 a[1]를 사용될 확률이 높다는 것이다. 

 

시간적 지역성

: 한 번 참조된 주소의 내용은 곧 다음에 다시 참조 된다는 특성을 말한다.

예) 반복문(for, while)을 연상해볼 수 있다. 

.

.

 

지역성의 특성은 블록 사이즈의 크기와 연관이 있다. 블록 사이즈가 커지면 캐시의 Hit률이 높아지는 건 당연지사다.

그렇다고, 무작정 블록 사이즈를 키우는 것 만으로는 효율성을 높일 수는 없다.(CPU가 원하는 데이터를 캐시가 가지고 있냐? 문제이기 때문)

 

이에 따라 몇 가지 요소를 고려하여 설계해야한다.

설계의 목표는 Hit률을 높이고, 최소의 시간에 데이터를 전달(데이터 찾아서 전달) 하는 것이다.

Hit 실패 시 다음 동적을 처리하는데 있어서 시간을 최소화(메인 메모리에서 가져오기)하는 것이 중요하며 데이터의 일관성(정확한 데이터)을 유지해야한다.

 

Write Through 정책

프로세서에서 메모리에 쓰기(write) 요청을 할 때마다 캐시의 내용과 메인 메모리의 내용을 같이 바꾸는 방식.

캐시의 데이터를 최신화 시켜준다고 보면 된다. 하지만,  메인 메모리에도 계속 접근해야 하므로(캐시가 아니라 메인메모리에 접근하게 되면 시간이 늘어난다.) 캐시에 의한 접근 시간의 개선이 없어지게 되며, 쓰기(데이터 업데이트)시에 접근 시간은 메인 메모리의 접근 시간과 같게 된다는 단점을 가지게 된다.

 

하지만, 실제 프로그램에서 메모리 참조 시 쓰기에 대한 작업은 통계적으로 10 ~ 15%에 불과하다.

 

Write Back 정책

CPU에서 메모리에 대한 쓰기 작업 요청 시, 캐시에서만 쓰기 작업을 하고 그 변겨이 사실을 확인 할 수 있는 표시를 하여 놓은 후,

캐시로부터 해당 블록의 내용이 제거(사용 끝 -> 마지막 데이터는 유지) 될 때, 그 블록을 메인 메모리에 복사함으로써 메인 메모리와 캐시의 내용을 동일하게 유지하는 방식.

 

이 방식은 동일한 블록 내에 여러 번 쓰기를 실행하는 경우 캐시에만 여러번 쓰기를 하고 메인 메모리는 한 번만 쓰기 되므로 매우 효율적으로 동작하게 된다.

 

 

캐시 메모리의 주소 매핑 방식

캐시 메모리는 실제 메인 메모리에 비해 그 크기가 매우 작아서 메인 메모리와의 1:1 매칭되는 동일한 주소 체계를 가질 수 없다.

그래서 메인 메모리와의 다른 형태의 주소 매핑 방식을 사용하고 있다.

 

매핑 : '연관성을 관계하여 연결시켜준다.' 는 의미

 

직접매핑

: 메인 메모리를 일정한 크기의 블록(캐시사이즈)으로 나누고 각각의 블록을 캐시의 정해진 한 위치에 매핑하는 방식

 

예) 메인 메모리가 16메가바이트, 캐시메모리가 64킬로메가바이트 라면,

메인 메모리를 캐시 사이즈 단위로 나누게 되고, 각각의 블록들에 대하여 태그(명찰)값을 매기게 된다.

예의 경우 64KByte의 캐시 사이즈를 가지므로 64KByte 단위로 블록을 나누고,

각각의 블록들은 하나의 태그 값으로 나타내게 되므로,

메인 메모리 주소 0~0x00FFFF까지는 태그 값 00,

메인 메모리 주소 0x010000~ 0x01FFFF까지는 태그 값 01 과 같은 식이 되는 것이다.

 

완전 연관 매핑 

: 직접 매핑이 한 곳에 밖에 매핑할 수 없다는 단점은 캐시의 성능을 매우 저하(블록을 계속 교체 시켜야하기에) 시킴.

이에 따른 개선으로 캐시의 태그 필드를 확장하여, 캐시의 비어 있는 곳이라면 어디든지 매핑 시킬 수 있는 매핑 방법

 

집합 연관 매핑 

정해진 위치 + 남은 자리에 매핑하는 방법

 

캐시 일관성 문제를 해결하기 위한 프로토콜

메모리를 공유하는 구조에서는 다중 프로세스가 메모리 사용 시, 그 성능을 개선하기 위해 캐시에 저장하게 되는데,

메모리간에 데이터 불일치가 발생된다.

 

해결방법

1. 공유 캐시를 사용 : 모든 프로세스들이 하나의 캐시를 사용. 충돌이 심하다. 지역 참조 위반.

2. 버스 감시 메커니즘 : 변경에 대한 자신의 캐시 블록 상태를 제어.. (블록 상태감시)

3.  디렉토리 기반 캐시 일관 성 유지 : 캐시 상태를 디렉토리에 저장 -> 데이터 일관성 유지 -> 주기억장치 디렉토리에 기억

 

 

캐시의 교체 알고리즘

: 캐시에 빈 공간이 없는 상태에서 새로운 내용이 메인 메모리로부터 캐시 메모리에 복사되어야 하는 상황에서 어떤 것을 뺄 것인가?

FIFO(first in first out) : 가장 오래있던 놈 나가!

LRU(least recently used) : 사용되지 않은 채로 오래있던 놈 나가!

LFU(least frequently used) : 사용빈도수 가장 적은놈 나가!

랜덤 : 아무나 한놈 나가!

 

 

반응형

+ Recent posts