siino's 개발톡

캐시 메모리 파헤치기 본문

운영체제

캐시 메모리 파헤치기

siino 2024. 1. 23. 21:16

컴퓨터에 대해서 많이 듣고 접하면서 또는 프로젝트를 진행하면서 캐시(cache)라는 말을 많이 접하셨을겁니다.

이번 기회에 캐시 메모리에 대해서 자세하게 알아봅시다.

 

메모리 계층구조

우선 우리의 컴퓨터는 메모리 계층 구조(Memory hierchical)에 따라 구성이 되어 있는데요,

메모리 계층 구조의 기본 개념은 "처리 / 접근속도가 빠른 메모리일 수록 가격이 비싸고 용량이 작다"라는 개념입니다.

컴퓨터의 메모리 구성을 보면

CPU 레지스터 > 캐시 메모리 > 메인 메모리 > 보조 메모리 순으로  속도가 빠르지만 용량이 작고 가격이 비싸다. 라는 점을 짚고 넘어가야합니다.

 

이번 글의 주제는 "캐시 메모리"이므로 캐시메모리에 대해서 집중적으로 공부해봅시다.

 

캐시메모리는 L1, L2, L3캐시로 나눌 수 있는데, level에 따라 숫자가 작을 수록 CPU와 가깝고 크기가 작습니다.

L1캐시와 L2캐시는 CPU내부에 위치하고 있고, L3캐시는 CPU외부에 위치하고 있습니다.

 

캐시에 많은 데이터를 담아 CPU의 처리속도를 올리는 것은 좋지만 Load할 수 있는 용량이 정해져있기 때문에 최대한 캐시 적중률을 높여 성능을 향상시켜야 합니다.

 

Cache Hit

CPU가 참조하려는 데이터가 캐시 메모리에 있을때를 의미합니다.

Cache Miss

CPU가 참조하려는 데이터가 캐시 메모리에 없을 때 발생합니다.

 

1) Compulsory Miss

특정 데이터에 처음 접근할 때 발생하는 cache miss

 

2) Capacity Miss 

캐시 메모리의 공간이 부족해서 발생하는 cache miss

 

3) Conflict Miss

캐시 메모리에 A와 B 데이터를 저장해야 하는데, A와 B가 같은 캐시 메모리 주소에 할당되어 있어서 발생하는 cache miss이다. direct mapped cache에서 많이 발생

간단하게 개념을 알아보았는데요,

Cache Hit을 높이기 위해서는 캐시에 어떤 데이터를 어떻게 올려야할까요?

 

What, 어떤 데이터? - 참조 지역성과 캐시 교체 알고리즘

캐시의 지역성은 공간 지역성(Spatial Locality)시간 지역성(Temporal Locality)으로 나뉜다. 

  • 공간 지역성 : 최근에 사용했던 데이터와 인접한 데이터가 참조될 가능성이 높다는 특성(ex. Array)
  • 시간 지역성 : 최근에 사용했던 데이터가 재참조될 가능성이 높은 특성(ex. for, while 문)

캐시 교체 알고리즘

LRU, LFU, FIFO

 

캐시메모리에 대해 조금 더 자세히 알아봅시다.

우리가 사용하는 캐시메모리는 당연하게도 메인메모리보다 속도는 빠르지만 크기는 작습니다. 

그럼 CPU에서 작업을 처리할때 메인메모리의 공간과 캐시 메모리의 공간이 1:1로 mapping이 불가능한 상황에서 어떻게 메인메모리의 적재된 값을 캐시에서 찾을 수 있을까요?

 

캐시 라인(Cache Line)

캐시메모리 내의 데이터 관리는 Cache Line으로 구성되어 이루어집니다.

캐시 라인은 캐시 메모리 내에서 데이터를 저장하고 접근하는 기본단위입니다.

 

캐시 메모리는 이러한 캐시라인들로 구성되고, 캐시라인의 구성은 아래와 같습니다.

데이터 블록: 메인 메모리에서 가져온 연속된 데이터 일부

태그: 캐시라인이 메모리의 어느 부분에 해당하는지 나타내는 정보

제어 정보: 유효비트, 더티비트, 접근기록등 캐시라인의 전반적인 상태를 나타내는 정보

유효비트는 데이터의 유효여부, 더티비트는 데이터가 변경되었는지의 여부를 나타냅니다.

 

따라서, 캐시는 큰 메인 메모리 상의 연속된 주소(뭉텅이)를 하나의 캐시라인으로 만들고 내부 데이터 블록에 필요한 데이터를 담아 관리합니다.

 

