2013-09-04 3 views
0

캐시 일관성 (http://simple.wikipedia.org/wiki/Cache_coherence, What's the point of cache coherency?)을 읽고 있습니다. 그것은 명시된 바와 같이캐시 일관성 및 솔루션

캐시 일관성 문제는 다중 캐시 메모리를 갖는 프로세서에 대해 나타납니다.

제 질문은 단일 프로세서에 여러 개의 캐시가 있습니다. 커널은 페이지 테이블 당 하나의 캐시 라인 만 할당합니다. 그런 다음 캐시 일관성 문제가 발생하는 이유와 해결책은 무엇입니까?

+1

당신이 무엇을 요구하고 있는지 명확하지 않습니다. 귀하의 질문을 다시 할 수 있습니까? – cnicutar

+0

커널은 빠른 액세스를 위해 데이터와 텍스트를 캐시로 복사하고 캐시 메모리에 데이터와 텍스트의 복사본을 하나씩 가지므로 서로 다른 캐시 메모리에 여러 복사본 (데이터 + 텍스트)이 있어야 캐시 일관성 문제가 발생합니다. –

답변

0

캐시의 기능과 제어 방법을 잘못 이해했습니다.

우선 캐시는 직접 프로그래밍 (일반적으로 OS) 제어 하에서 활성화 또는 비활성화되거나 (쓰기 캐시 기능이있는 경우) 플러시 될 수 있습니다. 또한 프로그램은 캐시보다 다음에 필요한 데이터를 더 잘 알고 있기 때문에 프로그램이 특정 영역의 메모리를 미리로드 (읽기)하도록 캐시를 지시 할 수 있습니다.

이 외에도 캐시는 프로세서 코어와 RAM 사이의 고속 버퍼 또는 투명 고속 시스템으로 작동합니다. DDRx RAM 메모리가 장착 된 표준 PC를 사용한다면 DDRx RAM은 프로세서가 사용할 수있는 속도와 가까운 속도로 데이터를 프로세서에 전달할 수 없다는 문제가 있습니다. 같은 방식으로 DDRx RAM은 프로세서가 데이터를 기록 할 수있는 속도에 가까운 어느 곳에서도 쓸 수 없으므로 캐시 버퍼에 데이터가 기록되기 때문에 (선택한 캐시 쓰기 전략 설계에 따라 결정되는 방식).

일반적으로 RAM 메모리 영역에 대한 프로세서 (응용 프로그램) 액세스를 경험하는 캐시는 그 다음에있는 RAM도 액세스하여 캐시 라인에 미리로드한다고 가정합니다. 응용 프로그램이 해당 데이터에 액세스하려고하면 이미 캐시에 있고 프로그램이 더 빨리 실행됩니다. 프로그램에 필요하지 않으면 캐시가 불필요하게로드되어 시간과 메모리 시스템 인터페이스 용량을 낭비하여 나중에 캐시 작업에 영향을 미칠 수 있습니다.

캐시에없는 데이터가 프로세서에 필요한 경우 캐시 미스가 발생합니다. 프로세서는 RAM에서 데이터가 들어올 때까지 트랙에서 멈추어 있습니다. 프로세서가 CPU 클럭 사이클에 아무런 영향을 미치지 않는다는 것을 의미 할 수 있습니다. 정상적인 경우는 30 ~ 100 사이클이라고 가정합니다.

대단히 빠른 응용 프로그램 (대개 고급 컴퓨터 게임의 형태)은 코드 조직 (작고 단단한), 데이터 지역성 (데이터 위치, 데이터 위치 등)을 최대한 활용하지 않으면 빠르지 않을 것입니다. 가능한 한 작고 장소 전체에 퍼지지 않음) 가능할 때마다 미리로드합니다. 높은 수준에서는 좋은 디자인과 알고리즘이 필요하지만 캐시에 어느 정도 묶여 있습니다.

임베디드 프로그래머는 상황이 조금 다릅니다. 대부분의 임베디드 프로세서는 대기 상태가없는 온칩 SRAM 형태의 RAM을 가지고있다. 이것은 SRAM에 대한 읽기 및 쓰기가 프로세서가 원하는만큼 빨리 완료된다는 것을 의미합니다. 즉, SRAM이 속도를 유지하면서 그 트랙에서 멈추지 않아도됩니다.

또한 프로세서에는 SRAM보다 훨씬 느린 온 - 칩 플래시 메모리가 있습니다. 이를 보완하기 위해 칩은 FLASH와 CPU 사이에 읽기 캐시를 가지므로 FLASH로부터의 대부분의 읽기 (읽기 전용이므로)는 프로세서가 데이터 도착을 기다리지 않고 수행됩니다.

