一、计算机系统概述

1.冯诺依曼体系结构

  • 由运算器、控制器、存储器、输入设备和输出设备五部分组成

  • 图解如下:

2. 计算机系统的组成

  • 硬件系统组成
    • 存储器:存放程序和数据(以二进制形式存放),按地址访问;
    • 运算器:执行算术运算和逻辑运算;
    • 控制器:根据指令的操作码、指令执行过程中的条件状态、时序系统等三方面的因素来产生指令执行过程中所需要的控制信号,控制数据的存取和程序的执行;
    • 输入设备:将信息输入到计算机的外部设备,如键盘、鼠标等;
    • 输出设备:输出计算机处理结果的外部设备。如显示器、打印机等。
  • 软件系统组成
    • 应用软件:解决应用问题的程序集合,如数据处理程序、情报检索程序等;
    • 系统软件:管理和调度计算机,以方便用户使用计算机并提高计算机使用效率的程序的集合,包括:
      • 操作系统
      • 程序设计语言处理程序:编译器,汇编器,解释器
      • 数据库管理系统

3.计算机的性能指标

(1)基本性能指标

  • 字长:$ CPU $一次处理的数据位数,一般与计算机内部寄存器、运算器、数据总线的位宽相等,影响计算精确度和数据的表示范围与精度;
  • 主存容量:主存能存储的最大信息量,由$ \underline{M\times N} $表示,其中$ M $表示字容量(存储单元数),$ N $表示位容量(每个存储单元的二进制位数)。

(2)与时间有关的性能指标

  • 时钟周期:时钟频率(主频)的导数,是计算机处理操作最基本的时间单位;

  • $ CPI $:执行每条指令所需的平均时钟周期数;

    约定$ IC $表示所有指令的总条数,$ m $表示程序执行所需时钟周期数,$ P_{i} $表示某类指令的使用频率,$ IC_{i} $表示某类指令的条数,则满足$ CPI=\frac{m}{IC}=\sum\limits_{i=1}^{n}(CPI_{i}\times P_{i})=\sum\limits_{i=1}^{n}(CPI_{i}\times \frac{IC_{i}}{IC}). $

  • $ IPC $:每个时钟周期$ CPU $能执行的指令条数;
    $ IPC $满足:$ IPC=\frac{1}{CPI}. $
  • $ CPU $时间:程序执行期间真正消耗$ CPU $的时间(包括用户$ CPU $时间和系统$ CPU $时间);

    约定$ T $表示时钟周期时长,$ f $表示$ CPU $主频,则某段程序$ CPU $时间可表示为$ T_{cpu}=m\times T=\frac{m}{f}=CPI\times IC\times T=\frac{CPI\times IC}{f}. $

  • $ MIPS $:每秒钟执行的百万条指令数;

    约定$ f'=f\times 10^{6} $,则$ MIPS=\frac{IC}{T_{cpu}\times 10^{6}}=\frac{f}{CPI\times 10^{6}}=IPC\times f'. $

  • $ MFLOPS $:每秒钟执行的浮点运算次数。

4.计算机系统的层次结构

二、数据信息的表示

1.数值数据的表示

(1)数值与机器码

  • 数据格式是指使用二进制编码表示实际数据的结构形式,分类如下:
分类依据 具体分类
是否有符号位 无符号数和有符号数
小数点位置 定点数和浮点数
  • 定点数和浮点数比较如下:

    • 定点数:包括定点整数和定点小数
      • 定点小数:小数点位置在最高数位之前(符号位之后)
      • 定点小数:小数点位置在最低数位之后
      • 定点整数存在上溢问题(超出表示范围)
      • 定点小数存在精度溢出问题(超出表示精度)
    • 浮点数
      • 表示方法:两个定点数分别表示阶码和尾数
      • 溢出问题:存在上溢和下溢问题,也存在精度溢出问题
      • 数据分布:浮点数在数轴上的分布并不均匀,越远离原点,浮点数越稀疏
      • 浮点运算不满足结合律,小数+大数=大数
  • 真值与机器码比较如下:

