Write 관련 캐시 이슈

mydailylogs
|2022. 11. 29. 00:58

앞에서 살펴본 것처럼 읽기에 관한 캐시의 동작은 단순하다.

먼저 원하는 워드 w의 사본을 캐시에서 찾는다. 만일 hit이 발생하면 w를 즉시 리턴한다. 만일 미스가 발생하면, 메모리 계층 구조의 다음 하위 레벨에서 w를 포함하고 있는 블록을 선입(이 경우 유효한 라인 하나를 희생해야 할 수도 있다)해서 이 블록을 같은 캐시 라인에 저장하고 w를 리턴한다. 

쓰기는 상황이 좀더 복잡하다. 이미 캐시에 들어 있는 (쓰기 적중write hit) 워드 w에 새로운 데이터를 쓰려고(Write) 한다고 가정하자.

특정 레벨에 위치한 캐시의 w에 대한 자신의 사본이 갱신되었다면, 계층구조의 다음 하위 레벨에 있는 w의 사본도 갱신이 되어야 한다.

Write-through라고 알려진 가장 간단한 방법은 업데이트가 발생하는 즉시, 캐시의 변경과 함께 w의 캐시 블록 전체를 다음 하위 레벨로 써주는 것이다. 간단하기는 하지만 Write-through 방법은 매 쓰기 작업마다 하위 레벨로의 버스 트래픽을 발생시킨다는 단점이 있다. 이 경우에는 데이터에 업데이트가 발생하면 모든 저장장치로 전파되기 때문에 항상 모든 레벨에서 최신 데이터에 접근할 수 있게 된다. (write data immediately to memory)

Write-back이라고 알려진 또 다른 방법은 갱신을 가능한 한 지연시켜서, 이 블록이 블록 교체 알고리즘에 의해 캐시에서 축출될 때에만 갱신된 블록을 하위레벨에 써준다. 지역성으로 인해 write-back은 버스 트래픽을 상당히 줄일 수 있지만, 좀더 복잡하다는 단점이 있다. 이 경우에는 각 저장 장치에 위치한 데이터들이 최신 상태의 데이터인지 알 수가 없다. 때문에 캐시는 캐시 블록이 수정되었는지 여부를 나타내는 dirty bit를 각 라인마다 추가로 유지하여야 한다는 단점이 있다.. (check dirty-bit and defer the write until replacement)

또 한가지 이슈는 쓰기 미스write miss들을 어떻게 다루는지이다. 쓰기 미스를 짧게 설명하자면 다음과 같다.

캐시에 쓰려고 할 때 블록을 쓰려는 전체 메모리 주소(A)가 있을 것이다. 캐시를 사용하기 앞서서 먼저 메모리 주소에서 캐시 인덱스를 계산하고 이는 캐시 집합의 위치를 알려주는 용도로 사용된다. 그 다음으로는 해당 메모리 주소의 Tag bits를 계산한다. Tag bit는 해당 블록을 식별할 수 있는 일종의 ID로서 활용된다.

여기서부터는 읽기 동작과 동일하다. 캐시 인덱스를 통해 특정 캐시 집합에 접근한 이후, Tag bits와 Valid bit를 활용하여 쓰고자 하는 블록의 태그와 캐시의 태그가 일치하는지 여부를 Valid bit와 함께 판단한다. 만약 이때, Tag bits가 맞지 않거나 Valid bit가 0이 된다면 '쓰기 미스'가 발생했다고 볼 수 있다.

쓰기 미스를 다루는 첫 번째 방법은 Write-allocate이다. 해당 방법은 해당 블록을 다음 하위 레벨에서 캐시로 가져오고 난 이후 캐시 블록을 갱신한다. Write-allocate는 쓰기 공간의 지역성을 활용하지만, 모든 미스들은 다음 하위 레벨에서 캐시로의 블록 전송을 발생시키기 때문에 연속된 캐시 갱신을 위해 버스 트래픽이 발생한다.

쓰기 미스를 다루는 두 번째 방법은 No-write-allocate이다. 해당 방법에서는 캐시를 통과하고 워드를 직접 다음 하위 레벨 저장 장치에 써준다. Write-through 캐시는 전형적인 no-write-allocate라고 볼 수 있다. Write back 캐시는 대개 write-allocate 방식이다.

어느 정도 수준의 캐시 친화적 프로그램을 작성하려는 프로그래머들에게는 write back && write allocate 조합을 추천한다. 이렇게 제안하는 이유는 다음과 같다.

규칙으로 , 메모리 계층 구조의 하위 레벨이 있는 캐시는 더 긴 전송 시간 때문에 write through 대신에 write-back을 사용할 가능성이 좀더 높다. 예를 들어 가상 메모리(swap을 활용하는) 시스템은 write back을 사용한다. 그러나 로직의 밀도가 증가함에 따라 write-back의 증가된 복잡도는 이전보다 작은 장애물이 되어, 현대의 시스템에서는 모든 수준에서 Write-back && Write-allocate를 볼 수 있다.

 

'CS' 카테고리의 다른 글

캐시 성능 지표  (0) 2022.11.29
실제 캐시 계층 구조의 해부  (0) 2022.11.29
Set Associative Cache (집합결합성 캐시)  (0) 2022.11.28
Directed Mapped Cache (직접매핑 캐시)  (0) 2022.11.28
기본 cache memory 구조  (0) 2022.11.28