본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
Cache Memory

CPU와 주기억장치 사이에 있는 고속 메모리로, CPU와 주기억장치의 처리 속도 차이를 보완하기 위한 기억장치

  • 구역성(Locality)의 원리에 따라 CPU가 참조하는 데이터를 예측하여 캐시 메모리에 미리 담아 둔다.
  • 캐시 메모리에 있는 데이터는 주기억장치를 참조하지 않고 고속의 캐시메모리에서 바로 가져와 실행한다.

캐시 메모리 성능

편집 원본 편집
  • Hit Rate(적중률) = 적중 횟수 / 접근 횟수 * 100
  • Miss Rate(실패율) = (100 - 적중률)

메모리 사상 기법

편집 원본 편집
Direct Mapping

  • 메모리 주소와 캐시의 순서를 일치시킴
  • ex) 메모리가 1~100, 캐시가 1~10으로 가정하면
    • 1~10까지의 메모리는 캐시의 1에 할당, 11~20까지의 메모리는 캐시의 2에 할당
  • 구현 정말 간단하지만 캐싱 효율이 떨어져 잦은 교체 발생
  • 적중률이 낮고 성능이 낮은 단순한 방식
Fully Associative

  • 순서를 일치시키지 않음
  • 필요한 메모리값을 캐시의 어디든 저장 가능
  • 찾는 과정은 느리지만 필요한 캐시들 위주로 저장할 수 있기 때문에 적중률이 높음
  • 캐시가 일반 메모리보다 속도가 훨씬 빠르므로 적중률이 높은 것이 유리

직접/연관 사상

편집 원본 편집
Set Associative

  • 연관매핑에 직접매핑을 합쳐 놓은 방식
  • 순서를 일치시키고 저장하되, 일정 그룹을 두어 그 그룹 내에서 저장토록 함
  • ex) 메모리가 1~100, 캐시가 1~10으로 가정하면
    • 캐시 1~5에는 1~50의 데이터 저장 가능
  • 블록화가 되어 있으므로 검색 효율 증가, 적중률도 일정 수준 보장

교체 알고리즘

편집 원본 편집
Data Replacement Algorithm

※ 직접 사상의 경우 교체 알고리즘 선택 불가

  • Random
    • 무작위로 선택하여 교체
    • 비효율적이지만 구현이 간단하여 많이 사용
  • Round Robin
    • 공평하게 돌아가면서 선택
    • 구현이 간단하지만 효율이 좋지 않음
  • LRU(Least Recently Used)
    • 가장 오랫동안 이용되지 않은 데이터 교체
    • 가장 이상적이지만 CPU Cache에서는 판단이 어려움
  • LFU(Least Frequently Used)
    • 참조된 횟수가 가장 적은 데이터 교체
    • LRU 가 마지막으로 쓰인 시점을 보는 것과 다르다. "최근에 가장 적게 사용된" 처럼 시점과 횟수를 섞어 말하면 둘이 구별되지 않으므로, LRU 는 "가장 오랫동안 사용되지 않은", LFU 는 "사용 횟수가 가장 적은" 으로 말한다
  • FIFO(First In First Out)
    • 캐시에 가장 먼저 들어온 데이터 교체. 얼마나 쓰였는지는 보지 않는다
  • LIFO(Last In First Out)
    • 가장 나중에 들어온 데이터 교체. 방금 가져온 블록을 바로 내보내 참조 지역성에 어긋나므로 캐시 교체 정책으로는 거의 쓰지 않는다
  • 운영체제의 페이지 교체도 같은 원리다 → 페이지 교체 알고리즘

캐시는 보통 여러 단계로 둔다. CPU 에 가까울수록 작고 빠르다.

단계 위치 특징
L1 캐시 각 코어 안 가장 빠르고 작다(수십 KB). 명령어 캐시와 데이터 캐시로 나뉜다
L2 캐시 각 코어 안 또는 코어 옆 L1 에서 못 찾은 것을 찾는다(수백 KB~수 MB)
L3 캐시 칩 안, 코어들이 공유 가장 크고 느리다(수 MB~수십 MB)
  • 캐시는 모두 SRAM 으로 만든다
  • L2 캐시를 메인보드의 별도 칩으로 두던 시절에는 캐시용 SRAM 이 시스템 클록과 데이터를 주고받는 방식에 따라 비동기(Asynchronous), 동기(Synchronous) 버스트, 파이프라인 버스트(Pipelined Burst) 방식으로 나뉘었다. 슬롯 방식은 CPU 와 캐시를 카트리지 기판에 얹어 꽂던 CPU 장착 형태(Slot 1)이지 캐시의 동작 방식이 아니다 → SRAM
Write Strategy
  • Write Through
    • 데이터 변경 시 캐시와 메모리에 곧바로 기록
    • 구현이 쉬우며 캐시와 주기억장치 사이의 불일치가 생기지 않음
    • 잦은 쓰기로 속도 느려짐
  • Write Back
    • 캐시에 먼저 기록하고 메모리엔 나중에 기록
    • 속도가 빠르지만 일관성 문제 발생 가능성
      • Dirty Bit, Flag 등 이용 필요
Cache Coherence

멀티코어 프로세서나 대칭형 다중 처리(SMP) 시스템처럼 코어마다 자기 캐시를 갖는 환경에서는 같은 메모리 블록의 복사본이 여러 캐시에 생긴다. 한 코어가 값을 바꿔도 다른 코어의 캐시에는 옛 값이 남아 있으면 잘못된 데이터를 읽게 된다. 이를 막는 것이 캐시 일관성이다. DMA로 입출력 장치가 주기억장치를 직접 바꿀 때도 같은 문제가 생긴다.

위의 쓰기 정책은 한 캐시와 주기억장치 사이의 불일치를 다룰 뿐, 다른 코어 캐시의 복사본 문제는 해결하지 못한다. Write Through를 써도 다른 코어의 캐시에 남은 옛 값은 그대로이므로 별도의 일관성 프로토콜이 필요하다.

구분 스누피 프로토콜(Snoopy) 디렉토리 프로토콜(Directory)
원리 모든 캐시 제어기가 공유 버스를 엿보며(snoop) 다른 캐시의 쓰기를 감지해 자기 복사본을 무효화·갱신 블록마다 어느 캐시가 복사본을 가졌는지 디렉토리에 기록하고, 해당 캐시에만 무효화 메시지 전송
통신 브로드캐스트 점대점(필요한 캐시에만)
확장성 버스 대역폭 한계로 코어 수가 적을 때 적합 코어·소켓이 많은 대규모 시스템(NUMA)에 적합
지연 짧음(버스 한 번) 디렉토리 조회 단계가 추가되어 김
비용 구현 단순 디렉토리 저장 공간과 제어 복잡도

스누피 방식의 대표 구현이 각 캐시 블록을 Modified, Exclusive, Shared, Invalid 네 상태로 관리하는 MESI 프로토콜이다. 자세한 내용은 캐시 일관성 문서를 본다.

설계 시 고려사항

편집 원본 편집
  • 캐시 메모리 사이즈
  • 전송 블록 사이즈
  • 교체 알고리즘