임베디드 디자인에는 칩에서 사용할 수있는 것보다 많은 RAM이 필요할 수 있습니다. 이러한 상황에서는 외부 SDRAM 또는 DDRx RAM 칩이 카드에 장착됩니다.이제 외부 RAM에 충분히 빠르게 액세스 할 수없는 PC에 대해 설명한 RAM 상황으로 돌아 왔습니다. 또한 외부 메모리는 일반적으로 32 비트 미만의 데이터 경로로 액세스됩니다. 즉, 32 비트 이상의 데이터 엔티티는 프로세서에 도착하기 전에 두 가지 이상의 물리적 액세스가 필요합니다. 그 동안 프로세서는 대기합니다.

원래 질문으로 돌아 가기. 임베디드 프로세서의 SRAM은 프로세서 또는 주변 장치 (일반적으로 프로세서가 감지 할 수없는 DMA를 사용)에 의해 수정 될 수 있습니다. SRAM은 (속도 때문에) 캐시에 의해 버퍼링되지 않기 때문에 그 내용은 항상 최신입니다. 다른 한편으로는 대기 상태의 RAM을 외부에 장착 한 경우 (프로세서 및 DMA) 쓰기가 제어 된 방식으로 이루어 지도록 동기화 기능 (BIU-Bus 인터페이스 장치라고 함)이 필요합니다. BIU는 속도를 높이기 위해 모든 종류의 속임수를 수행 할 것이지만, 결국 BIU는 캐시가 아니며 프로세서가 기다려야하므로 속도가 느려집니다.

은 _____ 첫 코멘트 _____

캐시 일관성에 대한 대답은 조금 더 복잡보다입니다.

캐시 일관성은 캐시의 특정 RAM 영역을 합리적으로 최신 복사본으로 유지하는 것과 관련이 있습니다. RAM의 위치를 ​​업데이트하는 방법에는 여러 가지가 있습니다. 하나는 대량의 병렬 응용 프로그램에서 공통 메모리 영역을 읽는 동시에 다른 모든 메모리는 공유하지만 동시에 모든 업데이트를하지는 않는 현재 코어의 개수에 달려 있습니다.

코어가 RAM을 업데이트하는 것은 아닙니다. 하드 디스크 컨트롤러가 데이터를 RAM으로 읽도록 명령을 받으면 많은 자율성을 가지고 그렇게합니다. 올바른 디스크 트랙에 헤드를 정렬하고 디스크가 그 위치에 도달 할 때까지 기다린 후 읽기 시작합니다. 디스크에서 도착한 데이터는 RAM에있는 위치로 전송됩니다. 이 작업이 완료되면 컨트롤러는 운영 체제에 인터럽트를 보내 완료 사실을 알립니다.

실제적으로 컨트롤러는 마더 보드의 "주변 지역"을 제어하는 ​​"Southbridge"구성 요소에 있으며 드라이브에서 읽은 데이터를 CPU, 그래픽 컨트롤러와 인터페이스하는 "Northbridge"구성 요소로 보냅니다. 램. 이 설명은 모든 프로세서가 아닌 많은 프로세서에 적용되는 디자인을 보여줍니다 (AMD의 Opteron이 하나임).

그래서 코어는 코어의 실행 속도를 높이기 위해 자체 캐시가 가져온 주소에서 RAM 데이터의 변경 사항을 통보해야합니다. 노스 브릿지는 컨트롤러가 데이터를 쓸 곳을 말합니다. 이 작업을 수행함에 따라 변경 사항이 발생하는 위치의 (일반적으로) L3 캐시에도 알립니다. L3은이를 비교하여 캐시 라인 중 하나가 영향을 받는지 여부를 결정합니다. 또한 L3은 L2에 라인을 점검하고 L1에 라인을 점검하는 사실을 알립니다. 라인이 영향을 받으면 해당 Lx 캐시는 해당 라인을 유효하지 않은 것으로 표시하여 해제합니다.

멀티 코어 프로세서는 일반적으로 Northbridge 및 코어 관련 L2 캐시에 인터페이스하는 단일 일반 L3을 갖습니다. L3은 연결된 L2를 포함하는 모든 사람들에게 업데이트 정보를 보냅니다.

멀티 코어 프로세서, 멀티 프로세서 시스템에서 노스 브리지는 모든 L3에 메모리 업데이트를 알립니다. 코어 중 하나가 RAM 위치를 업데이트하면 L3은 L2의 코어 온칩 형제를 알립니다. Northbridge는 업데이트를 감지하고 설치된 다른 프로세서의 L3을 알려줍니다.

새로 무효화 된 캐시 라인의 데이터가 자주 사용되는 경우 캐시는 새 복사본을 다시로드하기 위해 이동합니다. 즉, L2를 통한 L1이 아니라 L2를 통한 L2 및 L3 및 L2를 통한 충돌입니다.

