深入浅出计算机组成原理:数据完整性(下)-如何还原犯罪现场(第50讲)

一、引子

讲完校验码之后,你现在应该知道,无论是奇偶校验码,还是CRC这样的循环校验码,都只能告诉我们一个事情,就是你的数据出错了。所以,校验码也被称为检错码(Error Detecting Code)。

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

这样的效率实在是太低了,所以我们需要有一个办法,不仅告诉我们“我错了”,还能告诉我们“错哪错了”。于是,计算机科学家们就发明了 纠错码。纠错码需要更多的冗余信息,通过这些冗余信息,我们不仅
可以知道哪儿的数据错了,还能直接把数据给改对。这个是不是听起来很神奇?接下来就让我们一起来看一看。

二、海明码:我们需要多少信息冗余?

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

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

首先,你要明一点点,纠错码的纠错能力是有限的。不是说不管错了多少位,我们都能给纠正过来。不然我们就不需要那7个数据位,只需要那4个校验位就好了,这意味着我们可以不?数据位就能传输信息了。这就
不科学了。事实上,在7-4海明码里面,我们只能纠正某1位的错误。这是怎么做到的呢?我们?起来看看。

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位数据位。我在下面列了一个简单的数据位数和校验位数的对照表,你可以自己算一算,理解一下上面的公式。

三、海明码的纠错原理

现在你应该搞清楚了,在数据位数确定的情况下,怎么计算需要的校验位。那接下来,我们就?起看看海明码的编码方式是怎么样的。

为了算起来简单一点,我们少用一些位数,来算一个 4-3海明码(也就是4位数据位,3位校验位)。我们把4位数据位,分别记作d1、d2、d3、d4。这里的d,取的是数据位data bits的首字母。我们把3位校验位,
分别记作p1、p2、p3。这?的p,取的是校验位parity bits的首字母。

从4位的数据位里面,我们拿走1位,然后计算出一个对应的校验位。这个校验位的计算用之前讲过的奇偶校验就可以了。比如,我们用d1、d2、d3来计算出一个校验位p1;用d1、d3、d4计算出?个校验位p2;用
d2、d3、d4计算出一个校验位p3。就像下面这个对应的表格一样:

这个时候,你去想一想,如果d1这一位的数据出错了,会发生什么情况?我们会发现,p1和p2和校验的计算结果不一样。d2出错了,是因为p1和p3的校验的计算结果不一样;d3出错了,则是因为p2和p3;如果
d4出错了,则是p1、p2、p3都不一样。你会发现,当数据码出错的时候,至少会有2位校验码的计算是不一致的。

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

所以校验码不一致,一共有2^3-1=7种情况,正好对应了7个不同的位数的错误。我把这个对应表格也放在下面了,你可以理解一下。

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

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

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

然后,对于我们的校验码位,我们还是用奇偶校验码。但是每一个校验码位,不是用所有的7位数据来计算校验码。儿是p1用3、5、7、9、11来计算。也就是,在二进制表示下,从右往左数的第四位比特是1的情况
下,用p1作为校验码。

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

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

上面这个方法,我们可以用一段确定的程序表示出来,意味着无论是几位的海明码,我们都不再需要人工去精巧地设计编码方案了。

四、海明距离:形象理解海明码的作用

其实,我们还可以换一个角度来理解海明码的作用。对于两个二进制表示的数据,他们之间有差异的位数,我们称之为海明距离。比如1001和0001的海明距离是1,因为他们只有最左侧的第?位是不同的。而1001
和0000的海明距离是2,因为他们最左侧和最右侧有两位是不同的。

于是,你很容易可以想到,所谓的进行一位纠错,也就是所有和我们要传输的数据的海明距离为1的数,都能被纠正回来。

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

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

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

五、总结延伸

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

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

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

原文地址:https://www.cnblogs.com/luoahong/p/11442996.html

时间: 2024-08-30 10:29:00

深入浅出计算机组成原理:数据完整性(下)-如何还原犯罪现场(第50讲)的相关文章

深入浅出计算机组成原理

课程目录:第00课.开篇词丨为什么你需要学习计算机组成原理?.rar第01课.冯-诺依曼体系结构:计算机组成的金字塔.rar第02课.给你一张知识地图,计算机组成原理应该这么学.rar第03课.通过你的CPU主频,我们来谈谈“性能”究竟是什么?.rar第04课.穿越功耗墙,我们该从哪些方面提升“性能”?.rar第05课.计算机指令:让我们试试用纸带编程.rar第06课.指令跳转:原来if.rar第07课.函数调用:为什么会发生stackoverflow?.rar第08课.ELF和静态链接:为什么

深入浅出计算机组成原理:通过你的CPU主频,我们来谈谈“性能”究竟是什么?(第3讲)

一.性能到底指的是什么? 买新电脑的时候,我们会说:"原来的电脑性能跟不上了" 写程序的时候,我们会说:"这个程序西能需要优化一下" 1."性能"到底指的是什么? 在计算机组成原理乃至体系结构中"性能"都是最重要的一个主题.我在前面说过学习和研究计算机组成原理,就是在理解计算机是怎么运作的, 以及为什么要这么运作."为什么"?所要解决的事情,很多时候就是提升"性能" 2.性能有几个指标?