表示形式 机器零 用途
真值 用”$ + $“和“$ - $”表示符号
原码 将符号位加上二进制数的绝对值 $ +0=000 $$ -0=100 $ 表示浮点数的尾码
反码 符号位同原码,真值为负数时数值位逐位取反 $ +0=000 $$ -0=111 $
补码 真值为负时反码末位加一得到补码 $ 0=000 $ 计算机中采用补码进行存储、表示和运算
移码 与补码的符号位相反,数值位相同 $ 0=100 $ 表示浮点数的阶码
  • 有关补码:

    • 补码又称为模2的补码,定点小数的模值为$ 2 $,定点整数的模值为$ 2^{n+1} $;
    • 补码的机器零唯一,多表示一个绝对值最大的负数,小数为$ -1 $,整数为$ -2^n $;
    • 反码法
      • 真值为负数时将原码数据位逐位取反后末位加一得到补码;
      • 补码符号位为1时将补码数据位逐位取反后末位加一得到原码;
    • 扫描法
      • 真值为负数时对原码数据位从右向左扫描,右起第一个1及其右边的数据位不变,其余各位取反。
      • 补码符号位为1时对原码数据位从右向左扫描,右起第一个1及其右边的数据位不变,其余各位取反。
  • 有关变形补码:

    • 又称为双符号补码,指采用两个符号位表示数据的符号,其余位与补码相同;
    • 当符号位为$ 00 $时表示正数,为$ 11 $时表示负数;
    • 在运算时,即使产生溢出,变形补码的最高位永远表示正确的符号位;
    • 符号位为$ 01 $表示运算出现正溢出,为$ 10 $时表示出现负溢出。

(2)定点数表示

  • 数据表示范围
最大正数 最小正数 最大负数 最小负数
定点小数 $ 1-2^{-n} $ $ 2^{-n} $ $ -2^{-n} $ $ -(1-2^{-n}) $,补码表示时为$ -1 $
定点整数 $ 2^n-1 $ $ 1 $ $ -1 $ $ -(2^n-1) $,补码表示时为$ -2^n $
  • 机器码计算公式
机器码 $ -2^n $ -1 $ 0\leq x\leq 2^n-1 $或$ 0\leq x\leq 1-2^{-n} $
原码 $ 2^n+|x| $ $ 2+|x| $ $ x $
反码 $ 2^{n+1}+x-1 $ $ 2+x-2^{-n} $ $ x $
补码 $ 2^{n+1}+x $ $ 2+x $ $ x $
移码 $ 2^n+x $ $ 2^n+x $(整数)

(3)浮点数表示

  • 表示规则

    • $ N=2^{E}\times M=2^E\times\pm(1.m) $
    • $ IEEE754 $规则下,浮点数由数符$ S $、阶码$ E $、尾数$ M $三部分组成,阶码采用移码表示,尾数采用原码表示;
    • 尾数为定点小数,小数点固定在最左侧,且隐藏小数点左边的$ 1 $,运算时还原为$ 1.M $形式;
    • 对于$ 32 $位浮点数($ float $)而言:$ S $为$ 1 $位,$ E $为$ 8 $位,移码偏移为$ 2^7-1 $,$ M $为$ 23 $位;
    • 对于$ 64 $位浮点数($ double $)而言:$ S $为$ 1 $位,$ E $为$ 11 $位,移码偏移为$ 2^{10}-1 $,$ M $为$ 52 $位。
  • 转换方法(以$ 32 $位浮点数$ float $为例)

    • 将十进制数$ N $转换为$ (-1)^s\times 2^e\times 1.M $,令$ E=e+01111111 $,保存$ S $、$ E $、$ M $;
    • 从$ 32 $位二进制串分离出$ S $、$ E $、$ M $,令$ e=E-01111111 $,代入$ (-1)^s\times 2^e\times 1.M $,按权展开。
  • 具体形式说明

    • 当阶码为$ 1\sim 254 $时,表示规格化数据;
    • 当阶码为$ 255 $时,表示非数或者$ \infty $;
    • 当阶码为$ 0 $时,表示机器零或者非规格化数。
符号位$ S $ 阶码$ E $ 尾数$ M $ 表示
$ 0/1 $ $ 255 $ 非零 $ NaN $
$ 0 $ $ 255 $ $ 0 $ $ +\infty $
$ 1 $ $ 255 $ $ 0 $ $ -\infty $
$ 0/1 $ $ 1\sim 254 $ $ M $ $ (-1)^s\times 2^{E-127}\times 1.M $
$ 0/1 $ 0 $ M $(非零) $ (-1)^s\times 2^{-127}\times 0.M $(非规格化数)
$ 0/1 $ $ 0 $ $ 0 $ $ +0/-0 $

