null
패리티 비트

패리티 비트

2023년 3월 3일

이진 통신 오류란 수신된 메시지가 전송하고자 했던 메시지와 다른 상황을 말합니다. 이는 신호 무결성 저하, 노이즈, 시스템 장애 등 다양한 원인으로 발생할 수 있습니다. 이러한 오류는 메시지를 잘못 해석하게 만들 수 있으며, 디지털 신호 통신의 정확성과 신뢰성에 영향을 미칠 수 있습니다. 이진 통신 오류를 줄이는 한 가지 해결책은 패리티 비트를 사용하는 것입니다.

노이즈로 인한 데이터 전송 오류의 예.


패리티 비트란 무엇인가요?

패리티 비트(패리티 체크라고도 함)는 데이터 전송 중 오류를 감지하기 위해 일련의 이진 데이터 비트에 추가되는 비트입니다. 패리티 비트는 데이터 문자열 내의 ‘1’의 개수가 짝수인지 홀수인지 확인하는 데 사용되며, 이에 따라 짝수 패리티 비트와 홀수 패리티 비트 두 가지 유형으로 나뉩니다.

이진 오류

이진 통신에서 오류는 1이 예기치 않게 0으로 바뀌거나 그 반대의 경우가 발생할 때 발생합니다.

자세히 알아보기: 직렬 데이터 통신 표준 RS232

짝수 패리티

짝수 패리티 방식에서는 패리티 비트를 1 또는 0으로 설정하여, 패리티 비트를 포함한 1 비트의 총 개수가 짝수가 되도록 합니다.

짝수 패리티 계산 방법

데이터 문자열에 포함된 1의 개수가 홀수인 경우, 패리티 비트를 1로 설정하여 패리티 비트를 포함한 전체 1의 개수가 짝수가 되도록 합니다. 데이터 문자열에 포함된 1의 개수가 이미 짝수인 경우, 패리티 비트를 0으로 설정합니다.

홀 짝성

홀수 패리티 방식에서는 패리티 비트가 1 또는 0으로 설정되어, 패리티 비트를 포함한 1 비트의 총 개수가 홀수가 되도록 합니다.

홀 패리티를 계산하는 방법

데이터 문자열에 포함된 ‘1’의 개수가 짝수인 경우, 패리티 비트를 1로 설정하여 패리티 비트를 포함한 전체 ‘1’의 개수가 홀수가 되도록 합니다. 데이터 문자열에 포함된 ‘1’의 개수가 이미 홀수인 경우, 패리티 비트를 0으로 설정합니다.

패리티 비트 예시

7비트 데이터 문자열 1비트의 개수 패리티 비트를 포함한 8비트
짝수 패리티 홀수 패리티
0000000 0 00000000 00000001
1100001 3 11000011 11000010
1100101 4 11001010 11001011
1111111 7 11111111 11111110

패리티 비트 검사는 ASCII 문자 전송에서 흔히 사용되는데, 이때 8번째 비트는 패리티 비트로 예약되고 나머지 7비트는 문자를 인코딩하는 데 사용됩니다.


패리티 비트의 작동 원리

데이터를 전송하기 전에 송신기와 수신기 모두 홀수 또는 짝수 패리티에 대해 합의해야 합니다. 각 데이터 패킷(비트열)을 전송하기 전에, 송신자는 합의된 패리티(홀수 또는 짝수)와 일치하는지 확인하기 위해 해당 패리티 비트(0 또는 1)를 계산합니다. 수신 시, 수신자는 수신된 데이터의 패리티를 예상된 패리티와 비교하여 확인합니다. 두 값이 일치하지 않으면 오류가 발생한 것으로 간주되며, 해당 데이터는 폐기되거나 재전송을 요청하여 수정될 수 있습니다.

패리티 비트는 오류 탐지에만 사용되며, 구체적으로 어떤 비트가 손상되었는지 식별할 수 없기 때문에 오류를 수정할 수 있는 기능은 없습니다. 따라서 오류를 수정할 수 있는 유일한 방법은 전체 데이터 문자열을 버리고 발신자에게 재전송을 요청하는 것뿐입니다.

패리티 비트 위치

패리티 비트의 위치에 대해 정해진 규칙은 없지만, 관례상 일반적으로 이진 문자열 메시지의 끝에 추가됩니다.


오류 탐지

수신기에서 수행하는 패리티 검사는 수신된 신호의 패리티를 예상된 패리티와 비교하여 오류를 감지할 수 있습니다. 두 값이 일치하지 않을 경우, 수신기는 송신기에 재전송을 요청할 수 있습니다.