深入浅出计算机组成原理:GPU(下)-为什么深度学习需要使用GPU?(第31讲)

一.引子 上一讲,我带你一起看了三维图形在计算机里的渲染过程.这个渲染过程,分成了顶点处理.图元处理.栅格化.片段处理,以及最后的像素操作.这一连串的过程, 也被称之为图形流水线或者渲染管线. 因为要实时计算渲染的像素特别地多,图形加速卡登上了历史的舞台.通过3dFx的Voodoo或者NVidia的TNT这样的图形加速卡,CPU就不需要再去处理一个个像素点的图元处理.栅格化和片段处理这些操作.而3D游戏也是从这个时代发展起来的. 你可以看这张图,这是“古墓丽影”游戏的多边形建模的变化.这个变化,

深入浅出计算机组成原理:设计?型DMP系统(下)-SSD拯救了所有的DBA(第53讲)

一.上节总结回顾 上一讲里,根据DMP系统的各个应用场景,我们从抽象的原理层面,选择了AeroSpike作为KV数据库,Kafka作为数据管道,Hadoop/Hive来作为数据仓库. 不过呢,肯定有不信邪的工程师会问,为什么MongoDB,甚至是MySQL这样的文档数据库或者传统的关系型数据库不适应呢?为什么不能通过优化SQL.添加缓存这样的调优手段,解决这个问题呢? 今天DMP的下半场,我们就从数据库实现的原理,一起来看一看,这背后的原因.如果你能弄明表今天的这些更深入.更细节的原理,对于什么

深入浅出计算机组成原理:异常和中断-程序出错了怎么办?(第28讲)

一.引子 过去这么多讲,我们的程序都是自动运行且正常运行的.自动运行的意思是说,我们的程序和指令都是一条条顺序执行,你不需要通过键盘或者网络给这个程序任何输入.正常运行是说,我们的程序都是能够正常执行下去的,没有遇到计算溢出之类的程序错误. 不过,现实的软件世界可没有这么简单.一方面,程序不仅是简单的执行指令,更多的还需要和外部的输入输出打交道.另一方面,程序在执行过程中,还会遇到各种异常情况,比如除以0.溢出,甚至我们自己也可以让程序抛出异常. 那这一讲,我就带你来看看,如果遇到这些情况,计算

深入浅出计算机组成原理:32-FPGA、ASIC和TPU(上)-计算机体系结构的黄金时代(第32讲)

一.引子 过去很长一段时间里,大家在讲到高科技.互联网.信息技术的时候,谈的其实都是“软件”.从1995年微软发布Windows 95开始,高科技似乎就等同于软件业和互联网.著名的风险投资基金Andreessen Horowitz的合伙人Marc Andreessen,在2011年发表了一篇博客,声称“Software is Eating the World”.Marc Andreessen,不仅是投资人,更是Netscape的创始人之一.他当时的搭档就是我们在前两讲提过的SGI创始人Jim C

深入浅出计算机组成原理:解读TP-设计和拆解一块ASIC芯片(第33讲)

一.引子 过去几年,最知名.最具有实用价值的ASIC就是TPU了.各种解读TPU论文内容的文章网上也很多.不过,这些文章更多地是从机器学习或者AI的角度,来讲解TPU. 上一讲,我为你讲解了FPGA和ASIC,讲解了FPGA如何实现通过“软件”来控制“硬件”,以及我们可以进一步把FPGA设计出来的电路变成一块ASIC芯片. 不过呢,这些似乎距离我们真实的应用场景有点儿远.我们怎么能够设计出来一块有真实应用场景的ASIC呢?如果要去设计一块ASIC,我们应该如何思考和拆解问题呢?今天,我就带着你一

深入浅出计算机组成原理:Superscalar和VLIW-如何让CPU的吞吐率超过1?(第26讲)

一.引子 到今天为止,专栏已经过半了.过去的20多讲里,我给你讲的内容,很多都是围绕着怎么提升CPU的性能这个问题展开的.我们先回顾一下第4讲,不知道你是否还记得这个公式: 程序的CPU执行时间 = 指令数 × CPI × Clock Cycle Time 这个公式里,有一个叫CPI的指标.我们知道,CPI的倒数,又叫作IPC(Instruction Per Clock),也就是一个时钟周期里面能够执行的指令数,代表了CPU的吞吐率.那么,这个指标,放在我们前面几节反复优化流水线架构的CPU里,

深入浅出计算机组成原理:SIMD:如何加速矩阵乘法?(第27讲)

一.引子 上一讲里呢,我进一步为你讲解了CPU里的“黑科技”,分别是超标量(Superscalar)技术和超长指令字(VLIW)技术. 超标量(Superscalar)技术能够让取指令以及指令译码也并行进行:在编译的过程,超长指令字(VLIW)技术可以搞定指令先后的依赖关系,使得一次可以取一个指令包. 不过,CPU里的各种神奇的优化我们还远远没有说完.这一讲里,我就带你一起来看看,专栏里最后两个提升CPU性能的架构设计.它们分别是,你应该常常听说过的 超线程(Hyper-Threading)技术