11.3.1.2采用附加的数据校验码来提高计算机系统的可靠性

数据在计算机系统内形成、存取和传送的过程中可能产生错误。为减少和避免这类错误,一方面是精心设计各种电路,提高计算机硬件本身的可靠性,另一方面是在数据编码上找出路,即采用带有某种特征能力的编码法,通过少量的附加电路,使之能发现某些错误,甚至能确定错误的性质和准确的出错位置,进而实现自动改错的能力。

数据校验码就是一种常用的带有发现某些错误或自动改错能力的数据编码方法。它的实现原理是,在合法的数据编码之间,加进一些不允许出现的(非法的)编码,使合法数据编码出现某些错误时,就成为非法编码。这样,就可以通过检测编码的合法性来达到发现错误的目的。合理地安排非法编码数量和编码规则,就可以提高发现错误的能力,甚至达到自动改正错误的目的。这里用到一个码距的概念。码距是指任意两个合法码之间至少有几个二进制位不相同,仅有一位不同,称其码距为1,例如用4位二进制表示16种状态,则16种编码都用到了,此时码距为1,就是说,任何一个状态的4位码中的一位或几位出错,就变成另一个合法码,此时无查错能力。若用4个二进制位表示8个状态,就可以只用其中的8种编码,而把另8种编码作为非法编码,此时可使合法码的码距为2.一般来说,合理地增大合法码的码距,就能提高发现错误的能力,但表示一定数量的合法码所使用的二进制位数变多,增加了数据存储的容量或数据传送的数量。在设计数据校验码的时候,通常要考虑在不过多增加硬件开销的情况下,尽可能发现更多的错误,甚至能自动改正某些最常出现的错误。

假设电路有p个输入端和q个输出端,则可能出现的输入组合为2p个,可能出现的输出组合为2q个,如果在正常运行时2q个输出组合均可能出现,则就无法通过观察和验证输出值来确定电路是否存在故障。

如果在2q个输出组合中仅有m<2q个输出组合是有效的,那么在出现另一些属于2q-m中的组合时就可断定电路中必定存在故障。通常称属于m中的组合为有效的输出组合,称为合法码字。否则为错误的输出组合,称为非法码字。

能自动证实电路或系统中是否存在故障的检验技术与纠错编码技术密切相关。常用的发现错误或纠错的数据校验码有奇偶校验码、海·明校验码和循环冗余校验码(CRC)。

1.奇偶校验码

奇偶校验码是一种开销最小、能发现数据代码中一位出错情况的编码,常用于存储器读写检查,或数据传送过程中的检查。它的实现原理是,使原来合法编码码距由1增加到2.若合法编码中有一个二进制位的值出错了,由1变成0,或由0变成1,这个码都将成为非法编码。实现的具体方法通常是为一个字节补充一个二进制位,称为校验位,用设置校验位的值为0或1,使字节的8位和该校验位含有1值的个数为奇数或偶数。在使用奇数个1的方案进行校验时,称为奇校验,反之称为偶校验。奇偶校验不能用于纠错。

2.纠错码ECC

ECC是具有对信息进行检测并纠正其错误的码。汉明码(HarmingCode)是能纠正可能出现的各种单个错误的纠错码。扩展汉明码能纠正一个错误并能检测两个错误。在计算机的存储器中,经常使用汉明校验码。它的实现原理是,在数据中加入几个校验位,将数据代码的码距均匀地拉大,并把数据的每一个二进制位分配在几个奇偶校验组中。当某一位出错后,就会引起有关的几个校验的值发生变化,这不但可以发现出错,还能指出是哪一位出错。为进一步自动纠错提供了依据。

假设校验位的个数为r,则它能表示2r个信息,用其中的一个信息指出"没有错误",其余的2r-1个信息指出错误发生在哪一位。然而错误也可能发生在校验位,因此只有k=2r-1-r个信息能用于纠正被传送数据的位数,也就是说要满足关系:2r=k+r+1

如果能检测与自动校正一位错,并发现两位错,此时校验位的位数二和数据位的位数k应满足下述关系:2r-1≥k+r

按上述不等式,可计算出数据位k与校验位r的对应关系。

3.循环冗余检验码CRC

CRC是循环码的子类。若码C中任一码字任意循环移位后仍为码C一中的码字,即码C对循环移位具有封闭性,则称C为循环码。一个码字长为n,其中信息码长k;校验码长r,即n=k+r.

在计算机的磁盘机和磁带机中常用CRC来纠错,其纠错能力很强,且是高效码,例如在磁带机中选用的CRC-16码型和软磁盘机中选用的CRC-CCITT码型,其校码位长r为16,生成的码长n=215-1=32767,编码效率R=(n-r)/n=99.95%,是高效码。

上述两种码型可直接选用市售CRC芯片来实现,不必设计编译电路。