-
目录
-
计算机的高速缓存
- 之前也提到过
- 高速缓存的目的是为了解决CPU与主存的速度不匹配的问题
-
高速缓存的工作原理
- 一个字有32位(针对高速缓存)
- 字:是指存放在一个存储单元中的二进制代码组合
- 字块:存储在连续的存储单元中而被看作是一个单元的一组字
- 若一个字块共B个字
- 主存共M个字块
- 主存总字数=B*M
- 主存总容量(bits)=B*M*32
- 字的地址包含2个部分
- 前m位指定字块的地址
- 后b位指定字在字块中的地址
- 缓存与主存的关系
- 缓存的数据来自主存
- 存储的逻辑结构类似
- 缓存的容量较小
- 缓存的速度更快
- CPU需要缓存有2种情况
- CPU需要的数据在缓存里
- CPU需要的数据不在缓存里
- 不在缓存的数据需要去主存拿
- 高速缓存的速度是比主存快许多的,如果CPU需要的数据要去主存内拿的话,那无疑是大大降低了CPU的效率,所以需要CPU尽可能去高速缓存内取数据
- 量化CPU从高速缓存取数据的成功率,这就是缓存命中率
- 命中率是衡量缓存的重要性能指标
- 理论上CPU每次都能从高速缓存取数据的时候,命中率为1
- 命中率=访问缓存次数/(访问主存次数+访问缓存次数)
- 还有一个访问效率也是衡量缓存的重要性能指标
- 访问缓存-主存系统平均时间=命中率×访问缓存时间+(1-命中率)×访问主存时间
- 访问效率=访问缓存时间/访问缓存-主存系统平均时间
-
高速缓存的替换策略
- 为了让CPU运行效率越高,命中率就要越高,就需要性能良好的缓存替换策略
- 高速缓存的替换时机
- 发生在目前层次结构里CPU所需要的数据不在缓存里时,这时候就需要从主存里载入所需要的数据,把数据取出来,替换到高速缓存里去
- 替换策略
- 随机算法
- 先进先出算法(FIFO)
- 最不经常使用算法(LFU)
- 最近最少使用算法(LRU)
- 随机算法
- 非常简单,每一次发生替换时随机选取一个高速缓存里面的位置,然后把相关的内容给替换掉
- 先进先出算法(FIFO)
- 把高速缓存看做是一个先进先出的队列
- 发生替换淘汰时,优先替换最先进入队列的字块
- 最不经常使用算法(LFU)
- 发生替换淘汰时,优先淘汰最不经常使用的字块
- 为了记录哪一个字块是最不经常使用的,需要额外的空间记录字块的使用频率
- 最近最少使用算法(LRU)
- 优先淘汰一段时间内没有使用的字块
- 有多种实现方法,一般使用双向链表
- 把当前访问节点置于链表前面(保证链表头部节点是最近使用的)
-
计算机的指令系统
-
机器指令的形式
- 机器指令主要由2部分组成:操作码,地址码
- 组成的前面的部分是操作码字段,后面的部分是地址码字段
- 操作码
- 操作码指明指令所要完成的操作
- 操作码的位数反映了机器的操作种类
- 例:如果操作码有8位,那么它最多有2的8次方=256种操作
- 地址码
- 因为机器指令本质上还是对数据进行操作
- 地址码直接给出操作数或者操作数的地址
- 使得CPU根据这个数据或者数据的地址来进行相关的运算
- 对于地址码的不同分三地址指令,二地址指令和一地址码指令
- 三地址指令的意思是地址码字段有3个地址
- 二地址指令的意思是地址码字段有2个地址
- 一地址指令的意思是地址码字段有1个地址
- 零地址指令
- 在机器指令中无地址码
- 一般是空操作,停机操作,中断返回操作等
-
机器指令的操作类型
- 数据传输类型
- 可以发生在寄存器之间,寄存器与存储单元,存储单元之间传送
- 包括数据读写,交换地址数据,清零置一等操作
- 算术逻辑操作类型
- 操作数之间的加减乘除运算
- 操作数的与或非等逻辑位运算
- 移位操作类型
- 数据左移(乘2),数据右移(除2)
- 完成数据在算术逻辑单元的必要操作
- 控制指令类型
- 主要是等待指令,停机指令,空操作指令,中断指令等
-
机器指令的寻址方式
- 指令寻址
- 主要有2种寻址方法:顺序寻址,跳跃寻址
- 数据寻址
- 主要有3种寻址方法:立即寻址,直接寻址,间接寻址
- 立即寻址
- 指令直接获得操作数
- 无需访问存储器
- 直接寻址
- 直接给出操作数在主存的地址
- 寻找操作数简单,无需计算数据地址
- 间接寻址
- 指令地址码给出的是操作数地址的地址
- 需要访问一次或者多次主存来获取操作数
-
计算机的控制器
- 控制器是协调和控制计算机运行的
- 控制器主要有以下部分组成
- 1.程序计数器
- 2.时序发生器
- 3.指令译码器
- 4.各种寄存器
- 指令寄存器
- 主存地址寄存器
- 主存数据寄存器
- 通用寄存器
- 5.总线
- 程序计数器
- 用来存储下一条指令的地址
- 循环从程序计数器中拿出指令
- 当指令被拿出时,指向下一条指令
- 程序计数器主要是用于提供给其它控制单元当前需要执行的指令的地址
- 时序发生器
- 属于电气工程领域,用于发送时序脉冲
- CPU依据不同的时序脉冲有节奏的进行工作
- 指令译码器
- 计算机指令由操作码和地址码组成
- 翻译操作码对应的操作以及控制传输地址码对应的数据
- 指令寄存器
- 从主存或高速缓存取计算机指令
- 使得CPU可以高效运转的重要部件之一
- 主存地址寄存器
- 保存当前CPU正要访问的内存单元的地址
- 使用地址总线与主存进行相关通信
- 主存数据寄存器
- 保存当前CPU正要读或写的主存数据
- 使用数据总线与主存进行相关通信
- 通用寄存器
- 用于暂时存放或传送数据或指令
- 可保存ALU(算术逻辑单元)的运算中间结果
- 容量比一般专用寄存器要大
-
计算机的运算器
- 运算器是用来进行数据运算加工的
- 组成:
- 1.数据缓冲器
- 2.ALU(算术逻辑单元)
- 3.通用寄存器
- 4.状态字寄存器
- 5.总线
- 数据缓冲器
- 分为输入缓冲和输出缓冲
- 输入缓冲暂时存放外设送过来的数据
- 如果ALU正在运算的话,那么下一个需要运算的数据就保存在这个缓冲内
- 输出缓冲暂时存放送往外设的数据
- 当数据运算完,从ALU输出时,是保存在输出缓冲里的,等待控制器下一步的命令,然后把它送到相应的位置
- ALU(算术逻辑单元)
- 能完成常见的位运算(左右移,与或非等)
- 算术运算(加减乘除等)
- A和B是输入,F是输出,K是若干个控制线
- 状态字寄存器
- 主要是用于存放运算状态(条件码,进位,溢出,结果正负等)
- 也能存放运算控制信息(调试跟踪标记位,允许中断位等)
-
计算机指令的执行过程
-
指令执行过程
- 主要有3个步骤:
- 取指令->分析指令->执行指令
- 都是由片内总线相连
过程:
- 1.出现指令时,首先会发生数据缓存和指令缓存,也就是把相关的数据和指令缓存起来放在CPU的高速缓存内
- 2.缓存之后就能进行指令的执行了,对于指令的执行,首先是程序计数器把当前需要执行的指令缓存起来
- 3.程序计数器只知道指令的地址,不知道指令的具体内容
- 4.这时就需要通过片内总线来到指令缓存把对应的操作码和地址码拿出来
- 5.然后指令寄存器就会缓存起这个指令的具体内容,包括操作码和地址码
- 6.指令寄存器是不知道指令的具体内容的
- 7.还需要把这条指令发送到指令译码器里去
- 8.还需要注意:发送之后,程序计数器要加1,移向下一条需要执行的指令
- 9.指令译码器拿到指令后就会进行相关的译码
- 10.译码完成后,就理解指令的具体内容了,就可以发出控制信号,控制信号就可以通过片内总线来到运算器内
- 11.运算器拿到控制信号后,就明白自己需要做什么工作了
- 12.首先把这个R0加载到ALU里面去,接着把R0的数据送出来,送到数据总线上,接着来到数据缓存器,把R0的数据覆盖到R1里面去,这时候就完成了这条指令的操作
- 13.完成这条指令后,CPU又会执行下一条指令
- 指令执行过程中,取指令和分析指令主要是控制器在工作,执行指令主要是运算器在工作
- 也就是说控制器和运算器不能同时工作
- 导致CPU的综合利用率并不高
-
CPU的流水线设计
- 类似工厂的装配线
- 工厂的装配线使得多个产品可以同时被加工
- 在同一个时刻,不同产品均位于不同的加工阶段
- 把这个思想应用到计算机里就的CPU的流水线设计
- 没有应用流水线设计与应用流水线设计的过程的区别
- 串行执行m条指令:
- T=3t×m
- 流水线执行m条指令:
- T=t×(m+2)