软考-软件设计师-计算机组成与体系结构

一、数据的表示

1、进制转化

1、R进制转十进制:按权展开,将每一位数字用Rk表示然后相加,k与该位与小数点的距离有关,小数点左边第一位为0,右边第一位为-1,往左递增,网往右递减,如:二进制数10100.01=1*2^4+1*2^2+1*2^-2。

2、十进制转R进制: 短除法,即将十进制数除以R再取余,直至余数为零,然后将余数由下往上按顺序排列,小数位乘以R,每乘一次就取它的整数位(整数位为零时就取零),直至小数位为零,然后将取得的整数位由上往下排列即可。

例如将94转为2进制:

3、二进制转八进制或十六进制:将二进制数以小数点为界向左及向右每三个一组(转八进制),或者每四个一组(转十六进制),缺的数用零来补充,然后依次转化为相应的进制数然后按顺序排列即可。

八进制:变3为1

十六进制:变4为1

4、十六进制转二进制:将每位十六进制数用4位二进制表示。

5、八进制转二进制:将每位八进制数用3位二进制表示。

十六进制数的加减法的进/借位运算规则为:借一当十六,逢十六进一

十六进制加法:逢十六进一

十六进制减法:借一当十六

二进制数的加减法的进/借位运算规则:借一当二,逢二进一

二进制加法:逢二进一

0+0=0

0+1=1+0=1

1+1=0 (进位为1)

1+1+1=1 (进位为1)

二进制减法:借一当二

0-0=0

1-1=0

1-0=1

0-1=1 (借位为1)

2、原码反码补码移码

计算机用正数的原码表示正数,计算机用负数的补码表示负数,反码补码就跟正数没关,正数不需要他们,要是对正数进行按位取反根本得到的是另一个二进制数。

1.原码:二进制,首位表示正负,0表示正,1表示负。

2.反码:负数,原码的基础上,符号位不动,其他位取反。正数的反码与原码相同,负数的反码为原码除符号位外取反。

3.补码:负数,反码基础上,运算+1。正数的补码与原码相同,负数的补码为其反码加一,补码的补码就是原码。

4.移码:补码的基础上,符号位取反。

原码在计算机中进行加减不能得到正确的答案,反码、补码、移码运算符合正确答案。

反码的缺陷在于没有解决对于数字0的表示具有两种形式(即-0和+0)的问题。

补码解决了计算问题和0的表示不唯一问题,且因此补码的表示范围从原码反码的-127—127扩大到了-128—127(0就是+0,也就是0000 0000,-0也就是1000 0000用来表示-128),其中补码表示的-128没有对应的原码表达方式。

补码表示的数字中 0 是唯一的,不像原码有 +0 和-0 之分。

各数值表示范围:其中n一般等于8

原码:-127~127

反码:-127~127

补码:-128~127

注意:正数的原码=反码=补码,而负数都是通过补码表示的。

[+0]原码=0000 0000,   [-0]原码=1000 0000

[+0]反码=0000 0000,   [-0]反码=1111 1111

[+0]补码=0000 0000,   [-0]补码=0000 0000

你会发现,+0和-0的补码是一样的。即 0的补码只有一种表示。

-128,假如它有原码,且[-128]原码=1000 0000,假如让-128也有反码,求反操作,则[-128]反码=1111 1111,你会发现,-128的反码和-0的反码相同,所以为了避免面混淆,有了-0的原码,便不能有-128的原码补码。

-0的反码加1,看起来是无法计算了或者说溢出了一个1, 我们知道,在同余的概念里,没有溢出,只有类似于周期一样的模数,如13%12=1,12%12=0,打个比方:假设钟表从0时刻开始顺时针旋转,转了一圈后走到了12点,那么这个12点是该叫12点呢还是该叫0点呢?其实不重要,重要的是它回到了原位,但对于我们来说12和0就是两种数,它完完全全可以表示两个不同的数,假设用0去表示0,那么12就可以表示一个其他的数。补码中的-0和+0就是这个原理,-0的溢出实际上是一种假溢出,实际上就是+0,那么+0和-0就是一种东西,如果用+0的机器码去表示0,那么-0的机器码就可以表示一个其他的数字,这也是为什么用补码表示的数据范围要比原码和反码大1,就是大在了-0这个数上。

