본문 바로가기
임베디드SW/Embedded SW 상식

[임베디드] 메모리 스크러빙 (Memory Scrubbing)

by 진뚱 2022. 9. 1.
728x90


임베디드 쪽 공부를 하다보니 DRAM Scrub 이라는 동작이 있었는데, 이 스크러빙이라는 동작이 어떤 것인지 정확히 몰랐다.
그래서 오늘은 메모리 스크럽에 관해서 끄적여보자.

메모리 스크러빙(Memory Scrubbing)은 간단하게 설명하면 Error Correction을 하기 위한 기술이다.
메모리 스크러빙 방식에는 여러가지가 있지만, 일반적으로 말하는 방법은
특정 메모리 값에 쓰여져 있는 값이 잘못 된 값이 있는지 확인 후 ECC(Error Correction Code)를 통해서 bit error를 수정하고 수정된 데이터를 동일한 위치에 다시 write 하는 작업을 수행하게 된다.

근데 멀쩡한 메모리에서 왜 에러를 수정해야하는 일이 발생했을까?
메모리의 경우에는 전자의 값을 통해서 0인지 1인지 구분을 하는 것으로 값을 정의할 수 있다. 그런데 이 값이 달라질 수 있다.

하지만 일반적으로 자연 현상에 의해서 메모리에 적혀있는 값이 변할 가능성은 매우 매우 작은 편이다.
1개의 bit 가 자연스럽게 변하게 될 확률 자체는 매우 작은 편이지만 최근에는 메모리 크기 자체가 엄청나게 방대해지면서 오류가 발생할 확률이 매우 높아지고 있다.

따라서 자연스럽게 bit단위의 에러가 발생하게 되고, 이것을 다시 원래대로 돌려줄 수 있는 기술이 필요했다. 이것을 ECC를 이용하여 복구하는 것이다.
ECC의 경우는 특정 크기별로 Parity를 통해 바뀐 bit가 있는지를 체크하는 기법인데, 자세한 것은 다른 글에서 추가로 다루어보도록 하고
여기서의 핵심은 메모리 스크러빙이 필요한 이유였다.

근데 사실 여기까지 읽어도 잘 이해가 안되는 사람들이 더 많을 것이다.
그리고 이게 왜 필요한지 조금 추상적으로 적혀있기 떄문에 이해되지 않는 경우가 있을 것 같다.
그래서 간단한 예제를 준비했다.

예를 들어 0번지 에 FFFF 라는 값이 있어야하는데, 실제로는 에러가 발생해서 FFF7 라는 값으로 변경되어 있는 상태라고 하자.
이때 만약 Memory Scrubbing 이 되지 않은 상태로 Read 를 수행하게 되면 FFFF 를 기대했지만 실제로는 FFF7 이 읽히기 때문에 Uncorrectable Error 가 발생하게 된다.
따라서 Memory Scrubbing을 진행하여 현재 FFF7로 바뀌어있는 상태를 ECC를 통해 인지하게 되고, Parity를 통해서 다시 원래 FFFF로 변경하여 Write를 진행해준다.
그렇게 Memory Read 가 일어나기 전에 Scrubbing을 진행해줌으로써 Data가 정상 값으로 유지될 수 있도록 하는 것이다.

나중에 ECC 관련에서 다루겠지만, 물론 이러한 방법의 경우에도 Parity를 통해서 체크할 수 있는 부분은 한정적이고 최소한의 bit에 대해서만 가능하기 때문에
여러개의 bit들이 오류가 너무 많이 발생하게 되면 복구가 불가능해진다.
따라서 주기적으로 메모리를 읽어 오류가 발생하고 있는지 확인을 해 볼 필요가 있다.

스크러빙 방식으로는 두가지 정도가 있다.
첫번째 방식은 메모리에 대한 Read 등 요청이 왔을 때 해당 부분에 오류가 있는지 확인하여 Scrubbing 후에 Read 를 return 하는 것이고
두번째 방식은 지속적으로 메모리를 확인하면서 오류가 난 부분이 있는지 확인하는 경우가 있다.

무엇이 확실히 좋다기보다는 시스템적으로 유리한 부분을 선택하게 되는데
첫번째 방식의 경우에는 평소에 탐색을 하지 않고 있기 때문에 idle time에 전력이 적고, IO등이 일어나는 시점에도 성능에 저하를 적게 주고
두번째 방식의 경우에는 평소에 탐색을 수행하기 때문에 idle time에 전력이 높다는 단점이 있지만, 에러가 발생할 확률이 적다는 점이 장점이 될 것이다.

그래서 결국
메모리 스크러빙은 에러가 발생한 경우 메모리 값을 문질러서 잘 보이게 해주는 것이다.
(너무 많은 에러가 발생한 경우에는 문질러도 잘 안닦이겠지....)

728x90

댓글