计算机组成原理
计算机组成原理
  计算机系统概述
    1.2计算机系统层次结构
      冯·诺依曼计算机
        “存储程序”工作方式
        运算器、存储器、控制器、输入输出设备五大部件组成
        指令与数据同等地位存储在存储器中
        指令与数据均用二进制表示
          指令周期不同阶段来区分
        指令由操作码和地址码组成
      三个级别语言
        机器语言
          计算机唯一可以直接识别和执行的语言
        汇编语言
        高级语言
      源文件到可执行文件过程
        预处理、编译、汇编、链接
    1.3计算机性能指标
      机器字长
      数据通路带宽
        数据总线一次能并行传送信息的位数
      主存容量
      运算速度
        吞吐量
        响应时间
        主频和时钟周期
        CPI：执行一条指令所需的时钟周期数
        CPU执行时间
        MIPS：每秒执行多少百万条指令
  数据的表示和运算
    2.1数制与编码
      不同进制之间的转换
      定点数的编码表示：字长为n+1位
        原码
          范围：-(2^n-1)<= x <=2^n-1
          0的表示有两种
        反码
          正数同原码
          负数为原码数值位全部取反
        补码
          正数同原码
          范围-2^n<= x <=2^n-1
          负数为原码数值位全部取反+1
          [-x]补=[x]补，x连同符号位全部取反加1
        移码
          只能表示整数
          在补码基础上符号位取反
          保持了数据原有的大小顺序
        无符号数
          只能表示正整数
          范围0<=x<=2^(n+1)-1
      C语言整数类型及强制类型转换
        数据存储都是补码方式
        有符号数与无符号数为直接转换，只是解析方式不同
        不同字长之间转换
          前补0还是符号位看原先的数字是什么
          无符号转换
            长变短直接截断
            短变长前补0
          有符号转换
            长变短直接截断
            短变长在前面补符号位
          无符号与有符号转换
            有符号转无符号
              前补符号位
            无符号转有符号
              前补0
    2.2运算方法和运算电路
      逻辑门电路
      带标志位的加法器
        有符号数益出判断：OF=Cn^Cn-1
          最高位进位与次高位进位异或
        无符号数溢出判断：CF=Cin^Cout
          最高位进位与最低位进位异或
          最低位进位代表减法
        符号标志Fn
        零标志ZF
      定点数移位运算
        逻辑移位
          左移右移都补0，移出的丢弃
        算术移位
          左移高位移出，低位补0。左移前后符号位不同则发生溢出
          右移低位移出，高位补符号位
      定点数加减运算
        符号位与数值位一起运算
        运算结果高位丢弃
        减法时，将减法变为加法
        溢出判断
          参加操作数的两个符号位相同，结果符号位不同
          采用双符号位，若双符号位数字不同则溢出
            为模4补码，只存储一个符号位
          根据 最高位进位 与 次高位进位 判断
      无符号数的加减运算
        无符号数只能表示正数，若减为负数则溢出
        减法变加法，全部取反末位+1
        加法进位为1则溢出
        减法变加法后，进位为0则溢出
      CF与OF标志位的判断
        由于数字都是补码存储，OF直接看真值是否超出范围即可。CF需要将补码转为机器数进行加减，若为负或最高进位为1则溢出。
      定点数的乘除运算
        无论是有符号数或无符号数，溢出都修改OF标志位
        溢出处理
          可以选择不处理
          选择处理：在乘法指令后面加溢出自陷指令
        控制逻辑
          控制循环次数、控制加法和移位操作
        无符号数乘法
          寄存器为逻辑右移
          高n位全为0表示无溢出
          需要进位标志
        有符号数乘法
          算术右移
          高n+1位全相同表示无溢出
          无需进位标志，需要辅助位
        无符号数除法
          统一为2n位的数除以n位数
          需要对被除数进行0扩展
          n位除以n位不会溢出，2n位除以n位可能会溢出
          n+1轮处理，第一轮特殊处理，若第一轮商一，则发生了溢出。
          会有除0异常和商溢出异常
    2.3浮点数的表示和运算
      IEEE754标准
        1+8+23，1+11+52
        移码=真值+偏置值，这里把移码当做无符号数看
        偏置值为127和1023
        数值位最高位1隐藏
        阶码全0与全1的解释
          全0
            数值位0则为0
            数值位不为0则为非规格化浮点数0.f*2^(-126)
          全1
            数值位为0则为无穷
            不为0则表示NaN
        浮点数加减法
          对阶
          尾数加减
          尾数规格化
          舍入
            就近舍入（默认） 最近，偶数优先
