나무모에 미러 (일반/밝은 화면)
최근 수정 시각 : 2024-11-25 21:33:15

오류 정정 코드

해밍 코드에서 넘어옴

파일:나무위키+유도.png  
은(는) 여기로 연결됩니다.
유럽 연합의 전신인 ECC에 대한 내용은 EU 문서
번 문단을
부분을
, YBM NET의 어학원에 대한 내용은 ECC 어학원 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
참고하십시오.

1. 개요2. 방식
2.1. 반복 (Repetition)2.2. 리던던시 (Redundancy)2.3. 해밍 ECC (Hamming Error Correction Code)2.4. 체크섬(Checksum)
3. ECC 램4. ECC 램 적용 제품을 사는 법

1. 개요

Error Correction Code, ECC

이 문서에서는 데이터에 문제가 발생했을 때 이를 검출(detection)하고 수정(correction)하는 코드들에 대해서 서술한다.

컴퓨터가 정보를 오류 없이 전송하고 저장하는 일은 생각보다 간단하지 않다. 데이터는 각종 외란, 물리적 흠집 등 다양한 이유로 손상될 수 있다. 그런데 컴퓨터에게 99.9999%의 정확성은 충분하지 않다. 컴퓨터는 데이터를 100% 완벽하게 전송해야 한다. 이 때문에 고급 하드웨어에는 하드웨어 자체적으로 오류 정정을 하는 기능이 들어가기도 한다.[1] 1940년대 벨 연구소에 근무하던 해밍은 주말에만 컴퓨터를 쓸 수 있었는데 이러한 오류 때문에 2주간 작업한 데이터를 몽땅 날려버렸고, 이에 해밍은 오류를 검출하고 정정할 수 있는 방법을 고안하기에 이른다. 그래서 ECC를 해밍 코드라고 부르기도 한다.

이러한 오류 정정 기법은 몇 년 뒤 클로드 섀넌의 논문 수학적 통신 이론을 통해 체계화 되었다.

2. 방식

2.1. 반복 (Repetition)

전송된 데이터의 오류를 검출하고 수정하는 가장 간단한 방법은 데이터를 필요한 만큼 반복해서 보내는 것이다.
보내고자 하는 코드가 10001101이라고 가정하자. 첫 번째 전송에서 수신측은 10011101을 받을 수도 있다. 이때 수신측은 받은 정보가 정확한지 아닌지 알 수 없다. 하지만 데이터를 여러 번 전송받으면 그럴 듯한 추측을 할 수 있다.

원본 : 10001101
수신 1 : 10011101
수신 2 : 10001101
수신 3 : 00001101
수신 4 : 10001101
수신 5 : 10001000
수신 6 : 11001101

6번의 반복되는 전송 과정에서 오류가 있었을 수도 있다. 위 예에서는 수신 2, 4를 제외하고 모든 과정에서 오류가 있었다. 하지만 수신측은 각 자리수마다 가장 많이 전송받은 값을 원본 데이터라고 통계적으로 추측할 수 있다.

수신 1 : 10011101
수신 2 : 10001101
수신 3 : 00001101
수신 4 : 10001101
수신 5 : 10001000
수신 6 : 11001101
======================
추측값 : 10001101

이처럼 단순히 같은 값을 반복해서 전송하는 것으로 데이터를 오류 없이 전송할 수 있다. 전송 회선의 신뢰도에 따라 반복 횟수를 늘리면 실질적으로 100%의 데이터 신뢰도를 가질 수 있다.

하지만 이 반복 전략은 두 가지 문제점이 있다.
1. 만약 악성 개체가 의도적으로 전송을 방해하며 선택적으로 오류를 발생시킨다면 이 전략은 취약해진다.
2. 전송하는 데이터의 양이 커지면 반복의 비용이 너무 커진다.

따라서 반복 전략은 데이터의 양이 적을 때만 유용하게 사용 가능한 방법이다.

2.2. 리던던시 (Redundancy)

데이터를 전송할 때 전송하는 데이터의 신뢰도를 높이기 위해 잉여 정보를 보낼 수 있다. 이 잉여 정보를 리던던시(Redundancy)라 한다. 리던던시를 활용하면 데이터 전송 시 신뢰도를 높일 수 있다.

보내고자 하는 코드가 "12345125"라고 가정하자. 이를 그대로 전송하는 대신
1 → "one"
2 → "two"
3 → "three"
4 → "four"
5 → "five"
라는 규칙 아래 인코딩(encoding)해서 "one two three four five one two five"라고 보내는 것이다.
이 데이터는 전송 과정에서 손상을 받아 "xne two thrae fqur frve one twl five"로 수신되었다고 하자. 영어를 할 줄 아는 사람 눈에는 이 데이터는 "one two three four five one two five"로 충분히 해석될 수 있을 것이다.