两数的补码和等于两数和的补码。

如果用原码表示,其符号位不能参加运算。因为人脑可以知道第一位是符号位, 在计算的时候我们会根据符号位进行加减。 但是对于计算机,加减乘数已经是最基础的运算了,设计得尽量简单。计算机辨别"符号位"显然会让计算机的基础电路设计变得十分复杂! 于是人们想出了将符号位也参与运算的方法。

补码运算规则:

(1)正数的最高位都是 0,正数的值就是二进制表示的值(原码反码补码相同)。

(2)负数的最高位都是 1,负数的值是取反加1,然后加个负号得到得值。

比如:原码00000001。最高位是0 为正数,那么表示的就是 十进制的 1。

比如:原码10000001。最高位是1 为负数,值是多少?取反加1 得到补码11111111,那么值为 -1,从原码就可以看出来,前面的1是负号,后面的1就是值1。

补码运算特征:

(1)因为使用补码可以将符号位和其他位统一处理,同时,减法也可以按加法来处理,即如果是补码表示的数,不管是加减法都直接用加法运算即可实现。

(2)两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。

补码设计目的:

(1)使符号位能与有效值部分一起参加运算,从而简化运算规则;

(2)加法运算比减法运算更易于实现,使减法运算转换为加法运算(机器中只有加法,减法会变成补码的加法),进一步简化计算机中运算器的线路设计

如:

127-128=-1,减法转换为补码的加法就是127+(-128)=-1

127的补码是0111 1111,-128的补码是1000 0000,加起来就是1111 1111(二进制加法逢二进一),而补码1111 1111的值就是取反加1得到-1。

采用补码表示还有另外一个原因,那就是为了防止0的机器数有两个编码。原码和反码表示的0有两种形式+0和-0,而我们知道,+0和-0是相同的。这样,8位的原码和反码表示的整数的范围就是-127~+127(11111111~01111111),而采用补码表示的时候,00000000是+0, 即0;10000000不再是-0,而是-128,这样,补码表示的数的范围就是-128~+127了,不但增加了一个数的表示范围,而且还保证了0编码的唯一性。

在计算机中用原码实现算术运算时,要取绝对值参加运算,符号位单独处理,这对乘除运算是很容易实现的,但对加减运算是非常不方便的,如两个异号数相加,实际是要做减法,而两个异号数相减,实际是要做加法。在做减法时,还要判断操作数绝对值的大小,这些都会使运算器的设计变得很复杂。而补码这种编码方式实际上正是针对上述问题的。通过用补码进行表示,就可以把减法运算化为加法运算。

原码的加减法:

十进制的表达式:1-1=0

二进制的表达式:1-1=1+ (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2

如果用原码表示,让符号位也参与计算,显然对于减法来说,结果是不正确的。这也就是为何计算机内部不使用原码表示1个数。为了解决原码减法的问题, 出现了反码。

反码的加减法:

十进制的表达式:1-1=0

二进制的表达式:1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0

发现如果用反码计算减法,结果是正确的。而唯一的问题其实就出现在"0"这个特殊的数值上。虽然人们理解上+0和-0是一样的,但是0带符号是没有任何意义的,而且会有[0000 0000]原和[1000 0000]原两个编码表示0。于是补码的出现, 解决了0的符号以及两个编码的问题。

补码的加减法:

1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补=[0000 0000]原=0

这样0用[0000 0000]表示, 而以前出现问题的-0则不存在了。而且可以用[1000 0000]表示-128,(-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]补 + [1000 0001]补 = [1000 0000]补

-1-127的结果应该是-128, 在用补码运算的结果中, [1000 0000]补 就是-128. 但是注意因为实际上是使用以前的-0的补码来表示-128, 所以-128并没有原码和反码表示。

使用补码, 不仅仅修复了0的符号以及存在两个编码的问题, 而且还能够多表示一个最低数. 这就是为什么8位二进制, 使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127]。

