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