이진 데이터 문자열에 포함된 1의 개수가 짝수인지 홀수인지 확인하는 것은 모듈로 연산자를 사용하여 계산할 수 있습니다. 모듈로(또는 “mod”)는 한 정수를 다른 정수로 나눴을 때의 나머지 값을 구하는 수학적 연산입니다. 모듈로 연산은 % 기호로 표시됩니다.

모듈로를 이용하면, 어떤 수가 2로 나눴을 때 나머지 없이 나누어지는지 여부를 통해 그 수가 짝수인지 판단할 수 있습니다. 반면, 2로 나눴을 때 나머지가 남는 수는 홀수로 간주됩니다.

다음 C 프로그램 예제는 모듈로를 사용하여 패리티를 확인하는 과정을 보여줍니다:

#include 
int main() {
    unsigned char byte;
    int num_ones = 0;
    printf("Enter a byte (in decimal): ");
    scanf("%hhu", &byte);
    // Count the number of 1s in the byte
    for (int i = 0; i < 8; i++) {
        if ((byte >> i) & 1) {
            num_ones++;
        }
    }
    // Detect parity with mod 2 and print the parity type. 
    if (num_ones % 2 == 0) { //
        printf("Even parity\n");
    } else {
        printf("Odd parity\n");
    }
    return 0;
}

이 프로그램은 사용자로부터 바이트 하나를 입력받는 것으로 시작합니다. 그런 다음 루프를 사용하여 해당 바이트에 포함된 1 비트의 개수를 세습니다. 이를 위해 바이트를 비트 위치(0부터 7까지)별로 오른쪽으로 한 비트씩 이동시키며, 결과 비트가 1인지 확인합니다. 1인 경우, 1 비트의 개수 카운터를 1씩 증가시킵니다. 마지막으로, 프로그램은 1 비트의 개수가 짝수인지 홀수인지 확인하고, 그에 맞는 메시지를 출력합니다.

이 프로그램은 바이트를 저장할 때 unsigned char를 사용한다는 점에 유의하십시오. unsigned char는 0에서 255 사이의 값을 가질 수 있는 8비트 정수입니다. %hhu 형식 지정자는 scanf()와 함께 사용되어 사용자로부터 바이트 값을 읽어옵니다.


패리티 비트를 추가하는 방법

데이터 문자열 1100101을 전송해야 하는 예를 살펴보겠습니다. 먼저, 데이터 문자열에 포함된 ‘1’의 개수를 세고, 2를 나눗수로 하는 모듈로 연산자를 사용하여 그 개수가 짝수인지 홀수인지 확인합니다:

1100101
(1+1+0+0+1+0+1) mod 2
4 mod 2 = 0

4를 2로 나누면 나머지가 없으므로 결과는 0이며, 이는 1의 개수가 짝수임을 나타냅니다. 짝수 패리티를 사용하기로 합의했다면, 메시지 끝에 패리티 비트로 “0”을 추가하여 11001010이 되고, 이제 이 메시지를 전송할 수 있습니다. 반대로, 홀수 패리티를 사용하기로 합의했다면 패리티 비트를 반전시켜 대신 “1”을 추가하면, 최종적으로 11001011이 되어 이 메시지를 전송할 수 있습니다.


패리티 비트의 용도

  • 오류 검출: 패리티 비트의 주요 용도 중 하나는 데이터 전송 중 오류를 검출하는 것입니다.
  • 메모리 저장: 패리티 비트는 컴퓨터 메모리 시스템에서도 데이터가 메모리에 저장될 때 오류를 감지하는 데 사용됩니다. 데이터가 메모리에 저장될 때는 전자기 간섭, 하드웨어 결함 등 다양한 요인으로 인해 오류가 발생할 위험이 항상 존재합니다.
  • RAID 시스템: 패리티 비트는 RAID(Redundant Array of Inexpensive Disks)에서도 사용됩니다. RAID는 “Redundant Array of Independent Drives”라고도 불립니다. RAID 시스템은 여러 개의 디스크를 사용하여 데이터를 중복 저장함으로써 디스크 고장에 대비합니다. 이 시스템은 내결함성을 확보하기 위해 패리티를 활용합니다.

자세히 알아보기: EMI (전자기 간섭)


결론

결론적으로, 패리티 비트는 단순하지만 효과적인 오류 검출 메커니즘으로, 저장 및 데이터 전송의 정확성을 보장하는 데 도움이 됩니다. 패리티 비트가 완벽한 것은 아니며 일부 오류만 검출할 수 있지만, 이진 데이터 통신 분야의 많은 응용 분야에서 여전히 유용하게 사용되고 있습니다.