[컴퓨터구조] 캐시 메모리(CACHE)와 매핑 방법 & 일관성

[컴퓨터구조] 캐시 메모리(CACHE)와 매핑 방법 & 일관성


Cache Memory

빠른 CPU, 느린 Memory
프로그램을 CPU 혼자서 수행하는 것이 아니라 메모리도 같이 참여한다.
용량은 Cache < Main Memory < HDD 순이며 속도는 역순이다.

CPU와 메인 메모리 사이에 캐시 메모리를 두어 CPU가 요청하는 것은 빠른 캐시 메모리에서 바로 전달을 해주면서 속도를 개선하였다.
그리고 HDD의 일부를 가상메모리로 사용해서 메모리의 부족한 용량을 확장시켜주며 가격은 메인 메모리 전체를 캐시로 바꾸는 것, 메인메모리의 용량을 키우는 것보다 저렴한 고객 맞춤 서비스가 완성되었다.
이러한 성능 개선의 비결은 참조의 지역성이라는 성질 덕분에 발생했다.


Mapping Function

주소가 다르잖아?

CPU가 메모리 주소를 사용하여 메모리로 데이터를 받으려고 한다.
하지만 CPU가 쓰는 주소는 가상 메모리 주소로 메모리 입장에서는 외계어이다.
따라서 중간에 메모리 관리 장치(MMU)가 가운데에서 변역을 하여 메모리가 알아 먹을 수 있는 물리 주소로 변환해 준다.
그리고 캐시에 해당 주소에 대한 데이터가 있는지 확인을 하는데 캐시에 데이터를 저장하는 방식에 따라 물리주소를 다르게 해석할 수 있다.



직접 매핑(Direct Mapping)

우선 메인 메모리에서 캐시로 데이터를 저장할 때 참조의 지역성 때문에 한번 퍼낼 때 인접한 곳까지 한꺼번에 캐시 메모리에 저장하고 이 때 단위를 블록(Block)이라고 한다.
그리고 캐쉬는 메인 메모리의 몇번째 블록인지를 알려주는 태그(Tag)도 함께 저장한다.

메모리 주소 중에 가장 뒷부분(붉은색)은 블럭의 크기를 의미한다.
지금 블럭의 크기가 4이므로 뒤의 두자리를 사용하여 블럭의 크기를 표현하였다.
그리고 이 영역은 블럭에 몇 번째에 원하는 데이터가 있는지 보여주는 지표가 되어 준다.
만일 위의 예에서 붉은 영역이 01이라면 블록의 두 번째 내용을 CPU에서 요청한 것이다.

같은 라인에 위치하는 데이터는 파란색 색칠한 영역에 의하여 구별이 가능하다.
예를 들면 메모리에 첫번째 요소 00000과 다섯번재 주소 00100은 캐시내에 같은 위치에 자리잡고 있어서 구별이 필요한데, 앞의 세자리 000과 001로 구별을 할 수 있다.

이와 같은 요소의 활용은 캐시 메모리에 저장된 데이터 중 내가 원하는 것이 있는지 없는지 확인이 가능하다.

  1. 캐시의 태그와 주소상의 태그가 동일한지 확인한 후 같으면 붉은 영역을 통해 데이터를 읽는다.
  2. 만일 태그가 다르다면 메모리에서 데이터를 가지고 온다.

직접 매핑은 위의 사진처럼 캐시에 저장된 데이터들은 메인 메모리에서와 동일한 배열을 가지도록 매핑하는 방법을 말한다. 
이와 같은 방식을 사용하기 때문에 매우 단순하고 탐색이 쉽다는 장점이 있다.
하지만 적중률(Hit ratio)가 낮다는 단점이 있다.
반복문을 사용할 건데 같은 라인의 00000을 불렀다가 그 다음엔 00100을 부른다면 캐시에 빈번하게 변경이 발생할 수 있기 때문이다.


연관 매핑(Associative Mapping)

연관 매핑은 직접 매핑의 단점을 보완하기 위해 등장하였다.
캐시에 저장된 데이터들은 메인 메모리의 순서와는 아무런 관련이 없다.
이런 같은 방식을 사용하기 때문에 캐시를 전부 뒤져서 태그가 같은 데이터가 있는지 확인해야한다. 따라서 병렬 검사를 위해 복잡한 회로를 가지고 있는 단점(시간이 오래걸림)이 있지만 적중률이 높다는 장점이 있다.
연관사상이 가장 빠르고 다음 집합 연관 사상이 빠르며 직접 사상이 가장 느리다.



