深刻浅出计算机组成原理学习笔记:第五十讲

1、引子

讲完校验码以后,你如今应该知道,不管是奇偶校验码,仍是CRC这样的循环校验码,都只能告诉咱们一个事情,就是你的数据出错了。因此,校验码也被称为检错码(Error Detecting Code)。编码

不论是校验码,仍是检错码,在硬件出错的时候,只能告诉你“我错了”。可是,下一个问题,“错哪儿了”,它是回答不了的。这就致使,咱们的处理⽅式只有一种,那就是当成“哪儿都错了”。若是是下载一
个文件,发现校验码不匹配,咱们只能从新去下载;若是是程序计算后放到内存里面的数据,咱们只能再从新算一遍。spa

这样的效率实在是过低了,因此咱们须要有一个办法,不只告诉咱们“我错了”,还能告诉咱们“错哪错了”。因而,计算机科学家们就发明了 纠错码。纠错码须要更多的冗余信息,经过这些冗余信息,咱们不只
能够知道哪儿的数据错了,还能直接把数据给改对。这个是否是听起来很神奇?接下来就让咱们一块儿来看一看。设计

2、海明码:咱们须要多少信息冗余?

最知名的纠错码就是海明码。海明码(Hamming Code)是以他的发明⼈Richard Hamming(理查德·海明)的名字命名的。这个编码方式早在上世纪四十年代就被发明出来了。一直到今天,咱们上一讲所说到的
ECC内存,也还在使用海明码来纠错。blog

最基础的海明码叫 7-4海明码。这里的“7”指的是实际有效的数据,一共是7位(Bit)。而这里的“4”,指的是咱们额外存储了4位数据,用来纠错。内存

首先,你要明一点点,纠错码的纠错能力是有限的。不是说无论错了多少位,咱们都能给纠正过来。否则咱们就不须要那7个数据位,只须要那4个校验位就行了,这意味着咱们能够不⽤数据位就能传输信息了。这就
不科学了。事实上,在7-4海明码里面,咱们只能纠正某1位的错误。这是怎么作到的呢?咱们⼀起来看看。it

4位的校验码,一共能够表示2^4=16个不一样的数。根据数据位计算出来的校验值,必定是肯定的。因此,若是数据位出错了,计算出来的校验码,必定和肯定的那个校验码不一样。那可能的值,就是在2^4-1=15
那剩下的15个可能的校验值当中。效率

15个可能的校验值,其实能够对应15个可能出错的位。这个时候你可能就会问了,既然咱们的数据位只有7位,那为何咱们要用4位的校验码呢?用3位不就够了吗?2^3-1=7,正好可以对上7个不一样的数据位啊!基础

你别忘了,单比特翻转的错误,不只可能出如今数据位,也有可能出如今校验位。校验位原本也是可能出错的。因此,7位数据位和3位校验位,若是只有单比特出错,可能出错的位数就是10位,2^3-1=7种状况是
不能帮咱们找到具体是哪一位出错的。计算机科学

事实上,若是咱们的数据位有K位,校验位有N位。那么咱们须要知足下面这个不等式,才能确保咱们可以对单比特翻转的数据纠错。这个不等式就是:原理

在有7位数据位,也就是K=7的状况下,N的最⼩值就是4。4位校验位,其实最多能够支持到11位数据位。我在下面列了一个简单的数据位数和校验位数的对照表,你能够本身算一算,理解一下上面的公式。

3、海明码的纠错原理

如今你应该搞清楚了,在数据位数肯定的状况下,怎么计算须要的校验位。那接下来,咱们就⼀起看看海明码的编码方式是怎么样的。

为了算起来简单一点,咱们少用一些位数,来算一个 4-3海明码(也就是4位数据位,3位校验位)。咱们把4位数据位,分别记做d一、d二、d三、d4。这里的d,取的是数据位data bits的首字母。咱们把3位校验位,
分别记做p一、p二、p3。这⾥的p,取的是校验位parity bits的首字母。

从4位的数据位里面,咱们拿走1位,而后计算出一个对应的校验位。这个校验位的计算用以前讲过的奇偶校验就能够了。好比,咱们用d一、d二、d3来计算出一个校验位p1;用d一、d三、d4计算出⼀个校验位p2;用
d二、d三、d4计算出一个校验位p3。就像下面这个对应的表格同样:

这个时候,你去想想,若是d1这一位的数据出错了,会发生什么状况?咱们会发现,p1和p2和校验的计算结果不同。d2出错了,是由于p1和p3的校验的计算结果不同;d3出错了,则是由于p2和p3;若是
d4出错了,则是p一、p二、p3都不同。你会发现,当数据码出错的时候,至少会有2位校验码的计算是不一致的。

那咱们倒过来,若是是p1的校验码出错了,会发⽣什么状况呢?这个时候,只有p1的校验结果出错。p2和p3的出错的结果也是同样的,只有一个校验码的计算是不一致的。