向零舍入 截断
向正无穷舍入 向上
向负无穷舍入 向下
          溢出判断
            阶码变为全1发生上溢
阶码变为全0发生下溢
      C语言浮点数类型
        int、float、double直接相互转换
      数据的大小端和对齐存储
        LSB最低有效字节，MSB最高有效字节
        大端存储
          优先存储高字节位
        小端存储
          优先存储低字节位
        边界对齐
          空间换时间思想
  存储系统
    3.1存储器概述
      存储器性能指标
        存储容量
        存取速度
          存取时间
          存取周期
            存取时间
            复原时间
          主存带宽
    3.2主存储器
      SRAM与DRAM
        SRAM(静态随机存储器)
          存取速度快、功耗大、价格贵、集成度低，一般用于高速缓冲存储器，非破坏性读出
        DRAM(动态随机存储器)
          集成度高、价格低、功耗小
          必须刷新和读后再生
          刷新(行为单位)
            集中刷新
            分散刷新
              没有死区，增大了存储周期
            异步刷新
          地址引脚复用技术
            行列地址分两次送，引脚数减一半
          DRAM行缓冲：SRAM实现，存储空间=列数*存储元位数
可以实现突发传输
          采用存储阵列
            行缓冲容量，列数*存储元的位数。用SRAM实现
        SDRAM(同步DRAM)与CPU数据交换同步于系统的时钟信号
      存储器结构
        地址线、数据线、读写控制线、片选线
      多模块存储器
        单体多字存储器
          一次读m个字
          总线宽度也为m个字
        多体并行存储器
          高位交叉编织
          低位交叉编织
            类似流水线
            分类
              轮流启动
              同时启动
    3.3主存储器与CPU的连接
      与CPU地址总线、数据总线、控制总线连接
      主存容量扩展
        位扩展法
          与数据线连接
        字扩展法
          各芯片的片选线通过译码器与CPU的高地址位连接
      地址线分配与片选
        线选法
          每一位表示一个芯片
        译码器片选法
    3.4外部存储器
      磁盘
        性能指标
          记录密度
          存储容量
          存取时间
            寻道时间
            旋转延迟时间
            传输时间
          数据传输速率
        地址
          柱面号·盘面号·扇区号
        磁盘阵列
          RAID0
            数据块交替存放在不同块
速度快，无冗余(条带化技术)
          RAID1
            数据备份，1:1
          RAID2
            纠正一位错，检测两位错
          RAID3与RAID4都用一个冗余盘存放校验位
