软考
数据
进制的转换
大多数进制转十进制基本使用按权展开法
例如
二进制:
七进制:
十进制转其他进制使用短除法,得出结果从下至上,如果是十进制转六进制则不是除以二,是除以六
例如:
二进制转八进制与十六进制(每三个二进制位对应一个八进制位,每四个二进制位对应一个十六进制位)
十六进制10是A,11是B,12是C,13是D,14是E,15是F
数据的表示(原码,反码,补码,移码)
(看的眼睛疼所以四个隔一个空格)
1 | -1 | 1-1(将1和-1相加) | |
---|---|---|---|
原码 | 0000 0001 | 1000 0001 | 1000 0010 |
反码 | 0000 0001 | 1111 1110 | 1111 1111 |
补码 | 0000 0001 | 1111 1111 | 0000 0000 |
移码 | 1000 0001 | 0111 1111 | 1000 0000 |
原码:开头首位数字是符号位,正数为0,负数为1
反码:开头首位数字是符号位,正数为0,负数为1,正数和原码相同,负数则将原本除了符号位以外的数字取反
补码:正数和原码反码相同,负数则是在反码的基础上+1
移码:特定场合可用,一般用作于浮点计算的对阶,正数的移码是在补码正数的基础上首位取反,负数也一样,首位取反
数据的范围(原码,反码,补码)
范围 | |
---|---|
原码 | |
反码 | |
补码 | |
题:一个字节的原码,反码,补码的取值范围是多少?
一个字节=8bit
n=8
原码和反码的范围为
= -127~127
而补码
= -128~127
问:为什么补码会比反码原码多一个呢?
原码开头首位是符号位,所以是可以出现 1000 0000和 0000 0000 ,他们都是0,只不过一个是正0和负0,有两个不同的0
反码正数和原码一样,所以正0是0000 0000 ,负0则是 1111 1111,是两个不同的0
补码的正数0是0000 0000 ,负0是反码的负数基础上+1,也是00000000,只有一个0
浮点数运算
M是尾数,e是指数,R基数
例如
1000 ——> 1.0 * 10^3
+ +
119 ——> 1.19 * 10^2
1.0和1.19是尾数
10是基数
三次方和平方是指数
他们计算的过程为:
- 对阶
- 尾数计算
- 结果格式化(小数点前只能是个数并且不能为零)
第一步
1.0 * 10^3
0.119 * 10^3
第二步
1.119 * 10^3
计算机结构
计算机体系结构分类 (Flynn)
指令系统(CISC与RISC)
CISC是复杂指令系统计算机
RISC是精简指令系统计算机
流水线的基本概念
一个指令的执行过程是:
流水线则是指程序执行时多条指令重叠进行操作的一种准并行处理实现技术,各个部件同时处理时针对不同的指令而言,它们可同时为多条指令的不同部分进行工作,以提高各部件的利用率和指令的平均执行速度
流水线周期及流水线执行时间计算
流水线周期是执行时间最长的一段
流水线计算公式为:
1条指令执行时间+(指令条数-1)* 流水线周期(把取指分析执行视为三段,选择其中最长的一段就是流水线周期)
①理论公式:(t1+t2+…+tk)+(n-1)*Δt
②实践公式: (k+n-1)*Δt
(k是将指令分成了几部分就是几)
题目:若指令流水线把一条指令分为取指,分析和执行三部分,且三部分的时间分别是取指2ns,分析2ns,执行1ns,那么流水线周期是多少?100条指令全部执行完毕需要的时间是多少?
流水线周期是2ns
理论公式答案如下:
(2+2+1)+(100-1)*2=203
实践公式答案如下:
(3+100-1)*2=204
流水线吞吐率计算
流水线的吞吐率是指在单位时间内流水线所完成的任务数量或输出的结果数量。
计算流水线吞吐率的最基本的公式如下:
流水线最大吞吐率:
题目:若指令流水线把一条指令分为取指,分析和执行三部分,且三部分的时间分别是取指2ns,分析2ns,执行1ns,那么执行一百条指令的时间是多少?吞吐率又是多少?最大吞吐率又是多少?
(2+2+1)+(100-1)*2=203
一百条指令耗费的时间是203秒,它的吞吐率为100/203,最大吞吐率是1/2
流水线加速比计算
就是完成同一批任务,有用流水线和没用流水线的时间之比称为流水线的加速比,其基本公式如下:
题目:若指令流水线把一条指令分为取指,分析和执行三部分,且三部分的时间分别是取指2ns,分析2ns,执行1ns,那么执行一百条指令的l流水线加速比是多少?
不使用流水线的执行时间=(2+2+1)* 100=500
使用流水线的执行时间=5 + (100-1)*2 =203
加速比=500/203
流水线效率
流水线效率是指流水线的设备利用率,在时空图上,流水线的效率定义为n个任务占用的时空区与k个流水段总的时空区之比
人话讲就是一个时间段内,有分指令用到的时间片,和没用到的时间片,我们把用到的时间片除以总时间片,就可以得知我们这个流水线的效率是多少
公式如下:
题目:
假设一条指令分为了4个部分,如下
那么连续处理4个任务的流水线效率是多少?
4个任务占用的时空区为:
(△t+△t+△t+3△t) * 4=24△t
4个流水段的总的时空区为:
(△t+△t+△t+3△t)+(4-1) * 3=15△t
15△t*4=60△t
流水线效率为:
24△t/60△t
解析:
层次化存储结构
Cache基本概念
Cache的功能:提高CPU数据输入输出的速率,即CPU与存储系统间数据传送带宽限制
在我们引入Cache之后,要探究的就是如何来计算使用Cache加储存这种梯度式层次性的存储体系的存取的平均周期时间
如果以h代表Cache的访问命中率(命中率是Cache能否成功读出数据的概率),t1表示Cache的周期时间,t2表示主存储器时间,以读操作为例,使用"Cache+主存储器"的系统的平均周期为t3,则:
t3=h * t1 + (1-h) t2*
其中(1-h)又称呼为失效率
如果只使用Cache,则它的平均存储时间则是t1,会相当快,可是不实际,因为成本昂贵,如果只使用主存储器,它的平均时间则是t2,会慢下来,所以以"Cache+主存储器"中和了两点,也是最符合现实的体系。
题目:假如Cache的命中率为百分之50%,Cache的周期为10ns,主存储器的周期为50ns,使用"Cache+主存储器"的系统的平均周期为?
10*50%+(1-50%)*50=30ns
如果全部使用Cache来进行存储,那么平均周期时间为10ns,如果只用主存储则平均周期时间为50ns,结合在一起用的话,平均时间只有30ns
局部性原理
局部性原理主要是计算机在处理相关的数据和程序的时候,一般都会有某一个时段集中的去访问某些指令或者是集中的读取某个空间里的数据
随机存储器与只读存储器
主存可以分为随机存取存储器和只读存储器
我们常说的内存就是随机存取存储器
随机存取存储器一旦断电则里面的内存清除
只读存储器断电后依旧会保留数据
编址
这是一个八个地址单元乘以4个bit位的存储器
16个地址单元乘以8个bit位的存储器
题目如下:
求有多少个地址单元,只要把大的十六进制减掉小的十六进制加一就行
C7FFFH+1=C8000H
C8000H-AC000H=1C000H
1C000H=65536+49152=114688
114688/1024=112
内存地址按16bit编制,那么它能存储1792
1792又由28片能存储x bit的16k存储单元组成(相当于16* x的存储器)
那么
1792/28/16=4=x
该芯片每个存储单元能存储4bit
磁盘工作原理
旋转周期位33ms,相当于转一个扇区为3ms,单缓冲也需要3ms,当R0读完花了3ms,磁头此时在R0和R1之间,可是R0还需要处理,可是在处理的过程中,针头不会卡在R0和R1的中间,他会继续转,要旋转一圈花费33ms才能开始读R1,R1读完花了3ms接着处理,没办法及时读入R2,以此类推,需要再转一圈才能读R2
(33ms+3ms)* 10 + 3ms + 3ms=
(转一圈+转一个扇区)重复十次这样的操作,到R10为止,然后读R10花费3ms,处理3ms
所以花费了366ms
优化完存储顺序,磁面变成了
R0读完处理完花费了6ms,刚好处理完后就可以开始读入R1并开始处理也花费6ms,以此类推,刚好需要处理11个
6*11=66ms
所以花费了66ms
总线
假设当前系统是三十二位,那么该系统的字就是三十二bit位,则总线它的宽度就是三十二个bit位,
数据总线顾名思义传输数据的,一个周期能够传输的数据量就是三十二个bit位
地址总线,如果是三十二位,那么就代表它的地址空间是二的三十二次方,也就是4G
串联系统与并联系统可靠度计算
串联系统
因为串联系统是一条线过去,所以中途但凡有个节点失效则整个系统失效所以可考虑是通过累乘,失效率通过累加
R是可靠率,通过累乘得出,就是每个环节的成功率累乘就是可靠率,另一个是失效率,累加,只不过是近似值,准确点的话就是1-可靠率即可
并联系统
并联系统是分开的,哪怕其中一个节点失效其他节点依旧可以继续,所以要所有节点同时失效的情况下,并联系统才会失效,所以要累乘失败率,然后减去失败率才会得出成功率
R依旧是可靠率,公式就是100%-失败率
,另一个是失效率,只不过失效率通常不这样计算,太麻烦了,直接1-成功率就是失效率了
模冗余系统与混合系统
模冗余系统是通过表决器来进行得出数据的,该系统节点有三个,假如R1得出1,R2得出1,R3得出2,此时表决器会得出1,通过该方法有效的提高了效率的同时提高了可靠率
校验码
CRC循环校验码解题步骤
这是一种可以用作检错都并不适用纠错的编码,解题之前要有两个预备知识:
1.数据链路层的三个基本问题(封装成帧,透明传输,差错控制)
其中差错控制就是涉及到CRC循环校验码
2.异或运算
就是相同为0不如为1
比如
1001010
0111010
通过异或运算后得出
1110000
解题步骤:
- 根据生成多项式P(X)确定除数P
- 根据P(X)的最高阶补0
- 让信息(补0后)与除数P进行异或运算
- 得余数补位数
例子:
M=101110 P(X)=X³+1
第一步(根据生成多项式P(X)确定除数P):
P(X)=X³+1=1 * X³+0 * X²+0 * X¹+1 * X⁰=1001
(简单理解就是多少次方有存在,在多少次方的位置就是1)
第二步(根据P(X)的最高阶补0):
M=101110 000
第三步(让信息(补0后)与除数P进行异或运算):
M:1 0 1 1 10000
P: 1 0 0 1
M :0 0 1 0 10 (异或运算结果)
P : 1 0 0 1
M: 0 0 1 1 (异或运算结果)
M: 1 1 0 0 (补零)
P : 1 0 0 1
M: 0 1 0 1 (异或运算结果)
M: 1 0 1 0 (补零)
P: 1 0 0 1
M: 0 0 1 1 (得余数)
第四步(得余数补位数):
M=101110 000进行补余数
CRC的检验码为:101110011
海明校验码
海明码公式如下
r是检验码位数,k是信息位数,例如给一个1011的信息,那么它的信息位就是4
步骤如下:
- 根据信息位和公式得出检验码位数
- 通过2的检验码位数次方以此获得检验码所在位置
- 将信息位和检验位填入表格
- 通过信息位的异或运算得出检验码
- 合并为海明码
- 如需差错纠错则在第四步的基础上额外
例如:
信息位为1011
得出r最小值为3
所以检验码的位置分别在
2的0次方,2的一次方,2的二次方
1 | 2 | 3 | 4 | 5 | 6 | 7 | |
---|---|---|---|---|---|---|---|
信息位 | 1 | 1 | 0 | 1 | |||
检验位 | r0 | r1 | r2 |
接下来通过信息位的异或运算求检验位的数字
r0=1 ⊕ 1 ⊕ 1 =1
r1=1 ⊕ 0 ⊕ 1 =0
r2=1 ⊕ 0 ⊕ 1 =0
得出
1 | 2 | 3 | 4 | 5 | 6 | 7 | |
---|---|---|---|---|---|---|---|
信息位 | 1 | 1 | 0 | 1 | |||
检验位 | 1 | 0 | 0 |
海明码为1010101
那么海明码是如何差错纠错的呢?假如我们此时对方接受的信息为1011101
r0=1 ⊕ 1 ⊕ 1 ⊕ r0=1 ⊕ 1 ⊕ 1 ⊕ 1=0
r1=1 ⊕ 0 ⊕ 1 ⊕ r1=1 ⊕ 0 ⊕ 1 ⊕ 0=0
r2=1 ⊕ 0 ⊕ 1⊕ r2 =1 ⊕ 0 ⊕ 1⊕ 1 =1
没错的话,通过异或运算得出的结果会是0,有错则是1,得出r2的检错码有误,传递的值不对