세트 연관 매핑

2-way 연관 매핑
set을 먼저 설정하고 -> 그 다음 어느 블록에 들어갈 것인지? (ex : 4-way면 4개 블록중 하나)

직접 매핑의 단순한 회로와 연관 매핑의 적중률 두 개의 장점만을 취하기 위해서 만들어진 방식이다.
각각의 라인들은 하나의 세트에 속해 있다.
세트 번호를 통해 영역을 탐색하므로 연관 매핑의 병렬 탐색을 줄일 수 있다.
그리고 모든 라인에 연관 매핑처럼 무작위로 위치하여 직접매핑의 단점도 보완하였다.
세트 안의 라인 수에 따라 n-way 연관 매핑이라고 한다.(ex: 2-way집합 연관 사상)



캐시 일관성

SMP와 같은 공유 메모리 방식의 병렬 컴퓨터에서 주기억 장치(공유 메모리)와 캐시에 저장된 데이터가 달라지는 현상.
캐시 내의 데이터가 변경되면 주기억장치내의 해당 단어 뿐 아니라 다른 캐시 내의 그 단어도 무효가 된다.
Wirte Through 방식 역시 갱신된 캐시와 주기억장치의 데이터는 동일하지만 타 캐시의 데이터가 무효가 되므로 캐시 일관성 문제가 발생할 수 있다.

캐시를 위한 두가지 방식

CPU에서 캐시의 100을 101로 바꾸면 메모리도 바꿔야 하는데

  • write through(동시에 쓰기) : 일관성은 보장되지만 접근 시간은 느려진다.
    • CPU가 데이터를 사용하면 캐시에 저장되게 되는데, 데이터가 캐시 됨과 동시에 주기억장치 or 디스크로 기입되는 방식을 지원하는 구조의 캐시이다.
    • Data loss가 발생하면 안되는 상황에서는 Write Through를 사용하는 것이 좋다.
    • 즉, 캐시와 메모리 둘다에 업데이트를 해버리는 방식이다.
      • 장점 : 캐시와 메모리에 업데이트를 같이 하여, 데이터의 일관성을 유지할 수 있어서 안정적
      • 단점 : 속도가 느린 주기억장치 or 보조기억장치에 데이터를 기록할 때, CPU가 대기하는 시간이 필요하기 때문에 성능이 떨어진다.
  • write back(나중에 쓰기) : 블록 단위에 캐시로부터 해제되는 때(캐시안에 있는 내용을 버릴시)에만 주기억장치 또는 보조기억장치에 기록되는 방식
    • 빠른 서비스를 요하는 상황에서는 Write Back을 사용하는 것이 좋다.
    • 즉, 데이터를 쓸 때 메모리에는 쓰지 않고 캐시에만 업데이트를 하다가 필요할 때에만 주기억장치나 보조기억장치에 기록하는 방법이다.
      • 장점 : Write though보다 훨씬 빠르다.
      • 단점 : 속도가 빠르지만 캐시에 업데이트 하고 메모리에는 바로 업데이트 하지 않기 때문에, 캐시와 메모리가 서로 값이 다른 경우가 발생할 수 있다.

캐시 일관성 유지 방식

소프트웨어 방식
  • 컴파일러와 OS를 이용. 잠재된 문제를 검출하는 오버헤드가 run time에서 compile time으로 이동하고, 설계 복잡도가 하드웨어에서 소프트웨어로 이동하는 것이 장점
    반면 compile time에 문제를 검출해야 하므로 캐시 이용률이 저하됨.
하드웨어 방식
  • 캐시 일관성 프로토콜이라고도 하며, 잠재적인 불일치 조건들이 run time에 동적으로 검출
    소프트웨어 방식에 비해 키시 사용률이 좋으며, 프로그래머와 컴파일러에 투명하므로 소프트웨어 개발 부담을 줄임
    일반적으로 디렉토리 프로토콜(directory protocol)과 스누피 프로토콜(snoopy protocol)으로 나뉜다.
    1. 디렉토리 프로토콜
    2. 스누피 프로토콜
MESI 프로토콜

댓글

이 블로그의 인기 게시물

[소프트웨어공학] NS(Nassi-Schneiderman) 차트

[컴퓨터네트워크] Telnet이란?

[Python] # -*- coding: utf-8 -*-를 쓰는 이유