2.非数值数据的表示

(1)字符表示

$ ASCII $码是国际通用的字符码,包含$ 128 $个字符,用**一个字节**表示,最高位为

(2)汉字编码

  • 汉字编码包含输入码、机内码和字形码,分别用于汉字的输入、汉字在计算机内的存储与处理、汉字的显示和打印;

  • 汉字机内码主要包括$ GB2312 $、$ GBK $、$ GB18030 $、$ Unicode $、$ B1G5 $等标准。

  • $ GB2312 $编码
    • 以$ 2 $个字节编码,最高位$ MSB $为$ 1 $;

    • 实际用$ 14 $位表示汉字,采用$ 94\times94 $矩阵表示,每一行为区号,每一列为位号,采用区号+位号的方式得到区位码。

    • $ GB2312 $机内码$ = $区位码$ +A0A0H $

3.数据信息的校验

(1)码距

  • 码距:两个编码对应位二进制位不同的个数。

    • 编码体系的码距:一个编码体系中所有合法编码的最小码距;
    • 码距越大,抗干扰能力、纠错能力越强,数据冗余越大,编码效率越低。
  • 校验码:原始数据$ + $校验数据

(2)奇偶校验

  • 编码规则:增加一位校验位,使得数据中的$ 1 $的个数保持奇偶性,利用编码中$ 1 $的个数的奇偶性进行校验;
  • 检错性能:奇偶校验码距为$ 2 $,只能检测奇数位错误;
  • 可采用交叉奇偶校验提高奇偶校验码的检错与纠错能力,交叉奇偶校验可以检测出所有的$ 3 $位以下错误以及大多数$ 4 $位错误。
  • 简单奇偶校验公式:
    • 偶校验位:$ P=D_{1}\oplus D_{2}\cdots\oplus D_{n} $
    • 偶校验检错位:$ G=D_{1}'\oplus D_{2}'\cdots\oplus D_{n}'\oplus P' $
    • 奇校验位:$ P=\overline{D_{1}\oplus D_{2}\cdots\oplus D_{n}} $
    • 奇校验检错位:$ G=\overline{D_{1}'\oplus D_{2}'\cdots\oplus D_{n}'\oplus P'} $
  • 交叉奇偶校验
    • 交叉奇偶校验将待编码的原始数据构造成行列矩阵式结构,同时进行行和列两个方向上的奇偶校验;
    • 使每个数据至少位于两个以上的校验组,当校验码中的某一位发生错误时,能在多个检错位中被指出,使得偶数位错误也可以被检查出

(3)海明校验

①海明编码概述
  • 海明编码又称为$ SEC $码;
  • $ SEC $码的码距为$ 3 $,只能纠一位错;
  • 扩展海明码的码距为$ 4 $,可以检测两位错同时纠正一位错;
  • 海明校验是本质上是一种多重奇偶校验既可以检错也可以纠错
  • 将原始数据信息分成若干偶奇偶校验组,所有数据信息位都会参与两个以上的校验组,每组设置一位偶校验位,所有校验组检错位的值构成检错码;
  • 检错码为零,表示数据高概率正确,检错码不为零,则检错码值就是一位错的位置,通过检错码的值就可以实现编码的纠错。
②校验位的位数
  • 设海明码$ N $位,其中数据位$ k $位,校验位$ r $位,有$ N=k+r $,称为$ (n,k) $码;

  • 海明码包含$ r $个偶校验组,$ r $个偶校验组的$ r $检错信息构成一个检错码$ G_r\cdots G_2G_1 $;

  • 为了使其能指出所有一位错,应有$ N=k+r\leq 2^r-1 $,这便是常见的$ ECC $纠错码。

③编码分组规则
  • 设有海明码$ H_n\cdots H_2H_1 $,原始数据$ D_k\cdots D_2D_1 $,校验位$ P_r\cdots P_2P_1 $;

  • 为满足编码分组要求,校验位$ P_i $放在$ H_{2^{i-1}} $位置上,剩余位置由数据位依次填充;

  • $ H_i $的数据被编号小于$ i $的若干个海明码位号之和等于$ i $的校验位所校验;

    如对于$ (11,7) $码,其编码分组如下:

$ H_i $ 1 2 3 4 5 6 7 8 9 10 11
映射 $ P_1 $ $ P_2 $ $ D_1 $ $ P_3 $ $ D_2 $ $ D_3 $ $ D_4 $ $ P_4 $ $ D_5 $ $ D_6 $ $ D_7 $
分组 $ 1 $ $ 2 $ $ 1,2 $ $ 4 $ $ 1,4 $ $ 2,4 $ $ 1,2,4 $ $ 8 $ $ 1,8 $ $ 2,8 $ $ 1,2,8 $
  • 由此根据偶校验规则和各个校验位所校验的数据位,可以得到校验位计算公式:

    $ P_1=D_1\oplus D_2\oplus D_4\oplus D_5\oplus D_7 $ $ P_2=D_1\oplus D_3\oplus D_4\oplus D_6\oplus D_7 $ $ P_3=D_2\oplus D_3\oplus D_4 $ $ P_4=D_5\oplus D_6\oplus D_7 $
  • 同样可以得到检错位:

    $ G_1=D_1'\oplus D_2'\oplus D_4'\oplus D_5'\oplus D_7'\oplus P_1' $ $ G_2=D_1'\oplus D_3'\oplus D_4'\oplus D_6'\oplus D_7'\oplus P_2' $ $ G_3=D_2'\oplus D_3'\oplus D_4'\oplus P_3' $ $ G_4=D_5'\oplus D_6'\oplus D_7'\oplus P_4' $
⑤检错与纠错
  • 当检错码$ G_r\cdots G_2G_1=0 $时,表示海明码大概率正确(当出错位数大于等于最小码距时,检错码也可以为$ 0 $);
  • $ SEC $码无法区分一位错和两位错;
  • 当出现一位错时,检错码的值对应出错的海明码位号,直接取反即可纠错。