综上所述,因为机器使用补码, 对于编程中常用到的32位int类型, 可以表示的范围是 [-2^31, 2^31-1],因为第一位表示的是符号位,而使用补码表示时又可以多保存一个最小值。

有符号数和无符号数的范围:

8位无符号整数在计算机里表示为0000 0000-1111 11111,范围是[0,2^8 -1],0~255。

8位有符号整数的范围是-128 ~ 127。

注意:计算机采用了补码进行数值计算,从个数上可以这么解释:为了方便数值计算,计算机采用了补码,8位可以有2^8也就是256个补码,从0000 0000到0111 1111的补码用来表示0-127,已经128个数了(数值0也就是0000 0000 (无正负之分)),从1000 0001到1111 1111的补码用来表示整数-127到-1,又表示了127个数,8位可以有256个补码,而上面用了255个,表示了255个数值,还有一个补码没有用到,它是1000 0000,它不表示-0补码里规定0没有正负之分补码1000 0000应该是-128;但是它为什么不用来表示+128呢?按道理1000 0000不是-0,从0到+127对应补码0000 0000到0111 1111。那1000 0000也可以是+128啊!而且也能说得过去:

对于+128计算原码:0 1000 0000,减1:0 0111 1111,取反得+128补码:0 1000 0000,即1000 0000(8位表示,符号位0溢出了)

但是规定了最高位是符号位,所以1000 0000用来表示-128更合理,这样更容易实现!

即1000 0000,它不表示-0,也不表示+128,补码里规定0没有正负之分,0就是00000000,补码1000 0000表示的是-128,因为规定了最高位是符号位,所以1000 0000用来表示-128更合理。

在二进制中就把-0当作最小数-128用,也就是10000000。

-0的原码:10000000

-0的反码:11111111

-128的补码:10000000

-128,只有八位的补码,没有八位的原码和反码。

8位二进制的补码组合序列有256个,如下:

00000000-01111111

0~+127

10000000

这个二进制没有用到

10000001-11111111

-1~-127

再看看这个规律表:

原码

补码

01111111

01111111

+127

01111110

01111110

+126

……

……

……

00000001

00000001

+1

00000000

00000000

0

10000001

11111111

-1

10000010

11111110

-2

10000011

11111101

-3

……

……

……

11111111

10000001

-127

无法表达

10000000

-128

于是就有了规定 1000 0000 定为 -128的补码,这种定法和上面数学层面的表述是一致的。

这样规定后,负数的补码在机器中就好算了。

负数的补码计算:

将该负数取绝对值,再用二进制表示出这个绝对值 (不管符号位!)

对该二进制数进行取反加一操作就得到负数的补码了(也就是求补操作!)

-128 绝对值是 128

128的二进制表示为:

1000 0000

取反

0111 1111

加1

1000 0000

这就是-128的补码

这种办法算出的结果符合“规定值”。

总结:计算机用补码表示,正数不用管,负数的话,二进制的原码到补码和补码到原码的计算都是取反加1(补码的补码就是原码),具体的值就是拿到原码加上负号。

例题:

如果 “ 2X ”的补码是“ 90H ”,那么 X 的真值是(B)

A:72    B:-56   C:56    D:111

解析:H表示16进制,在C语言中是用0X表示, b是二进制数后缀,d是十进制数后缀。

90H化解为二进制:10010000,原码为11110000=-112,X=-56。

补码 =90h =10010000, 最高位是符号位,1表示负数,其余为数值位

反码 =10001111, 将补码减1,得反码

原码 =11110000, 将反码的数值位取反,得原码

原码值 = -1110000b = -7h = -112d

注意反码的运算,补码减1,也就是数值位的值16-1=15,表示为1111,前面补0,第一位是符号位,所以就变成10001111。

