캐시 메모리
캐시 메모리는 CPU 에서 메모리를 참조할때의 병목을 줄이기 위해 사용되는 SRAM 기반의 메모리 (속도가 느린장치와 빠른 장치의 병목을 해결하기 위해, 웹 서비스에서도 사용되는 개념임)
ex1) CPU 코어와 메모리 사이의 병목 현상 완화
ex2) 웹 브라우저 캐시파일은, 하드디스크와 웹페이지 사이의 병목 현상을 완화
빠른 Access 속도를 얻을 수 있지만, 용량이 적고 비용이 비싸다는 단점이 존재함
CPU 는 L1, L2, L3 캐시를 사용하고 속도와 크기에 따라서 이를 구분함 일반적으로 L1캐시부터 사용됨
듀얼 코어 프로세서에서의 캐시 메모리
- 각 코어마다 독립된 L1 캐시 메모리를 가지고, 두 코어가 공유하는 L2캐시 메모리가 내장됨
- 만약 L1 캐시가 128KB면 NKB, MKB 씩 나눠서 저장
- I-Cache : 프로그램에서 사용되는 명령어 저장 (보통 시간지역성이 높음)
- D-Cache: 프로그램에서 사용되는 데이터 저장 (보통 공간지역성을 우선적으로 고려하고 시간 지역성도 고려함)
캐시 메모리 지역성
- 공간 지역성
- 근처의 메모리가 다시 참조될 확률을 이용한 특성
- ex) A[0], A[1] 과 같은 배열 데이에 Sequeuntial 하게 접근하는 경우
- 시간 지역성
- 최근에 참조된 메모리를 다시 참조할 가능성이 높은 것
- ex) for 나 while 문
캐시 미스
Cold start Miss
- 프로그램이 처음 실행될 때 발생, 데이터나 명령어를 찾기 위해 캐시 메모리에 접근할 때 해당 명령어 혹은 데이터를 찾을 수 없을 경우 발생함
- 해결방법: (pre-fetching) 기법을 사용해 미리 데이터를 캐시에 로드할 수 있지만 완전히 해결할 수 없음
Capacity Miss
- 캐시 용량이 부족하여 발생하는 미스, 프로그램이 사용하는 명령어나 데이터의 크기가 캐시의 용량을 초과 할때 발생함
- 캐시의 크기를 늘리는것이 하나의 해결책이 될 수 있음. 그러나 물리적인 한계와 비용문제가 있으므로 효율적인 캐시 관리 정책이 필요함
Conflict Miss
- 특정 캐시 라인이나 셋에 여러 데이터가 동시에 매핑되려고 할 때 발생함. 이는 직접 매핑 (Directed-Mapped) 캐시나 세트 연관 (Set-Associative) 캐시에서 주로 발생함
- 캐시의 매핑 함수를 개선하는 것으로 Conflict를 줄일 수 있음 Fully Associative 방식은 충돌 미스를 최소화 하지만 구현 복잡도가 증가함
캐시 매핑
직접 매핑 (Direct Mapping)
메모리와 캐시의 순서를 일치 시킴 예를들어 메모리가 1~100까지 있고 캐시가 1~10까지의 공간이 있으면 1~10 까지는 캐시의 1번째, 11~20까지는 캐시의 2번째로 매치 시키는 방식 하지만 캐시의 효율성이 떨어짐 예를들어 1~10까지의 메모리를 캐시의 1에 저장할때 계속 캐시 교체가 일어나야 하기 때문임
연관 매핑 (Associative Mapping)
메모리와 캐시의 매핑 순서를 일치 시키지 않음 필요한 메모리의 값을 캐시의 어디든 편하게 저장할 수 있음. 당연히 찾는 과정은 복잡하고 느림 하지만 적중률은 높음
직접 연관 매핑 (Set Associative Mapping)
연관 매핑에 직접매핑을 합쳐놓은 방식. 순서를 일치시키고 편하게 저장하되, 일정 그룹을 두어 그룹 내에서 편하게 저장하는 방식. 예를들어 메모리가 1~100까지 존재하고 캐시가 1~10까지 있다면 1~5는 캐시의 1~50 데이터를 무작위로 저장하는 것
E-Associative Set
각 세트마다 라인이 E 개 존재하는 경우
만약 세트마다 라인이 1개 존재하면 Direct Mapping 과 동일하다.
캐시 사이즈와 블록의 크기, E와의 관계
E-Associative-set 방식에서 E를 늘리면 공간이 많이 확보됨으로 Miss Rate는 줄일 수 있지만 탐색해야 하는 캐시의 공간이 늘어남으로 Hit Rate 는 증가하게 될 것임
Hit Time 이 중요한 곳에는 E 의 크기를 줄이고, Miss Rate 이 중요한 곳에는 E의 크기를 늘리면 최적화 된다.
캐시 읽기 동작
- s 비트 영역을 통해 세트 이동
- tag 를 비교하고 line 이동
- valid bit 유효성 체크 (Cache hit)
- Cache miss 인 경우 메인 메모리를 거쳐서 데이터를 가져옴
- 이때 데이터를 캐시 영역에 저장할때 해당 세트에 유휴 공간이 존재하지 않을 경우 기존의 블록을 비워야함 (tag bit와 set bit가 동일할경우)
- Random 정책, LRU 정책, LFU 정책 등이 있음
- 이때 데이터를 캐시 영역에 저장할때 해당 세트에 유휴 공간이 존재하지 않을 경우 기존의 블록을 비워야함 (tag bit와 set bit가 동일할경우)
캐시 쓰기 정책
Cache hit 인 경우
Write-through 정책
캐시 데이터에 반영하고, 바로 메인 메모리에도 반영한다, 데이터 일관성이 보장되지만 버스 병목현상이 존재한다.
Write-back 정책
일단 캐시만 수정하고 나중에 Replacement 될때 메인 메모리에 반영한다 (Lazy update 방식), 메인 메모리에 쓰기 동작을 최소화하기 때문에 속도 측면에서 이득이 있지만 메인 메모리에 반영해야 한다는 추가 정보 비트가 필요함 => 캐시와 메인 메모리간 일관성 이슈가 있기 때문에 캐시 일관성 프로토콜이 사용됨
Cache miss 인 경우
Write allocate 정책
메인 메모리의 블록을 수정한다음에 캐시로 Fetch 하는 방식, 자주 참조되는 메모리면 해당 전략이 좋을 것임
No-Write allocate 정책
메인 메모리의 블록만 수정하는 정책, 따로 캐시에 반영하지 않음
캐시 성능 요소 3가지
- Cache Hit Ratio: 캐시 힛 / (캐시 미스 + 캐시 힛)
- Hit Time: 캐시 라인의 데이터를 CPU 로 가져오는 시간
- Miss Penalty: 캐시 미스로 메인 메모리에서 블록을 캐시 라인에 가져오는 시간
참고
'컴퓨터구조' 카테고리의 다른 글
[컴퓨터구조] - 시스템 버스 (0) | 2024.02.02 |
---|---|
[컴퓨터구조] - 컴파일러 (1) | 2024.01.24 |
[컴퓨터구조] - CPU 구조 및 연산 동작과정 (0) | 2024.01.24 |
[컴퓨터구조] - 개요 ~ Address mode (0) | 2024.01.22 |