CPU 캐시는 언제 주 메모리로 다시 플러시됩니까?

CPU 캐시는 언제 주 메모리로 다시 플러시됩니까?

2개의 코어가 있는 CPU가 있고 각 코어에 자체 L1 캐시가 있는 경우 Core1과 Core2가 동시에 동일한 메모리 부분을 캐시할 수 있습니까?
가능하다면 Core1과 Core2 모두 캐시에서 해당 값을 편집한 경우 주 메모리의 값은 어떻게 될까요?

답변1

2개의 코어가 있는 CPU가 있고 각 코어에 자체 L1 캐시가 있는 경우 Core1과 Core2가 동시에 동일한 메모리 부분을 캐시할 수 있습니까?

예. 그렇지 않으면 성능이 끔찍할 것입니다. 동일한 코드를 실행하는 두 개의 스레드를 고려하십시오. 두 L1 캐시 모두에 해당 코드가 필요합니다.

가능하다면 Core1과 Core2 모두 캐시에서 해당 값을 편집한 경우 주 메모리의 값은 어떻게 될까요?

이전 값은 메인 메모리에 남게 되며 어느 CPU도 이를 읽지 않으므로 중요하지 않습니다. 수정된 값을 캐시에서 꺼내기 전에 메모리에 기록해야 합니다. 일반적으로MESI 프로토콜사용. MESI의 기존 구현에서는 한 캐시에서 값이 수정되면 동일한 수준의 다른 캐시에는 전혀 존재할 수 없습니다.

답변2

예, 두 개의 캐시가 동일한 메모리 영역을 캐시하는 경우 이런 일이 발생할 수 있습니다. 실제로 실제로 많이 발생하는 문제입니다. 예를 들어 다양한 솔루션이 있습니다.

  • 두 캐시는 서로 동의하지 않는지 확인하기 위해 통신할 수 있습니다.
  • 모든 캐시를 모니터링하고 그에 따라 업데이트하는 일종의 감독자를 둘 수 있습니다.
  • 각 프로세서는 캐시된 메모리 영역을 모니터링하고 쓰기를 감지하면 해당(현재 유효하지 않은) 캐시를 폐기합니다.

문제는캐시 일관성. 그만큼주제에 관한 Wikipedia 기사문제와 가능한 해결책에 대한 좋은 개요가 있습니다.

답변3

제목의 질문에 대답하려면 캐싱 프로토콜이 무엇인지에 따라 다릅니다. 다시 쓰기인 경우 캐시 컨트롤러가 이미 점유된 공간에 새 캐시 블록을 배치할 수밖에 없는 경우에만 캐시가 주 메모리로 다시 플러시됩니다. 이전에 공간을 차지했던 블록은 제거되고 그 값은 주 메모리에 다시 기록됩니다.

다른 프로토콜은 연속 기입입니다. 이 경우 캐시 블록이 레벨 n에 기록될 때마다 레벨(n+1)의 해당 블록이 업데이트됩니다. (아래에 카본지로 양식을 채우는 개념과 유사합니다. 위에 쓴 내용은 아래 시트에 복사됩니다.) 분명히 더 많은 쓰기 작업이 필요하기 때문에 속도가 느리지만 캐시 간의 값은 더 일관됩니다. 후기입 방식에서는 최고 수준의 캐시만 특정 메모리 블록에 대한 최신 값을 갖습니다.

관련 정보