2、浮点数运算

浮点数的概念:浮点数即科学计数法,如1000=1X10^3; 其中,1为尾数,10为基数,3为指数。

M为尾数,e为指数,R为基数

浮点数的大小由阶码部分决定,而其精度由尾数部分决定,因此增加e的位数、减少M的位数可以扩大可表示的数的范围同时降低精度。

浮点数运算过程(小阶向大阶对齐,小阶尾数右移):

对阶规则一般为将低阶指数向高阶指数对等。如若结果的尾数小数点前的数字小于1或不小于十,则需要将结果格式化。

当两个指数不等的浮点数相加时,计算机会把低阶浮点数的指数转化为高阶浮点数的指数,如:1.0X10^3+1.19X10^2,计算机会将1.19X10^2转化为0.119X10^3,然后作和,然后结果格式化(即通过指数的转化保证尾数必须为非零的1位数)。如:11.3019X10^3,要化为1.13019X10^4。

二、中央处理器(CPU)

CPU主要由运算器、控制器、寄存器组和内部总线等部件组成。

运算器(ALU)

1、累加寄存器(AC):专门存放算术或逻辑运算的一个操作数和运算结果的寄存器,能进行加,减,读出,移位,求补等操作。

2、状态条件寄存器(PSW):存状态标志和控制标志,该部件用来存放两类信息,一类是体现当前指令执行结果的各种状态信息(条件码),如有无进位,有无溢出,结果正负,信息是否为零等;另一类是存放控制信息,如允许中断,跟踪标志等。

3、数据缓冲寄存器(DR):写内存时,暂存指令或数据。

控制器

1、程序计数器(PC):程序计数器中存放的是下一条指令的地址。由于多数情况下程序是顺序执行的,所以程序计数器设计成自动加一的装置。当出现转移指令时,就需重填程序计数器。

2、指令寄存器(IR):CPU正在执行的操作码表存放在这里,即当前正在执行的一条指令,位数取决于指令长度,对用户是完全透明的。

3、指令译码器(ID):将操作码解码,告诉CPU该做什么。

4、时序部件

5、地址寄存器(AR):保存当前CPU所访问的内存单元的地址,以便对内存的读写操作。

注:

CPU的寻址方式除了直接寻址以外还有多种寻址方式,目的是为了在效率和方便性上找一个平衡。

CPU根据指令周期的不同阶段来区分内存中以二进制编码形式存放的指令和数据。

指令最先进入到数据寄存器暂存起来,然后在拿到指令寄存器中,再交由指令译码器来解码进而运算(交给运算器),而这一过程一结束,就会迅速提取程序计数器中的指令(即下一条指令),因此,程序计数器中存储的始终是暂未执行的,下一条指令的“地址”

三、计算机体系结构分类(Flynn)

四、CISC与RISC(指令集)

五、流水线

1、流水线执行时间计算

图注:取执行时间最长的一段作为流水线周期为2ns,100条指令全部执行完毕需要的时间是3Δt + (100-1)*Δt=3*2+99*2=204ns

        这里指的都是常规标量单流水线处理机(处理机的度m=1,即取指,分析,执行一次只能处理一条指令,如上图,首先取指1,然后分析1,这个时候,取指这个部件可以做取指2,然后,执行1,这个时候,可以分析2,取指3,处理机的度m=2的话,那么最开始取指就可以有两个,取指1和2,然后分析1和2,这个时候可以取指3和4)

流水线多条指令执行时间计算公式:

1条指令执行时间+(指令条数-1)*流水线周期

2、流水线吞吐率计算

图注:极限求导公式,n趋于无穷,分子分母可以约掉,流水线周期是执行时间最长的操作。

K为流水线级数(比如取指、分析、执行三个操作就是3级流水线)

3、流水线加速比计算

4、流水线效率计算

这里的15△t也满足,4条指令执行的时间:6△t+(4-1)*3△t=15△t,流水线周期是执行时间最长的的一段操作,也就是S4的时间。