3是位交叉，4是块交叉
          RAID5
            奇偶校验位分布在各个盘中
      固态硬盘
        页为单位读写，块为单位擦除
        闪存翻译层将逻辑地址转化为物理地址
        磨损均衡
          静态磨损均衡
            动态监测，效果更优
          动态磨损均衡
    3.5高速缓冲寄存器
      局部性原理
        时间局部性
        空间局部性
      Cache工作原理
        CPU与Cache交换以字为单位，Cache与主存以块为单位
      Cache与主存映射方式
        直接映射
          1个比较器
          标记+Cache行号+块内地址
        全相联映射
          n个比较器
          标记+块内地址
        组相联映射
          m路组相联需要m个比较器
          ⚠️将m个块组合为一组
          标记+组号+块内地址
        标记项
          有效位+脏位+替换控制位+标记位
        数据Cache总容量=（每行存储的数据+标记项）*行数
      Cache与主存的替换算法
        直接映射无需考虑替换算法
        随机算法
        FIFO先进先出
        LRU近期最少使用算法
          每个Cache行设置一个计数器
          替换位为log2(N)
        LFU最不经常使用算法
          将访问次数最少的换出
          每行设置一个计数器
      Cache一致性问题
        写命中时
          全写法（直写法）
            设置一个写缓冲
            要替换时可以直接覆盖
          回写法
            每个Cache行设置一个修改位
        写不命中
          写分配法
          非写分配法
    3.6虚拟存储器
      虚拟存储器缺页代价很大，采用全相联映射与回写法
      页式虚拟存储器
        页表
          有效位+脏位+引用位+物理页或磁盘地址
          存放虚拟地址到物理地址的映射
        快表TLB
          通常采用全相联映射或组相联映射
          TLB标记由虚拟页号或虚拟页号高位组成
      段式虚拟存储器
      段页式虚拟存储器
  指令系统
    4.1指令系统
      指令集体系结构
        指令格式，寻址方式等
        操作数类型，寻址方式，大小端方式
        程序可访问寄存器编号、个数、位数，
存储空间大小和编址方式
        指令执行过程的控制方式
(程序计数器与条件码等)
        与定义一条指令有关
      指令的基本格式
        分为操作码和地址码
        定长指令字与变长指令字
        零、一、二、三、四地址指令
        可扩展操作码指令格式
          短的操作码不能是长操作码的前缀
    4.2指令的寻址方式
      指令寻址
        顺序寻址
        跳跃寻址
      数据寻址
        操作码+寻址特征+形式地址A
        形式地址(A)不代表操作数的真实地址，
有效地址(EA)为操作数的真实地址
        隐含寻址
        立即(数)寻址
          补码表示
          执行速度最快
        直接寻址
        间接寻址
        寄存器寻址
          操作数在寄存器内
        寄存器间接寻址
        相对寻址
          基于当前PC偏移，补码表示
        基址寻址
          采用基址寄存器，面向操作系统
          方便程序浮动
        变址寻址
          采用变址寄存器，面向用户
          方便处理数组、循环问题
        堆栈寻址
    4.3程序的机器级表示
      汇编指令与机器指令一一对应
      源操作数->目的操作数
      汇编代码
        操作数不能从主存到主存
        mov
          数据传送
        push
          压入内存的栈
        pop
          出栈
        add/sub
          加减指令
        inc/dec
          自增自减指令
        imul
          有符号乘法、第一个操作数必须为寄存器
        idiv
          有符号除法
        and/or/xor
        not
        shl/shr
          左移右移
        jmp无条件跳转与je、jz、jne、jg、jge、jl、jle条件跳转
          修改指令指针IP的值，IP=PC
        cmp/test
          cmp比较，相当于sub设置状态字中的状态码
        call/ret
          call将下一条指令地址入栈。ret则返回栈顶地址
          实现函数调用
    4.4CISC与RISC
      复杂指令系统（CISC）
        指令执行的操作多，指令编码更长
        指令复杂庞大
        指令长度不固定
        指令执行时间与频率相差大
        通用寄存器数量少
        难以优化
        大多数微程序控制
        流水线一定方式可以实现
      精简指令系统（RISC）
        指令简单
        指令定长
        只有LOAD与STORE可以访存，寻址方式种类少
        指令绝大多数在一个周期内完成
        寄存器数量多
        容易优化、大多数为组合逻辑控制
        采用流水线技术
  中央处理器
    5.1CPU功能与基本结构
      由运算器和控制器构成
    5.2指令执行过程
      指令周期
        取指
        间指
          取操作数有效地址
        执行
        中断
          中断周期是中断响应
        每个操作都是一个机器周期
      指令周期数据流⚠️
        指令周期每个阶段数据流向和微操作
      指令执行方案
        单周期处理器
          每个指令执行时间相同，指令周期取决于最长的指令执行时间，CPI=1，指令之间串行执行，控制简单
          每个部件使用一次，控制信号不变，搭配多总线使用
        多周期处理器
          指令之间串行，需要几个周期就分配几个周期，CPI>1
        流水线处理器
          指令之间并行，理想情况下CPI=1
    5.3数据通路的基本功能和基本结构
      组合逻辑元件（操作元件）
      时序逻辑元件（状态元件）
        可以存储信号
      CPU内部单总线
        较多冲突现象
        单周期CPU不能使用
      CPU多总线
      CPU专用数据通路
        速度快，硬件量大
    5.4控制器的功能与工作原理
      硬布线控制器
        复杂，速度快，修改难
      微程序控制器
        采用存储逻辑实现
        微程序存储在控制存储器中
          控制存储器在CPU内部，用ROM实现
        微程序控制器
          微地址形成部件
          微指令地址寄存器
          控制存储器
          微指令寄存器
            位数等于微指令字长
          工作过程
            取指令、间址、中断为公共操作，
