패리티 메모리
PC가 출시되었던 초기에는 메모리의 오류를 막기 위해서 모든 컴퓨터에 패리티 방식이 사용되었다. 패리티라는 것은 8bit당 1bit의 패리티 비트를 두어서 데이터의 전달과정중에 오류가 생긴 것을 검출하는 방식을 지칭한다. 즉, 시스템에서 나타날 수 있는 오류를 방지하고자 패리티 메모리를 포함시켰고, 이것은 그 역할을 충분히 해냈다.
그런데, 1994년부터 분위기가 조금씩 달라졌다. 메모리 기술의 발달로 메모리의 오류 발생 확률이 점점 적어지자 일부 PC 제조사에서 패리티가 포함되지 않은 메모리를 탑재한 컴퓨터를 내놓기 시작한 것이다. 물론 오류 발생 확률은 일반 사용자들이 신경쓸 필요가 없을 정도로 적었으며, 패리티를 제거함으로써 패리티 메모리에 필요한 약 10~15%의 추가 메모리 비용 부담을 줄일 수 있어서 제조사 측에서는 즐거운 일이었다. 하지만, 대단히 중요한 데이터를 다루는 사용자들에게는 역시 패리티는 필요한 것이었으며 그러한 사용자는 별도로 요청을 해야만 했다.
이러한 추세를 급격히 가속시킨 것은 일부 대형 PC 제조사들이 패리티가 없는(넌패리티 : non-parity) 메모리를 탑재한 채로 PC를 출하한 것이다. 대형 PC 제조사들이 이러한 정책을 펴나가자 너도나도 이 정책을 따랐으며, 그 결과 넌 패리티 메모리가 거의 표준으로 굳어진다. 그리고 이것을 완전히 굳어지게 한 것이 인텔의 430FX 칩셋의 출시였다.
인텔 430FX 칩셋은 아예 패리티라는 것을 지원하지 않았다. 칩셋 레벨에서의 패리티 지원은 사실 원가상승에는 그다지 기여하지 않는다. 있으나 없으나 가격은 어차피 비슷하며, 회로도 복잡하지 않기에 만들기도 만만했다. 하지만 430FX는 패리티를 외면해버렸고, 인텔이 그러한 정책을 펼치자 다들 그냥 그러려니 하고 이를 따라갔다. 결국 일반 사용자용 메모리에서는 패리티가 사라졌고, 이것은 ECC까지 그대로 이어졌다.
하지만, 웍스테이션이나 서버, 그리고 대단히 중요한 작업을 하는 시스템들은 가격보다는 시스템의 안정성과 신뢰도가 절대적으로 우선되기 때문에 패리티 메모리나 ECC 메모리를 요구한다.
패리티 메모리와 ECC 메모리의 원리
SDRAM이 나오기 전까지, EDO 메모리나 FPM 등이 사용한 에러 정정방식은 패리티(parity) 방식이었다. 이것과 지금의 ECC를 혼동하는 사용자들도 많다. 우선 패리티가 무엇인지부터 정리해보자.
패리티의 원리는 다음과 같다.
PC에서 사용되는 것은 홀수 패리티(odd parity)이다. 홀수 패리티라는 것은 전송되는 데이터들의 합이 홀수가 되도록 패리티 비트가 정해진다.(보다 정확하게는, 전체의 XOR 값이 1이 되어야 한다고 정의된다. 그러나 이해를 편하게 하기 위해서 전체 합을 홀수가 되어야 한다는 것으로 표현하였다.) 예를 들어서 다음과 같은 데이터가 전송된다고 하자.
전송되는 8bit 내에 1이 다섯개 있어서 전체의 합은 홀수가 된다. 이를 홀수로 유지시키기 위해서는 0이 더해져야만 하며, 그래서 패리티 비트가 0이 된다. 한편, 데이터 안에 1이 짝수개가 있다면 패리티 비트가 1이 되어서 전체의 합을 홀수로 유지시킨다.
데이터를 수신하는 측에서는 수신된 데이터와 패리티 비트를 합해서 그 결과가 홀수가 나오는지, 짝수가 나오는지를 살펴보고, 홀수가 나온다면 무사히 지나가고 짝수가 나온다면 사용자에게 에러가 발생했다는 것을 통보한다.
패리티를 사용하면 시스템의 어디서 문제가 발생했는지를 검출할 수 있다. 데이터가 전달되는 부분마다 패리티 검사를 수행하기 때문에 만약 메모리 컨트롤러에서 문제가 생겼는지, 메모리 자체에서 문제가 생겼는지 등이 검출되어서 시스템을 수리하는 과정도 보다 용이해진다.
물론 단점도 있다. 만약 2개의 bit에서 동시에 문제가 발생했다면, 데이터에 문제가 있다고 할지라도 데이터의 합계의 홀/짝은 그대로 유지된다. 즉, 이러한 경우에는 데이터 오류가 검출되지 않는다. 물론, 메모리 자체의 오류도 적게 일어나거니와, 전체 메모리 오류 중에서 97% 이상이 단일 bit에서 발생하는 문제이기 때문에 패리티가 잡아낼 수 없는 문제점은 거의 없다고 보아도 좋다. 그러나 확률적으로 문제가 있는 데이터가 그대로 전달되는 상황이 발생하기도 한다.
이러한 문제를 해결한 것이 ECC(Error Correcting Code)이다. ECC는 단지 에러를 검출하기만 하는 패리티에서 대폭 향상되어서 단일 bit의 에러에 대해서는 이를 검출하여 직접 교정할 수 있는 능력을 가지고 있다. 즉, 패리티에서는 데이터에 오류가 있을 경우 이의 재전송을 요구하거나 동작을 중지하였던 것에 반해서 절대 다수를 차지하는 단일 bit의 에러에서는 시스템의 정지 없이 바로 교정하면서 연속적인 동작이 가능하다.
ECC의 종류에는 여러가지가 있는데, PC용 메모리에 적용되어 있는 ECC는 '단일 bit 에러 교정, 2bit 에러 검출(SEC-DED : Single-bit Error Correcting, Double-bit Error Detecting)' 방식이다. 그래서 하나의 bit에서 문제가 발생했다면 이를 직접 교정하고, 2개의 bit에서 문제가 발생한다고 해도 이를 검출하여 사용자에게 통보할 수 있다.
ECC의 구현원리는 다음과 같다.
먼저, 데이터를 기록할 때, 메모리 컨트롤러는 체크 비트를 만들어내어 이를 같이 기록한다.
이때 만들어진 체크 비트는 메모리에 같이 저장되었다가 이를 메모리 컨트롤러가 읽어낼 때 같이 읽혀진다.
이 과정에서, 메모리 컨트롤러는 저장되어 있는 데이터와 체크 비트를 비교하면서 서로 맞는 것인가를 확인한다. 이 때, 데이터와 체크 비트가 서로 맞는 것이라면 그대로 데이터가 출력되고, 만약, 데이터 내에 1bit의 오류가 발생했다면 이를 자동으로 정정한다. 2bit 이상의 오류가 발견될 경우 이를 사용자에게 알리고 그 이상의 시스템 운영을 정지시킨다.
그래서 ECC 메모리는 패리티에 비해서 높은 데이터 신뢰도를 구현하면서 동시에 단일 bit에 대해서는 직접적으로 정정을 수행함으로 인해 성능저하를 줄일 수 있게 되었다.
물론, ECC 메모리 컨트롤러 내에서 체크 비트를 연산하고, 이를 사용하여 검사하는 과정에서 성능의 하락이 일어난다. 하지만 이것은 수 % 내외이므로 큰 폭의 성능하락은 일어나지 않으며, 안정성의 극대화라는 측면에서 본다면 실보다는 득이 훨씬 크다.
SIMM에서는 패리티이고, DIMM에서는 ECC가 사용된다는데..
이제는 과거의 유물이 되어버린 72pin SIMM
i430TX 칩셋까지 사용되었던 72pin SIMM과 현재 사용되고 있는 168pin SDRAM DIMM 및 184pin DDR SDRAM DIMM의 근본적인 차이점은 단면(SIMM - Single Inline Memory Module), 양면(DIMM - Double~) 이라는 차이 외에도, 메모리 인터페이스의 폭에 있다. 72핀 메모리는 32bit의 메모리 버스를 가졌고, DIMM은 64bit의 메모리 버스를 가지고 있었다.(펜티엄에 72pin 메모리를 사용하기 위해서 2개의 메모리를 꽂는 것은 바로 이 버스 폭을 맞추기 위함이었다. 펜티엄 프로세서는 64bit의 메모리버스를 갖고 있기 때문이다. 즉, 당시의 72pin 메모리는 듀얼채널로 동작했다는 놀라운 사실!!!)
패리티의 경우 8bit당 1bit의 패리티 비트를 필요로 한다. 버스폭이 넓어진다면 이 역시 16bit에 2bit, 64bit에 8bit 하는 식으로 커지면 된다. 그런데, ECC는 연산 방법이 좀 복잡해서, 32bit의 메모리가 한번에 전송된다면 여기에 7bit의 체크 비트를 필요로 한다. 만약, 32bit의 버스폭을 가지는 메모리에서 32MB의 메모리 용량을 구현한다면 여기에 7MB의 메모리가 추가로 장착되어야만 ECC가 구현된다는 것이다. 한편, 64bit가 한번에 전송된다면 8bit의 체크 비트를 필요로 한다. 이것은 결국 패리티와 같은 수준의 추가 메모리만을 요구한다는 것이다.
이러한 이유 때문에, 32bit의 버스폭을 갖는 72핀 메모리에서는 패리티가 사용되었지만, 64bit의 버스폭을 갖는 168핀 DIMM 부터는 패리티 대신에 ECC가 사용되고 있는 것이다.
레지스터드 메모리가 그러한 이름으로 불리는 이유는 지극히 간단하다. 바로 레지스터(Register)가 달려있기 때문이다. 흔히, 레지스터드 메모리를 ECC 메모리와 혼동하는 경우가 있는데, 레지스터드 메모리와 ECC 메모리는 바로 레지스터의 유무를 보고 쉽게 분간할 수 있다.
대개 서버용으로 ECC가 사용되기도 하고 레지스터드 ECC가 사용되기도 한다는 점이 이러한 혼란에 일조하기도 하지만, 모든 레지스터드 메모리가 기본적으로 ECC가 적용된 것이기 때문에 '레지스터드' 대신 '레지스터드 ECC' 메모리라고도 불리고 있다는 것도 이러한 혼란을 불러일으키는 이유이다.
하지만, ECC와 레지스터드의 개념을 확실히 알고 있다면 외형적으로 완전히 틀리는 이들 메모리를 분간하지 못할 까닭은 없다.
레지스터와 레지스터드 메모리
레지스터의 역할은 신호왜곡(skew)의 제거, 쉽게말하면 신호의 정렬이며, 이는 곧 메모리 칩의 제어를 의미한다.
즉, 간소화된 메모리 컨트롤러가 메모리 모듈 상에 위치한다고 보면 된다. 이러한 구성은 시스템의 수준에서, 그리고 메모리 모듈 자체의 수준에서 각각 한가지씩의 잇점을 제공한다.
일반적인 언버퍼드 메모리의 경우 각 메모리 디바이스까지도 칩셋의 메모리 컨트롤러가 담당하는 구조를 가진다.
이러한 구조는 전체적인 구조가 간소화되며, 빠른 동작을 기대할 수 있다는 잇점을 가지지만, 반대로, 메모리 컨트롤러 하나가 모든 메모리 디바이스까지 직접 제어해야 하기 때문에 메모리의 확장이 쉽게 한계에 다다른다. 특히나 메모리의 속도가 빨라질수록 메모리의 타이밍이 대단히 민감해지기 때문에 컨트롤러 하나로 모든 메모리를 제어하는 방법에서는 다룰 수 있는 메모리 디바이스의 제한이 더욱 심해진다.
일반 사용자들이라면야 2개 혹은 3개의 모듈을 사용해도 별 상관이 없지만 수십 GB급의 고용량을 필요로 하는 서버 및 그에 준하는 시스템에서는 언버퍼드 메모리로는 메모리 확장에 답답함을 느낄수밖에 없다.
한편, 레지스터드 메모리는 이러한 문제점을 상당부분 해소한다.
각 메모리 디바이스의 제어는 메모리 모듈에 탑재된 레지스터에서 행하고 있기 때문에 메인 칩셋에 있는 메모리 컨트롤러는 단지 레지스터들만을 제어하면 된다. 이는 메모리 컨트롤러의 설계를 대단히 단순하게 바꿀 수 있을뿐만 아니라 메모리 모듈을 보다 많이 사용하게 해 줌으로써 대용량 메모리의 구현이 가능해진다.
또한, 메모리 모듈 자체에서 얻을 수 있는 잇점도 있다. 일반적으로 하나의 메모리 모듈에 탑재할 수 있는 메모리 칩의 개수는 한 면에 8개, ECC 칩까지 포함해서 9개이다. 그리고 양면 구성으로 18개까지가 가능하다. 현재 가장 많이 사용되는 메모리 칩의 용량은 256Mbit. 이 칩으로 단면 메모리를 구성하면 256MB가 된다. 그리고 양면 메모리를 만들면 512MB. 만약 1GB 용량의 모듈을 만들고 싶다면 어떻게 해야할까. 한 면에 9개의 칩이 아닌, 18개의 칩이 장착되어야만 한다.
이러한 구성을 위해서, 메모리는 복층구조, 혹은 다열구조를 가져야만 한다. 그러나 복층/다열구조를 가지게 된다면 문제가 발생한다. 바로 메모리의 위치 때문이다.
간단히 생각해 본다면, 메모리를 2열로 구성하면 메모리 용량이 2배가 되기는 한다. 이러한 구조가 되면서 메모리 디바이스의 수가 많아지고, 컨트롤러에서 이들 메모리를 제어하는게 힘들어진다는 것은 쉽게 생각할 수 있다. 그런데, 한가지 문제가 더 발생하는데, 바로 신호왜곡(skew)이 상당히 커진다는 것이다.
메모리 칩으로부터 모듈이 보드에 연결되는 핀까지의 거리가 윗 열과 아랫 열의 메모리 사이에 엄청난 차이가 생긴다. 안그래도 높은 클럭으로 인해서, 그리고 64bit라는 넓은 버스로 인해서 신호왜곡은 상당히 민감한 문제가 되고 있는데도 불구하고 여기에 어려움을 주는 대단히 큰 요소가 하나 더 등장한 것이다. 여기에 레지스터가 개입됨으로써 문제는 해소될 수 있다.
레지스터는 각 메모리 디바이스를 제어함과 동시에, 메모리 디바이스들로부터 신호를 받아서 이들의 타이밍을 재조정하여 출력함으로써 내부적으로 발생하는 신호왜곡을 제거하는 효과를 가진다. 대신, 레지스터드 메모리에서는 속도의 저하가 일어난다.
레지스터에서 각 칩의 신호들을 정렬하기 위해서는 한번의 클럭을 필요로 한다. 즉, 데이터의 전송과정에서 레지스터가 '까먹는' 클럭이 생기는 것이다. 이 때문에 레지스터드 메모리는 언버퍼드 메모리에 비해서 약간 낮은 성능을 갖는다. 일반 사용자들용 제품군에 레지스터드 메모리를 사용하지 않으려는 것은 가격도 가격이지만, 이러한 성능의 차이 때문이기도 하다.
여하튼, 이러한 특징으로 인해 레지스터드 메모리는 다열구조나 복층구조는 물론이며, 메모리 칩의 배치에서 상당한 다양성을 가질 수 있게 되며, 다수의 메모리 칩을 장착함으로써 대용량의 메모리를 만들 수 있다. 아래의 사진들은 그러한 '다양한' 메모리 배치의 사례를 보여주고 있다.
레지스터드 메모리의 반대말은 언버퍼드 메모리라고?
이제 레지스터드 메모리가 어떤 것인지 독자분들도 어느정도 감을 잡았을 것이라고 생각한다. 그런데, 분명 이러한 생각을 가지는 독자가 있을 것이다. '레지스터드의 반대말이 왜 언버퍼드인가? 언레지스터드가 아닌가? 또한, 언버퍼드의 반대말은 버퍼드가 되어야하지 않는가?'라고.
분명히 생길 수 있는 의문점이다.
이것은 이전부터 이어져내려온 관례라고 생각하는 것이 좋다. EDO 메모리가 한창 사용되던 때에 사용된 서버용 메모리는 '버퍼드(buffered)'라고 불렸다. 여기에서의 버퍼 역시 지금의 레지스터와 거의 유사한 역할을 한다. 그래서 이러한 메모리의 반대되는 말로 '언버퍼드(unbuffered)'가 사용되었다.
이후에, EDO 메모리의 영역을 SDRAM이 대체하게 되면서, 버퍼드 메모리는 레지스터드 메모리로 바뀌었다. 이것은 EDO 메모리와 SDRAM 간의 특성 차이로 인해서 이름이 변경된 것인데, 일반 사용자용 언버퍼드 메모리들은 어차피 달라지는 것이 거의 없어서 그대로 언버퍼드 메모리로 불리게 되었다.
결국, 현재에 이르러서도 '언레지스터드-레지스터드'가 아닌, '언버퍼드-레지스터드'로 불리고 있다.
출처: http://cafe.naver.com/mynet/32