该流水线的效率:T0=24,kTk=60,等于0.4

注:所有步骤花费时间相等的指令执行的效率最高。

5、例题

六、存储系统

1、层次化存储结构

存储系统的设计主要是考虑存储容量、速度和成本之间的矛盾。

层次化存储:存储的速度从上到下逐渐变慢,存储的容量从上到小逐渐增加。

注:内存存储外存的部分内容,cache存储内存的部分内容,CPU只处理cache中的指令,cache的作用是精简内存中重复出现的指令,提高CPU的执行效率,使得计算机的运算速度得到极大的提升。

访问速度:通用寄存器>Cache>内存>外存

2、Cache

注:CPU会在cache中寻找它需要的数据,如果不能找到,CPU就将前往内存中寻找,而cache的访问命中率就是CPU需要的数据在cache中被找到的比例,未能找到的数据CPU将前往内存中进行再次寻找。

内存与cache地址映射的三种方式:cache与内存的地址映像方式有三种,分别:

直接映像(cache的区号与内存的区号一一对应),块冲突最大。

全相连映像(cache的一个块号可以对应多个内存的块号,内存的一个块号也可以对应cache的多个块号),块冲突最小。主存中的任意一块都可以映射到cache中任意一块,也就是说,当主存中的一块需求调入cache中时,可根据当时的cache的块占用或分配情况,选择一个快给主存块存储,所选的cache快可以是cache中的任意一块。

组相连映像(即两种方式相结合的方法),块冲突次之。

注:这三种映射方式都是计算机硬件自动完成的,不是软件。

替换算法:替换算法的目的是使cache获得尽可能高的命中率,有以下四种:

随机替换、先进先出、近期最少使用法、优化替换。

注:现代的计算机cache系统是分为了三个级别的,访问时先从第一层开始访问,直至三个级别的cache都被访问完全时才会访问内存。

虚拟存储器:即cpu在给出需要访问的内存地址时,给出的并不是真正的物理地址,而是物理地址的抽象,虚拟存储器是由主存-辅存这样的两级存储器组成。

3、Cache的局部性原理

时间局部性:例如上图S+=j这条代码是要执行1000000次的,如果将这段代码直接放入到Cache里面就会大大提高计算效率,如果没有在Cache里面,每一次都要调用主存储器的,这样的花销就会很大。

空间局部性:就是访问了一个存储空间以后,立即访问他的临近空间。

工作集理论:就是把经常访问的界面,放到一个集合里面。

4、主存储器

1、主存的分类

1.随机存取存储器:简称RAM,断电后所有数据都将清除,有两类RAM:静态的(SRAM)和动态的(DRAM),SRAM比DRAM速度更快,但价格也更贵。SRAM用来作为高速缓冲存储器(Cache)DRAM用来作为主存及图形系统的帧缓冲区。SRAM将每个位存储在一个双隐态的存储器单元中,DRAM将每个位存储为对一个电容的充电,由于电容非常小,在10~100ms时间内会失去电荷,所以需要周期性地刷新充电以保持信息。

2.只读存储器:简称ROM,断电后仍然能够存储信息

2、主存的编址

(1)B (2)A

图注:H表示十六进制,存储单元数量(内存地址)等于大的内存地址减去小的内存地址再加上11K=1024B,第一个空即为存储单元数量除以1024。

每个存储单元存放一个字节量(B)的数据,一个字节B(Byte)= 8个二进制位b(bit)。

图中例题详解:

C7FFFH-AC000H+1=1C000H,C7FFFH+1=C8000H,也就是C8-AC,根据16进制的减法运算规则,8-C不够,需要借1当16,那么就是8+16-C=12,由于C被借走一位就变成B,B-A=1,所以就是1C000H。

1C000H个内存地址单元,即1C000H个B,换算成K,则除以1024,即2^10

1C000 =

地址单元:

内存地址从AC000H到C7FFFH有112K个地址单元,每个地址单元存储16bit,则总容量是112K*16bit,所以该芯片每个存储单元存储112K*16bit/(28*16K)bit=4bit。

例题:

内存储器的芯片数量=内存储器的总容量/单个芯片的容量

32K×8bit的意思:指的是这个芯片能够存储32k*8(256K)个位(Bit)也就是32k个字节(Byte)。

内存容量=终止地址-起始地址+1

打个简单的比方,一队人从10编号到19,我们在计算人数时,应该是用19-10+1=10来表示,而不是用19-10=9来表示。

十六进制0xAF转换成十进制:175,A x 16+F x 160=175

注意:要将A和F转换成的数字看出一个整体,也就是10和15,所以是10乘以16的一次方加15乘以16的零次方,而不是1乘以16的三次方加1乘以16的一次方加5乘以16的零次方。

7FFFH + 1 = 8000H

F+1=0,向高位进1,7+1=8,F是15,也就是1111,+1就是16,也就是1 0000

例题:

七、磁盘结构与参数

1、磁盘结构

磁盘调度管理中,先进行移臂调度寻找磁道,再进行旋转调度寻找扇区。

磁道一般分为许多个小的扇形区,即物理块,磁头在依次读取这些物理块时(磁头必须依次读取),会在读取的同时将其存放进缓存区,缓存区可以是单个,也可以是多个,存放完成后会在缓存区花费时间进行处理,处理期间磁头的读取不会停止,因此,如果缓存区过少,就会出现:读取一个物理块花费了一个周期甚至更长的时间。

注意事项:

硬盘有数个盘片,每盘片两个面,每个面一个磁头

盘片被划分为多个扇形区域即扇区

同一盘片不同半径的同心圆为磁道

不同盘片相同半径构成的圆柱面即柱面

PS:单缓冲区说明读取信息后必须处理完才能存储下一个信息。

解析:

旋转周期为33ms,则旋转一个物理块所需时间3ms,磁盘是匀速不停歇的旋转,所以最差(即用时最长)是磁盘旋转一周处理一个物理块,最差的物理块排序如下图所示:

这种情况下,当磁盘从的开始位置旋转时,耗时3ms磁盘旋转到的结束位置,然后耗时3ms处理中的记录,处理完成后,磁盘刚好旋转到的结束位置。因为系统使用单缓冲区顺序处理这些记录,这时系统应该处理物理块的内容,所以磁盘需要旋转到的结束位置,用时33ms,这时物理块的内容读取出来了,然后再耗时3ms处理中的记录,这时磁盘已旋转至的结束位置...

这种情况下,处理这11个记录的耗时为(3+3)+(33+3)*10=366ms。

最好的情况是处理完一个物理块后,正好磁盘旋转到下一个要处理的物理块,即物理块的分布如下图所示:

这种情况下,总耗时为(3+3)*11=66ms。

所以,答案是C,B。

2、磁盘容量计算

非格式化容量=面数X(磁道数/面)X内圆周长X最大密度

格式化容量=面数X(磁道数/面)X(扇区数/面)X(字节数/扇区)

八、总线系统

总线是连接计算机有关部件的一组信号线,是计算机中用来传送信息代码的公共通道,广义地讲,任何连接两个以上电子元器件的导线都可以称为总线。

1、内部总线:计算书内部集成电路芯片内部各部分的连接的总线,属于芯片级别。

2、系统总线:构成计算机各组成部分(CPU、内存和接口等)的连接;

  1. 数据总线:如32位、64位等一次性能够传输的位。
  2. 地址总线:假设该计算机的地址总线为32位,那就代表它的地址空间为2^32个字节。
  3. 控制总线:发送相应的控制信号的总线。

PC、ISA、PCI、EISA都是系统总线

3、外部总线:即计算机和外部设备或计算机与计算机的链接的总线。

九、可靠性

1、串联系统=可靠性相乘

只要一个子系统失效,则整个系统都将失效

各子系统的可靠性为R1,R2,…,Rn,则系统的可靠性为