只有一个，执行指令有多个。
          微程序个数为机器指令数加上公共操作数
        微指令编码方式
          操作控制+下地址
          直接编码方式
            微指令控制字段中每一位代表一个微命令，无需译码
            简单，速度快，并行性好。指令过长
          字段直接编码
            互斥命令放在一个字段中，相容的放在不同字段
            n bit表示2^n的命令，000表示无命令
        微指令地址形成方式
          断定方式：微指令下地址直接给出
          机器指令操作码给出
          增量法：upc=upc+1
          由各种标志(类似PSW)给出下条微指令分支转移地址
          硬件直接产生，类似通电
          所以控制器信号来源有PSW和IR，包括节拍发生器
        微指令格式
          水平型
            可以执行多个并行操作微命令
            微程序短，速度快。微指令长
            操作控制+顺序控制
          垂直型
            只能定义并执行一种微命令
            执行速度慢，微程序长。指令短
            微操作码+目的地址+源地址
    5.6指令流水线
      时间上并行称为指令流水线
空间上并行称为超标量处理机
      五段式流水线
        取指IF
          从主存或Cache取指令
          Cache缺失会导致流水线阻塞
        译码/读寄存器ID
          从寄存器取操作数
          生成控制信号，之后不变
        执行/计算地址EX
        访存MEM
          对存储器读/写
        写回WB
          写回寄存器堆
      流水线要求
        指令长度尽量一致
        只有LOAD/STORE可以访问存储器
        数据与指令在存储器中“边界对齐”存储
      基本实现
        以速度最慢的指令为时钟周期
        每个流水段后面加一个流水段寄存器
      冒险与处理
        结构冒险(资源冲突)
          同一时刻争用同一个部件
          解决办法
            暂停几个时钟周期
            设置多个独立部件
        数据冒险
          (写后读)后面指令需要前面的结果
          解决办法
            指令暂停一个或多个时钟周期
              插入空操作
              硬件阻塞
            采用旁路转发技术
              无法解决load-use问题
            编译优化调整指令执行顺序
        控制冒险
          PC值的跳转
          解决办法
            插入空指令
            对分支进行预测
              静态预测与动态预测
      性能指标
        吞吐率
        加速比
          不使用流水线与使用流水线时间比
      高级流水线技术
        超标量流水线技术(动态发射技术)
          每个时钟周期发射多条指令
          需要多个功能部件，空间上并行 CPI<1
        超长指令字技术(动态多发射)
        超流水线技术
          将流水段再划分，有更多流水段，理想情况CPI=1，主频变高
    5.7多处理器的基本概念
      SISD、SIMD、MIMD
        SIMD是数据级并行
        MIMD是线程级及以上的并行
      硬件多线程
        细粒度多线程
          每个时钟周期切换进程
          切换代价低
        粗粒度多线程
          阻塞才切换进程
          切换代价高，需要重载流水线
        同时多线程SMT
          指令级、线程级并行
        指令级并行，线程级不并行
      多核处理器的基本概念
        共享一个物理内存地址
      共享内存多处理器(SMP)的基本概念
  总线
    6.1总线概述
      功能分类
        是CPU系统内的总线
        片内总线
        系统总线
          数据总线
            双向传输
          地址总线
            单向传输
          控制总线
            传输各种命令
        I/O总线
        通信总线
      控制方式分类
        同步总线
          有统一的时钟
        异步总线
          没有统一的时钟
      传输方式分类
        串行总线
        并行总线
      总线结构
        单总线
        双总线
        三总线
          任意时刻只有只能使用一种总线
      总线性能指标
        总线时钟周期
          机器的时钟周期
        总线时钟频率
        总线传输周期
          一次总线操作所用的时间
          包括申请阶段、寻址阶段、传输阶段、结束阶段
          若干总线时钟周期构成
        总线工作频率
          1s内传送几次数据
        总线宽度
          通常为数据总线宽度
        总线带宽
          注意最大数据传输速率和有效数据传输速率
          工作频率*总线宽度
          单位1k=1000
        总线复用
          一根信号线在不同时间传输不同的信息