리던던시 전략의 정확한 알고리즘은 다음과 같다.
  1. 전송측과 수신측은 데이터가 몇 개의 심볼(symbol)로 이루어지고 이를 어떤 규칙으로 어떤 코드 워드(code word)에 대응시킬 건지를 미리 약속해 놓는다. 위 예에서 데이터는 "1", "2", "3", "4", "5" 총 5개의 심볼로 이루어져 있고, 코드 워드는 "one", "two", "three", "four", "five"이다.
  2. 전송측은 데이터를 전송할 때 약속한 규칙에 따라 코드 워드로 변환(encoding)하여 전송한다.
  3. 수신측은 인코딩된 데이터를 수신한다. 전송 과정 중에 오류가 발생했을 수도 있다. 수신한 데이터의 오류를 검출 및 수정한다. 해석할 수 없는 코드 워드들은 가장 근접한 코드 워드로 해석한다. 위 예에서 "xne"와 가장 가까운 코드 워드는 "one"이다. 따라서 이를 "one"으로 해석한다.
  4. 오류 검출 및 수정이 완료된 인코딩된 데이터를 디코딩(decoding)하여 원본을 얻는다.

2.3. 해밍 ECC (Hamming Error Correction Code)



해밍 ECC는 벨 연구소의 리처드 해밍(Richard Hamming)이 개발한 오류 검출 및 정정 코드.

해밍 ECC를 만드는 알고리즘은 다음과 같다.
  1. n비트의 데이터를 인코딩한다고 하자. n비트 데이터의 해밍 ECC 값은 총 (n + 2 + lb(n)\left \lfloor \mathrm{lb}(n) \right \rfloor) 비트가 된다.[2]
  2. 2의 거듭제곱에 위치한 모든 비트는 패리티 비트(parity bit)로 한다.
  3. 각 비트의 위치를 나타내는 값을 2진수로 나타냈을 때, 2의 거듭제곱 위치(패리티 비트의 위치)의 2진수 값이 1인 위치에 따라 비트들을 묶고, 그렇게 묶은 비트들의 1의 개수가 짝수/홀수가 되도록 패리티 비트를 설정한다.


아래 표는 7-4 해밍코드로, 심볼이 m1, m2, m3, m4일 때, 코드 워드를 m1, m2, m3, m4, p1, p2, p3로 하여 만든 해밍코드로, p1 = m1 xor m2 xor m3, p2 = m2 xor m3 xor m4, p3 = m1 xor m2 xor m4를 하여 만들어진 해밍코드이다.
심볼(symbol)코드 워드(code word)
00000000000
00010001011
00100010110
00110011101
01000100111
01010101100
01100110001
01110111010
10001000101
10011001110
10101010011
10111011000
11001100010
11011101001
11101110100
11111111111

2.4. 체크섬(Checksum)

체크섬은 일정한 수학적 방법에 따라 원본 데이터를 일정한 길이의 다른 데이터로 바꾼 것 이다. 주로 해시함수를 이용하며 보안과는 큰 관련이 없기 때문에 MD5를 써도 좋다.

가령 A가 B에게 Hello라는 문자열을 보낸다고 가정해보자. 체크섬방식의 오류정정코드를 이용하면 A는 Hello라는 원래 보내려고 했던 문자열과 함께 Hello의 체크섬(이 상황에서는 1243으로 가정)을 보낸다. 그럼 B는 Hello와 1243이라는 체크섬을 받는데 전송 도중 오류가 발생해서 Helli라는 문자열과 1234라는 체크섬을 수신받았다고 가정해보자. 이 상황에서 B는 전송받은 Helli의 체크섬이 같이 전송받은 1234라는 체크섬과 일치하지 않음을 이용해 전송이 제대로 이루어 지지 않았음을 알고 재전송을 요청할 수 있다.

실제로 해시함수의 특성상 변형된 데이터와 체크섬이 일치할 확률이 극히 낮기 때문에 충분한 신뢰성을 이끌어 낼 수 있다.

3. ECC 램

데이터가 손실되면 엄청난 손해를 입는 서버, 데이터센터, 워크스테이션 등은 이를 방지하고자 ECC 기능이 내장된 램을 사용한다. 일반적으로 보통 램과 외형은 같지만 ECC 기능을 탑재한 대신 조금 더 비싼 가격[3]과 영 좋지 않은 대역폭[4] 을 가지고 있다. 하지만 일반램과는 비교도 하지 못할 정도의 신뢰성을 가지고 있어[5] 속도보다는 신뢰성이 우선인 은행 서버나 금융계 컴퓨터에서 널리 사용된다.