R=R1×R2×…×Rn

各子系统的失效率为λ1, λ2,…,λn,则系统的失效率为

λ=λ1+λ2+…+λn

1-可靠性=失效率,而总的失效率即为串联各个部件的失效率作和(近似计算)

2、并联系统=1-不可靠性相乘

少数子系统的失效将不会影响整个系统

各子系统的可靠性为R1,R2,…,Rn,则系统的可靠性为

R=1-(1-R1)×(1-R2)×…×(1-Rn)

各子系统的失效率都为λ,则系统的失效率为

1/U=1/λ (1+1/2+1/3+1/N)

3、N模冗余系统

数据输入n个子系统中,它们各自得出自己的结果,然后汇总到表决器,表决器将遵循少数服从多数的原则,输出大多数子系统得到的那个答案然后进行输出。

4、串并联混合系统

表格中可靠性公式还是很好理解的,串联系统就是所有的都可靠;并联系统就是至少有1路可靠,也就是1-所有支路同时不可靠;冗余系统就是从m条支路选出i条来,正好i条是可靠的,m-i条是不可靠的,然后i是从n遍历到m的,如三选二有两条以上可靠的时候系统就可靠,那么先从3个支路任选2个且这两个是可靠的,剩下的一个是不可靠的,算出其概率为u1,然后从3个支路里面选3个支路,且全可靠,算出概率为u2,那么3选2可靠的概率就是u1+u2了。

十、校验码

1、校验码的检错纠错原理(增加码距)

码距的作用:增大码距能够起到检错的作用,因为数据在传输的过程中如果链路出现了

问题,那么将会使得接收到的二进制数发生变化,若码距过小,则很可能造成信息的混淆,增大码距就使得被改变的二进制数混淆信息的概率极大的降低;若码距再进行增大,则能够起到纠错的作用,因为数据链路出错的概率比较低,只能造成传输中极少二进制数的改变,我们可以根据该传输失真的二进制数中大部分二进制数的构成来进行推断,推断出结果就达到了纠错的目的。

注:

在一个码组内为了检测e个误码,要求最小码距d应满足:d>=e+1

在一个码组内为了纠正t个误码,要求最小码距d应该满足:d>=2t+1

2、循环冗余校验码(CRC)—可检错不可纠错

循环冗余校验码在进行编码时,其编码的结果由数据位加校验位组成,数据位在前,校验位在后。

CRC的概念:在对信息进行编码的时候在其尾部加入一些校验信息,让编码后的数据能够与循环校验码的生成多项式相除余数为零,若不为零则说明传输过程出现了错误,其中,原码加上(增添在右方)校验信息加(做加法)上余数所得的码即为CRC。

  具体来说,CRC校验原理就是以下几个步骤:

(1)先选择(可以随机选择,也可按标准选择,具体在后面介绍)一个用于在接收端进行校验时,对接收的帧进行除法运算的除数(是二进制比较特串,通常是以多项方式表示,所以CRC又称多项式编码方法,这个多项式也称之为“生成多项式”)。

(2)看所选定的除数二进制位数(假设为k位),然后在要发送的数据帧(假设为m位)后面加上k-1位“0”,然后以这个加了k-1个“0“的新帧(一共是m+k-1位)以“模2除法”方式除以上面这个除数,所得到的余数(也是二进制的比特串)就是该帧的CRC校验码,也称之为FCS(帧校验序列)。但要注意的是,余数的位数一定要是比除数位数只能少一位,哪怕前面位是0,甚至是全为0(附带好整除时)也都不能省略。

(3)再把这个校验码附加在原数据帧(就是m位的帧,注意不是在后面形成的m+k-1位的帧)后面,构建一个新帧发送到接收端,最后在接收端再把这个新帧以“模2除法”方式除以前面选择的除数,如果没有余数,则表明该帧在传输过程中没出错,否则出现了差错。

  CRC校验中有两个关键点:一是要预先确定一个发送端和接收端都用来作为除数的二进制比特串(或多项式);二是把原始帧与上面选定的除进行二进制除法运算,计算出FCS。前者可以随机选择,也可按国际上通行的标准选择,但最高位和最低位必须均为“1”。

