奇偶校验位 (Parity)多被应用于计算机硬件的错误检测中。奇偶校验通常用在数据通信中来保证数据的有效性。每个设备必须决定是否它将被用为偶校验、奇校验、或非校验。发送设备添加1s在每个它发送的每条串上或决定这个数是偶数或奇数。然后,它添加一个额外的位,叫做校验位,到这个串上。如果偶校验在使用,校验位将这些位置为偶数;如果奇校验在使用,校验位将这些位置为奇数。
基本概况
奇偶校验位 (Parity)是指偶数或者奇数或甚至对一个数字的性质。奇偶校验通常用在数据通信中来保证数据的有效性。每个设备必须决定是否它将被用为偶校验、奇校验、或非校验。发送设备添加1s在每个它发送的每条串上或决定这个数是偶数或奇数。然后,它添加一个额外的位,叫做校验位,到这个串上。如果偶校验在使用,校验位将这些位置为偶数;如果奇校验在使用,校验位将这些位置为奇数。
奇偶校验位是一个表示给定位数的二进制数中 1 的个数是奇数还是偶数的二进制数。奇偶校验位是最简单的错误检测码。
奇偶校验位有两种类型:偶校验位与奇校验位。如果一组给定
数据位中 1 的个数是奇数,那么偶校验位就置为 1,从而使得总的 1 的个数是偶数。如果给定一组数据位中 1 的个数是偶数,那么奇校验位就置为 1,使得总的 1 的个数是奇数。偶校验实际上是
循环冗余校验的一个特例,通过多项式 x + 1 得到 1 位 CRC。
错误检测
如果传输过程中包括校验位在内的奇数个数据位发生改变,那么奇偶校验位将出错表示传输过程有错误发生。因此,奇偶校验位是一种错误检测码,但是由于没有办法确定哪一位出错,所以它不能进行错误校正。发生错误是必须扔掉全部的数据,然后从头开始传输数据。在噪声很多的媒介上成功传输数据可能要花费很长的时间,甚至根本无法实现。但是奇偶校验位也有它的优点,它是使用一位数据能够达到的最好的校验码,并且它仅仅需要一些异或门就能够生成。参见
汉明码中关于其它错误校正码的描述。
使用
由于它很简单,所以奇偶校验位用于许多计算机硬件中遇到麻烦时能够重新操作或者通过简单的错误检测就能起到很大作用的场合。例如
SCSI总线使用奇偶校验位检测传输错误,许多微处理器的指令高速缓存中也包括奇偶校验位保护。因为指令缓存数据是主内存数据的副本,所以在发现错误的时候能够抛弃错误数据并且重新取回数据。
在串行数据通信中,常用的格式是 7 个数据位、1 个校验位、1 到 2 个停止位。这种格式用方便的 8 位字节巧妙地适应了所有的 7 位 ASCII 字符。也可以用其它的格式表示,8 位数据加上 1 个校验位可以传输任意的 8 位字节数据。
在串行通信中,奇偶校验位通常是由UART这样的接口硬件生成、校验的,在接收方,通过接口硬件中的寄存器的状态位传给 CPU 以及操作系统。错误数据的恢复通常是通过重新发送数据,这个过程通常由如操作系统输入输出程序这样的软件处理的。
内存检验
对于内存的奇偶校验工作要从比特概念说起,比特(bit)是内存中的最小单位,也称“位”、它只有两个状态分别以1和0表示。我们将8个连续的比特叫做一个字节(byte)。非奇偶校验内存的每个字节只有8位,若它的某一位存储了错误的值,就会使其中存储的相应数据发生改变而导致应用程序发生错误。而奇偶校验内存在每一字节(8位)外又额外增加了一位作为错误检测之用。比如一个字节中存储了某一数值(1、0、0、1、1、1、1、0),把这每一位相加起来(1+0+0+1+1+1+1+0=5)。若其结果是奇数,校验位就定义为1,反之则为0。当CPU返回读取储存的数据时,它会再次相加前8位中存储的数据,计算结果是否与校验位相一致。当CPU发现二者不同时就作出一定的反应。主板都可以使用带奇偶校验位或不带奇偶校验位两种内存条,但要注意两种不能混用。
上面的叙述描述了奇偶校验在电脑内是如何工作的。需要说明的是,外围设备连接总线和I/O
总线控制器使用的是奇数的奇偶错误校验方法。奇偶位校验不是确实可信的错误校验方法,因为它可能两个“位”在传送时都发生可错误。对于个人电脑内部的传输,这种可能性被认为是微乎其微的。在一些大型机系统中,数据的完整性是非常重要的,三个“位”被分配用于奇偶校验。
奇偶校验也用于
调制解调器之间的通讯。这里,奇偶校验可以被选择是偶数的(一个连续的传输将形成一个偶数)还是奇数的。用户也可以选择没有奇偶,意味着调制解调器没有传输或者校验位。当没有奇偶可以选择(或者默认)时,它被假定为有其它的形式的校验以探测传输过程的任何错误。没有奇偶通常也意味着校验位能被用于数据和传输加速。在猫到猫的通信中,奇偶的类型在传输发生之前被发送和接受的调制解调器调整。
奇偶校验块
一些冗余磁盘阵列(en:RAID)使用奇偶校验块实现冗余。如果阵列中的一块磁盘出现故障,工作磁盘中的数据块与奇偶校验块一起来重建丢失的数据。
下面每列表示一个磁盘,假设 A1 = 00000111、A2 = 00000101 以及 A3 = 00000000。A1、A2、A3 异或得到的 Ap 等于 00000010。如果第二个磁盘出现故障,A2 将不能被访问,但是可以通过 A1、A3 与 Ap 的异或进行重建:
A1 XOR A3 XOR Ap = 00000101
冗余磁盘阵列
A1 A2 A3
Ap B1 B2
Bp C1 C2
C3 C4 Cp
注意:数据块是格式 A#,奇偶校验块是 Ap。