地址信息通过数据线来传输
        信号线数
    6.2总线事务与定时
      同步定时方式
        统一的时钟信号协调
        传输速度快
      异步定时
        没有统一的时钟，双方相互制约“握手”信号控制
        不互锁方式
        半互锁方式
        全互锁方式
        异步串行通信
          需要开始位和停止位作为字符开始与结束的标志
      半同步定时
        增设Wait信号线，在系统时钟控制下工作，每个时钟到来采样Wait信号
      分离式定时
        不存在空闲等待时间，不传送数据时总线给其他设备使用
  输入/输出系统
    7.2I/O接口(I/O控制器)
      主机和外设的交接界面
      I/O的功能
        I/O设备向CPU发出中断请求信号，CPU也会有相应的信号反馈
      I/O接口的结构
        数据线
        地址线
        控制线
      I/O端口的编址
        独立编址
          需要专门的I/O指令
        统一编址
    7.3I/O方式
      程序查询方式
        CPU周期性地或持续地查询设备状态
        独占查询
          CPU花费100%时间查询
        持续查询
          CPU周期性地查询接口状态
          查询时间间隔与设备传输速率有关
      程序中断查询
        中断流程
          中断源请求
            设置中断请求标记触发器，状态为1时表示该中断源有请求
          中断响应判优
            响应中断请求的先后顺序
            硬件排队器
          判断CPU是否能响应该中断(关中断状态等)
            异常和非屏蔽中断不受关中断影响
          中断响应过程
            关中断
            保存断点
              PC或PSW等
            引出中断服务程序
              硬件向量法
              软件向量法
            保护现场和屏蔽字
              通用寄存器等
            开中断
            执行中断服务程序
            关中断
            恢复现场和屏蔽字
            开中断
            中断返回
            中断隐指令(硬件实现)
中断响应过程
          多重中断与中断屏蔽字
            中断处理优先级
              多重中断实际优先处理次序
              设置中断屏蔽字寄存器，用来屏蔽该中断
      DMA方式
        DMA控制器
          接受外设的DMA请求，向CPU发出总线请求
          拥有控制系统总线能力
        DMA传送方式(和CPU访存冲突)
          停止CPU访问
          DMA与CPU交替访问
            将CPU工作周期分为两个时间片，CPU和DMA交替使用
            不需要申请、建立、归还总线使用权
          周期挪用
            I/O设备访存优先级高于CPU
            I/O设备挪用一个存取周期，传送一个数据字后释放总线
            CPU访存时等待存取周期结束后让给I/O设备
        DMA只在预处理和DMA结束时才介入
        DMA请求的响应可以发生在任意一个机器周期结束时
  微程序例子
  数据通路数据流动
    注意括号表示对应的内容
    注意PC程序计数器每取完指令要+1
    每一个时钟周期可能对应多个微操作和微命令
  DMA过程
    外设向DMA控制器发出请求
