멀티 코어 CPU, 캐싱, 캐시 일관성 및 메모리 작동 방식을 배우기 시작하면 처음에는 약간 혼란스러워 보일 수 있습니다. 이를 염두에두고 오늘의 수퍼 유저 Q & A 게시물에는 궁금한 독자의 질문에 대한 답변이 있습니다.
오늘의 질문 및 답변 세션은 커뮤니티 중심의 Q & A 웹 사이트 그룹 인 Stack Exchange의 하위 부문 인 SuperUser에 의해 제공됩니다.
질문
수퍼 유저 리더 CarmeloS는 CPU 캐시가 메인 메모리로 플러시되는 시점을 알고 싶어합니다.
두 개의 코어가있는 CPU가 있고 각 코어에 자체 L1 캐시가있는 경우 Core1과 Core2가 동시에 동일한 메모리 부분을 캐시 할 수 있습니까? 가능하다면 Core1과 Core2가 캐시에서 값을 편집 한 경우 주 메모리의 값은 무엇입니까?
CPU 캐시는 언제 주 메모리로 플러시됩니까?
대답
수퍼 유저 기고자 David Schwartz, sleske 및 Kimberly W가 이에 대한 답을 제공합니다. 우선 David Schwartz는
두 개의 코어가있는 CPU가 있고 각 코어에 자체 L1 캐시가있는 경우 Core1과 Core2가 동시에 동일한 메모리 부분을 캐시 할 수 있습니까?
그렇지 않은 경우 성능이 끔찍합니다. 동일한 코드를 실행하는 두 개의 스레드를 고려하십시오. 두 L1 캐시 모두에서 해당 코드를 원합니다.
가능하다면 Core1과 Core2가 캐시에서 값을 편집 한 경우 주 메모리의 값은 무엇입니까?
이전 값은 주 메모리에 있으며 코어가 읽지 않기 때문에 중요하지 않습니다. 캐시에서 수정 된 값을 꺼내기 전에 메모리에 기록해야합니다. 일반적으로 MESI 프로토콜의 일부 변형이 사용됩니다. 기존의 MESI 구현에서 한 캐시에서 값이 수정되면 같은 레벨의 다른 캐시에 전혀 존재할 수 없습니다.
sleske의 답변이 이어집니다.
예, 두 개의 캐시가 동일한 메모리 영역을 캐시하도록하면 실제로 발생할 수있는 문제입니다. 예를 들어 다양한 솔루션이 있습니다.
- 두 캐시는 동의하지 않기 위해 통신 할 수 있습니다.
- 모든 캐시를 모니터링하고 그에 따라 업데이트하는 일종의 감독자가있을 수 있습니다.
- 각 프로세서는 캐시 된 메모리 영역을 모니터링하고 쓰기를 감지하면 (현재 유효하지 않은) 캐시를 버립니다.
이 문제를 캐시 일관성이라고하며이 주제에 대한 Wikipedia 기사에는 문제 및 가능한 솔루션에 대한 훌륭한 개요가 있습니다.
Kimberly W의 최종 답변 :
게시물 제목의 질문에 답변하려면 캐싱 프로토콜이 무엇인지에 따라 다릅니다. 다시 쓰기 인 경우, 캐시 제어기가 선택 공간이 없을 때만 캐시를 기본 메모리로 플러시합니다. 이미 채워진 공간에 새 캐시 블록을 넣습니다. 이전에 공간을 차지한 블록이 제거되고 해당 값이 주 메모리에 다시 기록됩니다.
다른 프로토콜은 연속 기입입니다. 이 경우 캐시 블록이 레벨에 작성 될 때마다 엔레벨의 해당 블록 n + 1 업데이트됩니다. 개념 상 아래에 탄소 종이로 양식을 채우는 것과 유사합니다. 위에 쓴 내용은 아래 시트에 복사됩니다. 쓰기 작업이 더 많이 필요하기 때문에 속도가 느리지 만 캐시 간의 값은 더 일관됩니다. 후기 입 방식에서는 최상위 레벨 캐시 만이 특정 메모리 블록에 대한 최신 값을 갖습니다.
설명에 추가 할 것이 있습니까? 주석에서 소리를냅니다. 기술에 정통한 다른 Stack Exchange 사용자의 답변을 더 원하십니까? 여기에서 전체 토론 스레드를 확인하십시오.
이미지 크레디트 : Lemsipmatt (Flickr)