注(1):生成多项式是一个二进制数,如"X^4+X^3+X+1",这个生成多项式实际上就是二进制数11011;在相除时,需在原码后方添加一些0,添加的0的个数等于生成多项式的位数减去1,增加的0即为校验信息。

注(2):二进制的除法与算术除法相似,唯一不同的是所得除数在作减法时,减得的值要取绝对值,即0-1=1;这样使得整个除法运算中不存在借位。

X^4+X^3+X+1:多项式生成的二进制序列位数是最高次幂加一也就是4+1=5,意思就是除数有5位数,即从第0位开始到第4位,多项式中为0的位已经省略,这个多项式的原式应该为X^4+X^3+0^2+X^1+X^0,也就是11011。

多项式生成除数序列:11011

原始数据补零:11001010101 0000 (除数为5位,故补4个0)

11001010101 0000  除以  11011  =  0011,即校验码:0011

3、海明校验码—即可检错也可纠错

校验位永远位于2的N次方的位置

        将得到的信息的校验码位(如000)与发送信息的校验码位(如001)进行异或(相同为0,不同为1),可得到错误信息的位置(为1则是错误的)。需要注意的是:只有一组校验结果出现差错时,则肯定只是对应的校验位出了差错。

1.概念:海明码是一种利用奇偶性进行检错和纠错的校验码,是一种插入到信息中的编码,一般为多个码,其插入的位置满足规律:2r>=m+r+1;其中,m为信息的数据位个数,r为校验码的个数,而插入信息的位置则是2^r-1,2^r-2……2^0,如r=3时,校验码就插在1,2,4位置;

2.校验码的计算:如信息1011,根据公式得出其校验码分别放在1,2,4位,因此其海明码将有7位数,其中3,5,6,7位即为信息位,将3写为2^0+2^1;将5写为2^0+2^2.......将四个信息的位数用此方法表示以后可得到校验位的值的计算公式:r0=i4&i3&i2;r1=i4&i3&i1.r2=i4&i3&i2;其中,r表示校验位的值,且从0开始计数;在信息位被2^表示以后,将都有2^2的信息位进行异或操作并将值赋给r2,将都有2^1的信息位进行异或操作并将值赋给r1,r0也一样操作,&符号即为异或,在异或操作中,二者值相同即等于1,不同即等于0,而ix则是将其信息位施以一种运算:信息位所处的位置为奇数就将其赋值为1,信息位所处的位置为偶数就将其赋值为0,因此i4=1,i3=0,i2=1,i1=1;

3.海明校验码的作用:将信息转换为海明校验码形式以后,我们就能进行纠错,如信息1011,其海明校验码的正确形式为1010101,若收到了1011101,我们可以将两个数的校验码位的数提取出来,并在对应位置进行异或运算,如该例得到了001,则说明第1位出错了,若得到了010,则说明第二个信息位出错了。

4、奇偶校验码

1.概念:一个码距为1的编码系统加上一位奇偶校验码后,码距就变成了2。产生奇偶校验时将信息数据的各位进行模二加法(即异或运算,相同则和为0,相反则和为1),直接使用这个加法的结果称为奇校验。把这个加法值取反后作为校验码的称为偶校验。从直观的角度而言,奇校验的规则是:信息数据中各位中1的个数为奇数,校验码为1,否则校验码为0,偶校验则相反;

2.奇偶校验码的作用:使用一位奇偶校验码的方法可以检测出一个奇数或偶数位的错误,但无法判断是哪一位出现错误,当错误数超过一个时奇偶校验就无法检测出来,所以奇偶校验常用于对少量数据的校验,这种校验方式在通信领域被广泛采用。

十一、其他类型

1、CPU的中断响应时间

2、指令寻址

-+

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值