편집 요약 없음 |
편집 요약 없음 |
||
2번째 줄: | 2번째 줄: | ||
[[분류: 스토리지]] | [[분류: 스토리지]] | ||
[[분류: CPU]] | [[분류: CPU]] | ||
== 개요 == | == 개요 == |
2023년 2월 5일 (일) 08:44 기준 최신판
개요
캐시란 메모리의 여러 단계에서 중간에 버퍼를 삽입하여 하위 계층과의 속도차이에 의한 Bottle neck를 막으려는 기술이다. 캐싱시스템을 사용할때, 항상 주의 해야 하는 것은 Synchronization 문제이다. 예를 들어서 현대 컴퓨터 시스템은 Multicore 환경에서 작동한다. 이때 각각의 코어는 서로 분리된 L1, L2코어를 가지고 공유된 L3캐시를 가지게 된다(이 구조는 CPU마다 다르다). 특히 여기서 각각의 코어가 분리된 캐시를 가지고 있기 때문에, 캐쉬에 카피한 데이터는 다른 프로세스에는 보이지 않는다. 따라서 만약 서로 다른 코어가 같은 메모리 영역에 접근하고 있으면 한 코어가 캐시에 데이터를 작성할시, 다른 CPU에 존재하는 캐시도 업데이트 하여야 한다.
현재 대부분의 CPU들은 많은 코어수로 인하여 directory-based 방식의 cache coherent 방식을 취하고 있다. 또한 Directory based방식도 일정 개수의 코어 이상이 되면 contention이 발생한다. 따라서 Multiprocessor환경에서 어떻게 소프트웨어적으로 이러한 일들을 해결할까 하는 고민들이 많은 연구로 구현되고 있다.
Cache coherece
일관성이란 공유된 데이터에 대해서 서로 다른 접근이 같은 결과를 내보내야 한다는 것을 의미한다. 위에 설명한 것 처럼 각각의 코어는 캐쉬 일관성을 서로 지켜주어야 한다. CPU에서 캐쉬 일관성은 다음 두개의 조건을 만족하여야 한다.
- Write Propagation: 캐쉬에 새롭게 작성한 데이터는 다른 캐쉬의 같은 cache line에 전송되어야 한다.
- Transaction Serialization: Single memory location에 작성한 순서는 다른 코어들끼리도 일치해야 한다.
Cache coherency protocols
이러한 일관성을 유지하기 위해서 CPU는 두개의 유명한 알고리즘을 통해서 캐시를 관리한다. Snooping은 빠르지만, scalability가 떨어진다는 단점이 있다. Directories관점에서는 느리지만 scalability가 좋다는 장점을 가지고 있다.
Snooping
스투핑이란 말에서도 들어나듯이 snooping은 메모리 Access를 감지하여 공유된 캐시라인을 업데이트 하는 방식을 말한다. snoop controller가 항상 버스를 감지하면서 다른 CPU가 Memory access를 하는지 감시하고 만약 자신의 코어에 대한 메모리에 Access가 있다면, 그에 해당하는 캐시 라인을 업데이트하는 방식으로 캐시 블록 상태를 조절한다. Write through라면 상관 없지만, write back상태에서는 데이터에 대한 변경이 그 코어의 캐시에만 반영되기 때문에 다른 스누프 컨트롤러에 통보해야 한다. 이를 위해서 MESI 프로토콜을 활용하여 캐시를 관리한다.
Directory-based
주기억 장치(램)에다가 캐시에 대한 전역 상태 정보를 저장하게 한다. 후에 중앙 제어기에 쿼리를 날려서 현재 캐시가 어떤 CPU에 사용하는지 확인하고 그 캐시만 disable시키면 되는 것이다. 이 방식은 주 기억장치와 캐시에 대한 병목과 오버헤드를 가지지만 대규모 시스템에서는 효과적으로 사용할 수 있다.
Write Through
캐쉬에 의한 변화는 바로 저장장치에 반영된다.
Write Back
캐쉬에 의한 변화는 저장되었다가 캐쉬 블럭이 교체될때 스토리지에 반영된다.