Northbridge와 캐시가 수행하는 일관성 작업은 중요하고 복잡하며 시간이 많이 걸리는 작업입니다. 복잡하기 때문에 관련 구성 요소의 계층 적 특성으로 인해 RAM 업데이트가 발생하는시기와 영향을받는 구성 요소 (캐시)에 전파되는시기 사이에 대기 시간이 있습니다.

이것은 CPU가 몇주기 동안 무효화 될 캐시에서 데이터를 가져 오는 경우 수행 할 수있는 캐시 일관성에 제한이 있다는 것을 의미합니다. 캐시 일관성은 수용 가능한 일관성과 전체 일관성 사이의 균형이라는 것이 밝혀졌습니다. 왜 전체 일관성을하지 않습니까? 총 일관성은 업데이트가 전파되는 동안 캐시가 실행중인 코어를 중지해야한다는 것을 의미합니다. 결국 캐시 시스템을 배치하기위한 목적을 무효화합니다. 즉, 코어가 RAM에서 데이터를 기다려야하는 것을 최소화해야합니다. .

나는 "훈련 바퀴"유추를 사용합니다 : 자전거에 훈련 바퀴 (총 캐시 일관성)가 있다면 아마도 넘어지지 않을 것이지만 조종 할 수 없기 때문에 매우 빨리 여행 할 수는 없습니다. 훈련 바퀴를 벗으면 조종 할 수 있기 때문에 원하는만큼 빨리 달려 위험을 피할 수 있습니다. 반면에 닦음의 결과는 훨씬 과감합니다.

동기화의 마지막 작은 부분을 처리하는 것은 프로그래머에게 달려 있습니다. 프로그램은 (보통) 코어가 디스크에서 읽은 데이터 블록에 의해 업데이트되는 메모리 위치를 읽도록 허용하지 않습니다. 코어는 언제든지 다른 모든 코어에 영향을주는 공유 메모리 위치에 쓰기가 필요할 수 있습니다. x86에서 이것은 (일반적으로) "xchg reg, mem"명령의 형식을 사용하여 버스 잠금 신호를 어서 트함으로써 준비된다. 이 신호는 모든 사람이 알려진 상태가 필요하기 때문에 자신이하는 일을 끝내야한다는 것을 시스템에 알려줍니다. xchg 명령이 완료되고 결과가 성공적 일 때 (다른 버스 잠금이 진행 중이 아닌 경우) 데이터가 쓰여지고 버스 잠금이 해제됩니다. 나는 그것에 대해 작성했습니다 herehere.

버스 잠금 장치는 사소한 일이 아닙니다. 성공 여부와 상관없이 버스 잠금은 시도하기 위해 막대한 수의 CPU 사이클을 필요로합니다 : 300에서 최대 3000까지입니다. 이것은 전체 캐시 일관성이 없기 때문에 지불하는 가격입니다. 프로그래머가 효율적인 소프트웨어 동기화 계획은 거의 사용하지 않기 때문에 간신히 알아 차릴 수 있습니다. 경험이없는 프로그래머는 안전하고 항상 사용하며 결과 시스템이 느려집니다. 경험을 통해 그녀는 더 지능적인 방법으로 "안전하게 플레이"하는 것이 가능하다는 것을 배우게됩니다.

코어가 자체적으로 L1 및 L2 캐시를 갖는 이유는 서로 다른 데이터 또는 다른 프로그램에서 작동 할 수 있기 때문입니다. 동일한 작업을하는 경우 공통 캐시에서 읽기를 시도 할 때 충돌합니다. L3은 코어의 공통 캐시이며 충돌하는 곳입니다. 그들이 그렇게하기 전에 그들은 (유용하게도) L1과 L2에서 유용하고 방해받지 않고 방해받지 않는 많은 작업을 할 수있었습니다. 프로그래머에 달려 있기 때문에 "희망"이라고 말합니다.

+0

그건 단지 캐시 작동 및 장점에 대한, 그 캐시 일관성을 여러 캐시 라인 (그것은 하나 또는 여러 개의 프로세서가 별도의 캐시 메모리가 가능합니다)에서 발생 읽기,하지만 혼란, 왜 동일한 프로세스 (텍스트 + 데이터)는 여러 캐시 메모리에 상주합니까? –

1

프로세스 내에서 여러 개의 스레드 및 인터럽트 핸들러가있을 수 있습니다. 그런 다음 CPU는 단일 메모리 주소 값을 별도의 캐시에 보관할 수 있습니다. 또한 외부 모듈과 드라이버는 자신의 캐시 된 값으로 해당 메모리 리소스를 공유 할 수 있습니다. 이러한 맥락에서, 캐시 일관성 문제가 발생합니다.