⑥扩展海明码
  • 又称为$ SECDED $码,最小码距为4,可以区分一位错和两位错,并能纠一位错;
  • 在$ SEC $码的基础上添加总偶校验位$ P_{all}=(D_1\oplus D_2\cdots\oplus D_k)\oplus(P_1\oplus P_2\cdots\oplus P_k) $;
  • 总偶校验检错码$ G_{all}=P_{all}'\oplus(D_1'\oplus D_2'\cdots\oplus D_k')\oplus(P_1'\oplus P_2'\cdots\oplus P_k') $;
  • 检错方法:
    • $ G_{all}=0 $且$ G=0 $时,无错误发生;
    • $ G_{all}=1 $时,出现一位错,此时如果$ G=0 $,说明$ P_{all} $发生错误,数据部分正确,如果$ G\ne 0 $,说明数据部分发生一位错,可以根据检错码进行纠错;
    • $ G_{all}=0 $且$ G\ne 0 $时,出现两位错。

(4)CRC校验

①编码规则
  • 利用模$ 2 $运算增加若干位校验位,使得该编码能够被指定的多项式整除;
模$ 2 $运算 运算法则
加减法 没有进位和借位的二进制加法和减法运算
乘法 根据模$ 2 $加法运算求部分积之和,运算过程中不考虑进位
除法 根据模$ 2 $减法求部分余数

除法运算法则:

  • 部分余数首位为$ 1 $时,商上$ 1 $,按模$ 2 $运算减除数;
  • 部分余数首位为$ 0 $时,商上$ 0 $,减$ 0 $;
  • 部分余数小于除数的位数时,该余数即为最后余数;
②$ CRC $校验流程

设有$ CRC $码$ N $位,原始数据$ C_{k-1}\cdots C_1C_0 $共$ k $位,校验位$ P_{r-1}\cdots P_1P_0 $共$ r $位,则$ CRC $码为$ C_{k-1}\cdots C_1C_0P_{r-1}\cdots P_1P_0 $,称为$ (n,k) $码,满足$ N=k+r\leq 2^r-1 $。

③生成$ CRC $编码
  • 假设待发送的$ k $位二进制数据用信息多项式$ M(x) $表示:$ M(x)=C_{k-1}x^{k-1}+C_{k-2}x^{k-2}+\cdots+C_{1}x+C_{0} $;

  • 将$ M(x) $左移$ r $位,得到$ M(x)\cdot 2^r $,右侧空置的$ r $位用来放置校验位;

  • 选择一个$ r+1 $位的生成多项式$ G(x) $,其最高次幂为$ r $,最低次幂为$ 0 $;

  • 用$ M(x)\cdot 2^r $按照模$ 2 $的规则除以$ G(x) $,得到的余数$ R(x) $即为校验码;

    设商为$ Q(x) $,则有$ M(x)\cdot 2^r+R(x)=Q(x)G(x)+R(x)+R(X) $,根据模$ 2 $运算有$ R(x)+R(x)=0 $,因此$ M(x)\cdot 2^r+R(x)=Q(x)G(x) $,表明$ CRC $码一定能被$ G(x) $整除,这也是$ CRC $码的编码规则。

  • 生成多项式的规则

    • 最高位和最低位均为$ 1 $;
    • 当$ CRC $码任何一位发生错误时,都不能被生成多项式整除;
    • 不同位发生错误时,余数不同;
    • 对余数继续做模$ 2 $运算,应使余数循环。
④$ CRC $编码的循环特性
  • $ CRC $编码的非$ 0 $余数具有循环特性,即**将余数左移一位除以生成多项式,将得到下一个余数**,继续重复在新余数基础上左移一位除以生成多项式,多次循环后余数最终能循环为最开始的余数;
  • 例如对于$ (7,3) $码,设生成多项式为$ 11101 $,数据位为$ 3 $位,校验码为$ 4 $位,则余数表如下所示:
序号 编码 余数 余数值 出错位
1 $ 0000000 $ $ 0000 $ $ 0 $
2 $ 000000\pmb{\underline{1}} $ $ 0001 $ $ 1 $ $ 1 $
3 $ 00000\pmb{\underline{1}}0 $ $ 0010 $ $ 2 $ $ 2 $
4 $ 0000\pmb{\underline{1}}00 $ $ 0100 $ $ \pmb{\underline{4}} $ $ 3 $
5 $ 000\pmb{\underline{1}}000 $ $ 1000 $ $ 8 $ $ 4 $
6 $ 00\pmb{\underline{1}}0000 $ $ 1101 $ $ 13 $ $ 5 $
7 $ 0\pmb{\underline{1}}00000 $ $ 0111 $ $ 7 $ $ 6 $
8 $ \pmb{\underline{1}}000000 $ $ 1110 $ $ 14 $ $ 7 $
9 $ 00000\pmb{\underline{11}} $ $ 0011 $ $ 3 $ $ 1+2 $
10 $ \pmb{\underline{111}}0000 $ $ 0100 $ $ \pmb{\underline{4}} $ $ 5+6+7 $
⑤$ CRC $串行编解码
  • 触发器的初始状态均为$ 0 $;
  • 有异或门的位置为生成多项式为$ 1 $的位置,如图例得到$ G(x)=x^4+x+1 $,对应编码为$ 10011 $;
  • 当$ Q_4=0 $时,不够除,异或门相当于直通,下一个时钟时,数据左移一位;
  • 当$ Q_4=1 $时,够除,商上$ 1 $,进行$ Q_4Q_3Q_2Q_1Serial\_in\oplus G(x) $,结果左移。
⑥$ CRC $并行编解码
  • 模$ 2 $除法余数运算满足结合律:两数的余数异或等于两数异或后的余数

    $ (M(x)\%G(x))\oplus(N(x)\%G(x))=(M(x)\oplus N(x))\%G(x) $
  • 例如:设生成多项式$ G(x)=1011 $,原始数据为$ M(x)=1101 $,传输后的编码为$ 1101\underline{011} $,试求$ CRC $编码和传输后的余数:

    • 发送方编码:$ 1101\underline{000}=\pmb{1}000\underline{000}\oplus0\pmb{1}00\underline{000}\oplus000\pmb{1}\underline{000} $,则余数可以由三个数分别对$ G(x) $进行模$ 2 $运算后的余数异或得到;
    • 接收方解码:$ 1101\underline{011}=\pmb{1}000\underline{000}\oplus0\pmb{1}00\underline{000}\oplus000\pmb{1}\underline{000}\oplus0000\underline{011} $,同样可以得到对应的余数,其中$ 0000\underline{011} $对$ G(x) $进行模$ 2 $运算后的余数即为$ \underline{011} $;
  • 计算流程

    • 先计算$ 2^6 $、$ 2^5 $、$ 2^4 $、$ 2^3 $四个特殊常量的余数,再用余数的组合求解任意编码的余数。
    • 在解码时,将计算得到的余数与各个特殊常量的余数比较,若相等,则该特殊常量对应的位出错,纠错即可。