정리하면, 

CPU(코어)는 작업을 처리하기 위해 메모리의 데이터가 필요할때,

1차적으로 캐시메모리 내의 캐시 라인의 태그를 통해 필요한 데이터가 캐시 메모리 내에 있는지 확인하고,

해당 태그가 존재하고 유효비트가 1이라면 해당 값을 통해 작업을 진행하고, (Cache Hit!)

해당 태그가 없거나 유효비트가 0이라면 Cache Miss로 메인 메모리에 접근해야합니다.

Cache Line이 사용하는 매핑방식

1. 직접매핑 (Direct Mapping)

메인 메모리를 일정한 크기의 블록으로 나누어 각각의 블록을 정해진 캐시라인에 매핑하는 방식입니다.

가장 간단하고 구현도 쉽지만, 메모리의 여러 블록이 같은 캐시 라인에 매핑될 수 있으므로, 캐시 충돌이 발생할 수 있습니다.

 

2. 연관 매핑( Full Associative Mapping)

캐시 메모리의 빈 공간에 마음대로 주소를 저장하는 방식입니다.

저장하는 것은 매우 간단하지만, 원하는 데이터가 있는지 찾기 위해서는 모든 태그를 병렬적으로 검사해야 하기 때문에 더 많은 검색 시간이 소요될 수 있습니다.

 

3. 집합 연관 매핑 (Set Associative Mapping)

Direct Mapping과 Full Associative Mapping의 장점을 결합한 방식입니다.

메모리 값이 저장될 큰 구역은 나누어 놓고, 그 안에서는 어느 위치에나 저장할 수 있는 방식입니다.

따라서 검색시, 해당 구역의 데이터만 검색하면 된다는 장점이 있습니다.

  검색 속도 저장 속도
직접 매핑 빠름 느림
연관 매핑 느림 빠름
집합 연관 매핑 중간 중간

만약 캐시의 데이터를 write할 시에는 어떻게 할까요?

Write through

CPU에서 메모리에 쓰기 요청을 할때마다 캐시의 내용과 메인 메모리의 내용을 같이 바꾸는 방식입니다.

단순하지만, 데이터에 대한 쓰기 요청을 할 때마다 항상 메인 메모리에 접근해야 하므로 캐시에 의한 접근 시간의 개선이 없어지게 되며 쓰기 요청시, 주 메모리의 접근 시간과 같게 되는 단점이 있습니다.

하지만 쓰기 작업은 통계적으로 10~ 15%정도에 불과하고 구조가 단순하여 많이 사용되는 방식이라고 합니다.

Write back

CPU에서 메모리에 대한 쓰기작업 요청시 캐시에서만 쓰기 작업을 하고 그 변경 사실을 확인할 수 있는 표시를 하여 캐시로부터 해당 블록의 내용이 제거될 때 그 블록을 메인 메모리에 복사함으로써 메인 메모리와 캐시의 내용을 동일하게 유지하는 방식입니다.

 

그럼 멀티코어 시스템에서 각 코어별로 자체 캐시를 갖는데,

데이터의 불일치가 발생할 수 있는것이 아닌가??

위와 같은 물음을 갖고 있었는데 MESI라는 프로토콜을 사용하여 캐시의 일관성을 보장한다고 합니다.

MESI는 (Modified, Exclusive, Shared, Invalid)라는 상태로 각 캐시라인을 관리합니다.

 

1. Modified

  • 현재 코어에 의해 수정되었고 메모리의 내용과 다르다.
  • 현재 코어만 갖고 있는 캐시라인

2. Exclusive

  • 이 데이터를 Modify로 변경하여 수정가능
  • 현재 코어만 갖고 있는 캐시라인

3. Shared

  • 읽기전용
  • 다른 코어에도 존재하는 캐시라인
  • 다른 코어가 이 데이터를 수정하려할 때, Invalid상태로 전환됨

4. Invalid

  • 캐시라인의 데이터가 무효화 되었음.
  • 다른 코어가 데이터를 수정했을 때 발생, 이 캐시라인은 사용할 수 없음.

예시

 

정리.

이와 같이 MESI프로토콜은 캐시 일관성을 유지하면서 멀티코어 프로세서의 성능을 최적화하는데 중요한 역할을 합니다. 여러 코어가 효율적으로 데이터를 공유하며, 필요한 경우에만 메모리에 접근하여 성능 저하를 최소화합니다.

 

 

 

'운영체제' 카테고리의 다른 글

Paging과 Segmentation  (0) 2024.01.24