DMA控制器向CPU发出总线请求
      需要操作系统参与
    DMA数据传输
      完全由DMA硬件传输
    DMA结束
      发出DMA中断，需要操作系统参与
  CPU由数据通路与控制部件组成
    数据通路中不包含控制部件
  子程序调用(P调用Q)
    P将入口参数放到Q能访问到的地方
    P将返回地址放到特定的地方，然后转移到Q
    Q保存P的现场
    执行Q
    Q恢复P的现场，将返回结果放到P能访问到的地方
    Q取回返回指令，将控制转移到Q
  查找页表和段表的异常
    得到物理地址之前进行
    缺页
    地址越界，偏移量超出段长
    访问越权
  截断可能会有运算结果错误
不会带来任何异常
  流水段寄存器
    存放后面阶段要用的数据信息
    传递前面送来后面要用到的所有控制信号
  突发传输时传送地址也需要一个时钟周期
  特殊状态为0时直接得出结果
  特殊状态为被除数为0或小于除数，直接得出结果
  DDR技术
    使得主存在一个时钟周期内可以传两次数据，
上升沿与下降沿各传一次数据
  char类型为无符号数
  扩大了寻址范围
只有符号位相同的加法运算才会产生溢出。
例如 正+正 或 负+负
运算结果左规可能要多次，右规只要一次
每个芯片自己内部自动刷新，对CPU透明，一次刷一行。
注意存储矩阵时的刷新
每个芯片有独立的读写电路和数据、地址寄存器
因为存储器读取之后需要时间恢复，读完后要过一段时间才可以继续读。
Cache映射采用的是物理地址，TLB采用的是逻辑地址（虚拟地址）
硬件与系统软件共同管理下工作
用虚拟地址判断页表级数
高速缓冲器组成。访问缺页后，将页面调入主存时还要再次访问TLB
指令中会设置寻址特征字段来描述是哪种寻址方式。
操作数会存在寄存器，存储单元或I/O端口中
寻址特征：用来判断哪种寻址方式
指令周期有多个机器周期，机器周期有多个时钟周期
一条指令对应一个微程序
一个微程序对应多条微指令
一个微指令对应多个微操作
一个微操作对应一个微命令
微操作强调做什么
微命令强调控制信号
并行能力强，效率高，灵活性好。但难以掌握
LLC为低级Cache。多核芯片不会共享高级Cache，会共享LLC和主存。
串行不一定比并行慢
比异步定时简单
（1）进行地址译码和设备选择。使主机能和指定外设交换信息。
（2）实现主机和外设的通信联络控制。协调不同工作速度的主机和外设交换信息。
（3）实现数据缓冲。由于速度不一致，用于暂存数据。
（4）信号格式的转换。数据、电平等可能都存在差异。
（5）传送控制命令和状态信息。
（6）差错控制
I/O指令访问I/O端口
读写数据、状态信息、控制信息、中断类型号
程序不会进入阻塞态
适合低速设备，每个指令周期末尾查询是否有中断请求
每个中断源都有唯一的一个类型号。
向量地址：中断向量的地址
中断向量：中断服务程序入口地址
中断向量表：集中存放中断向量的存储区
1表示被屏蔽，0表示当前可被中断
适合高速设备，传输数据时完全由硬件实现
指令：ADD R1, R2
↓ 分解为微程序：
微指令1（取指令）：
微命令： PC_out, MemRead, IR_in
微操作： PC值 → 地址总线 → 读内存 → 指令存入IR
微指令2（解码）：
微命令： Decode
微操作： 解析IR中的操作码和寄存器编号
微指令3（取操作数）：
微命令： R2_out, ALUSrcA; R1_out, ALUSrcB
微操作： R2值 → ALU输入A, R1值 → ALU输入B
微指令4（执行加法）：
微命令： ALU_Add, ALU_out
微操作： ALU计算A+B → 结果暂存
微指令5（写回）：
微命令： Result_in, RegWrite
微操作： 结果写入R1