ECC 램은 일반 램과 규격이 같고, 달라진거 라면 일반 램은 칩이 8개인 반면, ECC 램은 1개 더 박혀서 9개다. 규격이 같은 만큼 일반 메인보드에 물리적으로 꽂을 수는 있지만, 활용을 위해서는 해당 메인보드가 ECC 램을 지원해야 한다.

또한 ECC램은 ECC unbuffered와 ECC registered[6] 램으로 나뉜다. Registered가 붙은 램들은 약간의 속도를 희생해서 더 큰 용량의 메모리를 장착할 수 있게 해주는 기술이 적용되어 있는데, 일반 소비자용 메인보드와 소형 서버 컴퓨터는 거의 대부분 이 registed 기술을 지원하지 않는다. 이로 인해서 ECC/REG 램을 일반 보드에 꽂으면 동작하지 않으며, 반대로 일반 소비자용 unbuffered 램을 ECC/REG를 요구하는 서버용 보드에 꽂아도 동작하지 않는다. 일반 소비자가 ECC기능을 쓰려면 ECC unbuffered를 지원하는 마더보드 및 CPU 조합을 구매할 필요가 있다.[7]

노트북에서는 임베디드용을 제외하면 DDR3 플랫폼까지 ECC를 지원하는 CPU와 칩셋이 없었기 때문에 사용할 수 없었지만, DDR4부터 이를 지원하는 모바일용 제온 CPU가 출시되어 ZBook 등의 워크스테이션에 적용되고 있다.

DDR5 규격에 이르러서는 높아지는 전송속도와 대역폭 때문에 일어나는 불안정성을 커버하기 위해 기본규격에도 On-Die ECC 기능이 탑재되나, 여전히 RDIMM/LRDIMM은 존재한다. ECC에는 메모리에 오류가 발생하면 복구하거나 복구할 수 없을 경우에는 운영체제에 알리는 기능이 있는데 DDR5에 탑재되는 On-Die ECC는 오류를 보고하는 기능이 없어 오류가 발생하더라도 이 사실을 운영체제에 알리지 않는다.

4. ECC 램 적용 제품을 사는 법



[1] 서버RAM이 대표적이다.[2] [math(\mathrm{lb}(n) = \log_2 n)][3] 2021년 6월 기준 삼성전자 DDR4 ecc/reg 16기가 3200MHz가 11만 8천원대, 다른사양 동일한 일반 램 8만원대로 약 1.5배 조금 안 되게 비싸다. 다만 이는 코로나 19로 인한 물류대란과 집콕 트렌드로 인한 급격한 서버 확충 그리고 대량의 보조금 살포로 인한 인플레이션이 본격화된 탓이 있다. 몇 달 전만 해도 ECC램과 비ECC램의 차이는 약 1~2만원 정도밖에 되지 않았다.[4] DDR3/DDR4를 보면 대체적으로 ECC기능이 있는 램의 대역폭은 그렇지 않은 램의 대역폭보다 상승속도가 조금 늦은 편이다. 즉 일반 램이 1333MHz를 찍으면 ecc는 1066MHz 정도에서 놀다가, 최종적으로는 둘 다 1800MHz에서 최대치를 찍는 식. 사실 ECC를 꼭 필요로 하는 분야에서는 높은 대역폭의 우선순위가 낮은 편이다. 이를 커버하기 위해 서버용 CPU는 쿼드채널 이상 구성의 램 슬롯을 지원한다.[5] 2009년 다수의 구글 서버들을 대상으로 램의 신뢰성을 측정한 대규모 연구, 'DRAM Errors in the Wild: A Large-Scale Field Study'에 의하면, 메모리 모듈당 연평균 3751번의 ecc로 교정 가능한 에러가 발생했으며, 기가비트당으로 환산하면 14~40시간마다 1번씩 에러가 발생했다. 즉 8기가바이트 램이라면 13분~37분마다 한번씩 에러가 발생하는 셈. 다만 다른 소규모 연구들에서의 결론들을 보면 오차범위가 10의 7승에 가까울 정도로 매우 크다. 즉 어떤 연구는 1일에 1번 에러가 발생한다고 결론지었다면 다른 연구는 10^7=1천만일=약 27400년 당 1번 에러가 발생한다고 하는 꼴이다. 참고로 신석기의 시작이 1만년 전이다.(...)[6] 'ECC/REG'라고 자주 쓴다.[7] AMD의 경우 AM4 마더보드들은 비공식적으로 ECC unbuffered를 지원하고는 한다. 대표적으로 ASRock은 대부분의 보드가 ECC를 지원해준다. 반면 MSI의 경우 대부분의 보드가 지원해주지 않는다. 인텔은 일부 cpu가 지원한다고 적혀있긴 하나 실질적으로 판매되는 일반 소비자용 보드에서 ecc를 지원하지 않으므로, ecc를 사용하려면 제온을 사용해야 한다.