目录

计算机系统基础

目录
  • 组合电路:将逻辑门组合成一张网,所构成的计算块
  • 时序电路:逻辑门电路和反馈逻辑回路或器件(寄存器)组成

核心区别是:时序电路的输出不仅取决于当时的输入值,而且还与电路过去的状态有关;任意时刻的输出仅仅取决于该时刻的输入,与电路原来的状态无关。

单周期处理器:在一个时钟周期内完成单条指令:取指、译码、执行、访存、写回、更新PC

  • 1、取指:从内存中读取指令,加载至处理器
  • 2、译码:对取指令操作中得到的指令进行分析并译码,确定这条指令需要完成的操作,从而产生相的操作控制信号
  • 3、执行:进行相应的逻辑或算术运算
  • 4、访存:内存访问(非必要)
  • 5、写回:将指令结果写回至寄存器(非必要)
  • 6、更新PC:更新程序计数器(将程序计数器指向接下来要执行的指令的地址)

可以结合单周期处理器的不足进行回答,因为流水线就是单周期处理器的改进。

!!!!一定要点出并行!!!!!

  • 概念:流水线处理器将待执行的指令拆分成若干个阶段,每个阶段后添加寄存器,使每个阶段 可以在允许其独立使用的硬件电路上与其他阶段并行,以此提高系统的吞吐量。

  • 流水线是如何提高程序性能的?(或者说是流水线的特点)

    • 拆分指令,并且在每个阶段对应的硬件电路后添加寄存器
    • 以流水线的形式执行指令,充分利用硬件,减少了硬件的闲置时间(对比单周期处理器)
  • 不一致的划分:每个阶段的延迟不一致,导致系统吞吐量取决于最慢的阶段。
  • 流水线过深,收益反而下降:在组合逻辑被分成较小的块时,由寄存器更新引起的延迟成为了一个限制因素,降低了收益。

流水线冒险:邻近指令之间出现了某种关联后,下一条指令无法正确执行。

冒险的种类及解决方法:

  • 结构冒险:争用硬件(一个指令需要的硬件部件还在为之前的指令工作,而无法为这条指令提供服务)

    • 插入气泡(流水线气泡)
    • 设置相互独立的指令存储和数据存储
  • 数据冒险:存在数据依赖,数据还未产生

    • 插入气泡(流水线气泡或者空指令:气泡前的指令继续执行,气泡后的指令被阻塞。直到冒险条件不再满足)
    • 数据转发(将结果值直接从一个流水线阶段传到较早阶段,需要在硬件结构中增加一些额外的数据连接和控制逻辑)
    • 加载互锁(就是暂停加上数据转发,因为在转发将值转发到已经过去的时间中,所以要插入暂停周期)
    • 乱序执行(这个CSAPP中没有,但是应用广泛,可以了解。就是分析指令间的依赖,将无依赖关系的指令提前执行,代替暂停周期,避免时钟浪费)
  • 控制冒险:存在分支和跳转时可能发生,不确定下一条执行什么指令

    • 插入气泡
    • 分支预测策略:从不选择策略(60%),反向选择策略(40%),正向选择反向不选择(65%)
    • 条件跳转语句中,可以将每个条件的结果都进行计算,计算的开销小于流水线清空带来的代建

局限性和流水线冒险,根据上面的解释这两点

插入气泡技术可以解决所有的流水线冒险,但是每一个气泡都会浪费一个时钟周期,代价非常高。因此尽量少用插入气泡解决流水线冒险,选用其他效率高的方法。参考上面提到的。

  • 流水线并不能减少(而且一般是增加)单条指令的执行时间,但却能提高系统吞吐率。
  • 适当增加流水线的深度(段数)可以提高流水线的性能。(参考流水线的局限性-不一致的划分)
  • 流水线的深度(级数)受限于流水线的延迟和流水线的额外开销
  • 如果流水线中的指令相互独立 ,则可以充分发挥流水线的性能。但在实际中 ,指令间可能会是相互依赖,这会降低流水线的性能。

Intel处理器中的超线程技术的本质就是超标量技术。

在CPU中有一条以上的流水线,并且每时钟周期内可以完成一条以上的指令,这种设计就叫超标量技术。其实质是以时间换取空间。

处理器的执行阶段往往是处理器中最耗时的阶段,也就是说执行阶段往往是处理器的瓶颈。


  • 1、高级设计:选择合适的算法和数据结构。
  • 2、基本编码原则:避免限制优化的因素,使编译器产生高效的代码
    • 1)、消除连续的函数调用(消除低效率循环、减少过程调用):在可能时,将计算移到循环外。
    • 2)、消除不必要的内存引用:引入临时变量来保存中间结果,只有在最后的值计算出来时,才将结果存放到数组或全局变量中。
  • 3、低级优化:结构化代码以利用硬件功能。
    • 1)、展开循环,降低开销
    • 2)、提高指令级并行:通过多个累积变量和重新结合技术
    • 3)、用功能性的风格重写条件操作,使得编译采用数据传送。
  • 1、寄存器溢出:并行度超过了可用寄存器的数量,就会发生溢出。将某些临时值放到内存中,通常是在运行时堆栈上分配空间。
  • 2、分支预测和预测错误的惩罚:分支预测逻辑不能正确预测分支是否要跳转,这时条件分支可能会招致很大的预测错误处罚
    • 不要过分关心可预测分支
    • 书写适合用条件传送实现的代码

程序剖析运行版本的一个版本,其中插入了工具代码,以确定程序的各个部分需要多少时间.再根据Amdahl定律进行优化。

Amdahl定律的主要思想是当我们加快系统的一个部分的速度时,对系统整体性能的影响依赖于这个部分有多重要和速度提高了多少.

公式:S = 1 / ((1 - a) + a / k)

其中a为某部分需要时间的百分比,k为性能提升倍数.

主要观点是要想大幅度提高整个系统的速度,我们必须提高整个系统很大一部分的速度.


局部性通常有两种形式:时间局部性(temporal locality)和空间局部性(spatial locality).

  • 在一个具有良好时间局部性的程序中,被引用过一次的存储器位置很可能在不远的将来再被多次引用.
  • 在一个具有良好空间局部性的程序中,如果一个存储器位置被引用了一次,那么程序很可能在不远的将来引用附近的一个存储器位置.

memoryHierarchy.png

从高层往低层走,存储设备逐渐从小而快变得更大、更慢、更便宜,每层都会缓存来自较低一层的数据对象。被缓存的数据对象一般是处理器近期可能会需要的信息,这样可以有效提高读/写效率。

  • 寄存器
  • L1高速缓存
  • L2高速缓存
  • L3高速缓存
  • 主存
  • 本地二级存储(本地磁盘)
  • 远程二级存储(分布式文件系统,WEB服务器)

主要思想:上一层的存储器作为低一层的存储器的高速缓存。利用高速缓存的局部性原理:程序具有访问局部区域里的数据和代码的趋势。

地址空间是一个非负整数地址的有序集合.

如果地址空间中的整数是连续的,那么就是一个线性地址空间.

在一个带虚拟存储器的系统中,CPU从一个有2^n个地址的地址空间中生产虚拟地址,这个地址空间称为虚拟地址空间.

物理地址空间与系统中的物理存储器相对应.

虚拟存储器是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的完美交互,它为每个进程提供了一个大的、一致的、私有地址空间.

TLB(Translation Lookaside Buffer)叫做翻译后备缓冲器.

TLB是一个小的、虚拟寻址的缓存,其中每一行都保存着一个由PTE组成的块.