因此校验码不一致,一共有2^3-1=7种状况,正好对应了7个不一样的位数的错误。我把这个对应表格也放在下面了,你能够理解一下。

能够看到,海明码这样的纠错过程,有点儿像电影里面看到的推理探案的过程。经过出错现场的额外信息,一步一步条分缕析地找出,究竟是哪一位的数据出错,还原出错时候的“犯罪现场”。看到这里,相信你一方面会以为海明码特别神奇,可是同时也会冒出一个新的疑问,咱们怎么才能用一套程序或者规则来生成海明码呢?其实这个步骤并不复杂,接下来咱们就一块儿来看一下。

首先,咱们先肯定编码后,要传输的数据是多少位。好比说,咱们这里的7-4海明码,就是⼀共11位。而后,咱们给这11位数据从左到右进行编号,而且也把它们的二进制表示写出来。

接着,咱们先把这11个数据中的二进制的整数次幂找出来。在这个7-4海明码里面,就是一、二、四、8。这些数,就是咱们的校验码位,咱们把他们记录作p1~p4。若是从⼆进制的⻆度看,它们是这11个数当中,惟
四的,在4个比特里面只有一个比特是1的数值。那么剩下的7个数,就是咱们d1-d7的数据码位了。

而后,对于咱们的校验码位,咱们仍是用奇偶校验码。可是每个校验码位,不是用全部的7位数据来计算校验码。儿是p1用三、五、七、九、11来计算。也就是,在二进制表示下,从右往左数的第四位比特是1的状况
下,用p1做为校验码。

剩下的p2,咱们用三、六、十、11来计算校验码,也就是在二进制表示下,从右往左数的第二位比特是1的状况下,用p2。那么,p3天然是从右往左数,第三位比特是1的状况下的数字校验码。而p4则是第四位比特是
1的状况下的校验码。

这个时候,你会发现,任何一个数据码出错了,就至少会有对应的两个或者三个校验码对不上,这样咱们就能反过来找到是哪个数据码出错了。若是校验码出错了,那么只有校验码这一位对不上,咱们就知道是这
个校验码出错了。

上面这个方法,咱们能够用一段肯定的程序表示出来,意味着不管是几位的海明码,咱们都再也不须要人工去精巧地设计编码方案了。

4、海明距离:形象理解海明码的做用

其实,咱们还能够换一个角度来理解海明码的做用。对于两个二进制表示的数据,他们之间有差别的位数,咱们称之为海明距离。好比1001和0001的海明距离是1,由于他们只有最左侧的第⼀位是不一样的。而1001
和0000的海明距离是2,由于他们最左侧和最右侧有两位是不一样的。

因而,你很容易能够想到,所谓的进行一位纠错,也就是全部和咱们要传输的数据的海明距离为1的数,都能被纠正回来。

而任何两个实际咱们想要传输的数据,海明距离都至少要是3。你可能会问了,为何不能是2呢?由于若是是2的话,那么就会有一个出错的数,到两个正确的数据的海明距离都是1。当咱们看到这个出错的数的时
候,咱们就不知道究竟应该纠正到那一个数了。

在引如了海明距离以后,咱们就能够更形象地理解纠错码了。在没有纠错功能的状况下,咱们看到的数据就好像是空间里面的一个一个点。这个时候,咱们可让数据之间的距离很紧凑,可是若是这些点的坐标稍稍
有错,咱们就可能搞错是哪个点。

在有了1位纠错功能以后,就好像咱们把一个点变成了以这个点为中心,半径为1的球。只要坐标在这个球的范围以内,咱们都知道实际要的数据就是球⼼的坐标。而各个数据球不能距离太近,不一样的数据球之间要有
3个单位的距离。

 

 

5、总结延伸

好了,纠错码的内容到这⾥就讲完了。你可不要⼩看这个看起来简单的海明码。虽然它在上世纪40年代早早地就诞生了,不过直到今天的ECC内存里面,咱们还在使用这个技术方案。而海明也由于海明码得到了图灵奖。

经过在数据中添加多个冗余的校验码位,海明码不只可以检测到数据中的错误,还可以在只有单个位的数据出错的时候,把错误的一位纠正过来。在理解和计算海明码的过程当中,有一个很重要的点,就是不只原来的
数据位可能出错。咱们新添加的校验位,同样可能会出现单比特翻转的错误。这也是为何,7位数据位用3位校验码位是不够的,而须要4位校验码位。

实际的海明码编码的过程也并不复杂,咱们经过不不一样过的校验位,去匹配多个不一样的数据组,确保任何一个数据位出错,都会产生意个多个校验码位出错的惟一组合。这样,在出错的时候,咱们就能够反过来找到
出错的数据位,并纠正过来。当只有一个校验码位出错的时候,咱们就知道实际出错的是校验码位了。

相关文章
相关标签/搜索